Disegna le ombre degli edifici


23

Ingresso:

1
      X                                
      X                                
      X                                
      X      XX    XXXXXX     X X X    
      X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    
XXX   X      XX    XXXXXX     X X X    

Produzione:

      X.                               
      X..                              
      X...                             
      X....  XX.   XXXXXX.    X.X.X.   
      X..... XX..  XXXXXX..   X.X.X..  
XXX.  X......XX... XXXXXX...  X.X.X... 
XXX.. X......XX....XXXXXX.... X.X.X....

Ingresso:

2
         XX
         XX
         XX
         XX
         XX
     XX  XX
     XX  XX
     XX  XX
     XX  XX

Produzione:

        .XX
       ..XX
      ...XX
     ....XX
    .....XX
   ..XX..XX
  ...XX..XX
 ....XX..XX
.....XX..XX

Specifica:

  • Devi prendere come input
    1. Una bandiera che indica se la luce proviene dall'angolo in alto a sinistra o in alto a destra. Questo può essere 1o 2, -1o 1, 0o 65536, o qualunque cosa sia conveniente per te, a condizione che entrambe le bandiere siano numeri interi.
    2. Righe composte da uno Xo tutti i caratteri della stessa lunghezza (ovvero imbottiti con )
      • Tutti gli Xs saranno nell'ultima riga o avranno un Xsotto di essi (il che significa che nessun edificio galleggiante)
  • È necessario produrre le righe (edifici) con le ombre aggiunte. Questo viene fatto con la seguente procedura:
    • Se la luce proviene dall'angolo in alto a sinistra, disegna un triangolo rettangolo di .altezza s con la stessa altezza e larghezza dell'altezza dell'edificio, partendo da uno spazio oltre il bordo destro e procedendo verso destra.
    • Altrimenti, se proviene dall'angolo in alto a destra, fai la stessa cosa ma inizia da uno spazio oltre il suo bordo sinistro e punta a sinistra.
    • Ricorda, non alterare Xs cambiandole in .s; lasciarli così come sono.
    • Ci sarà sempre "spazio" per le tue ombre, cioè se alla fine c'è un edificio alto 3 spazi ci saranno almeno 3 spazi di riempimento.
  • Questo è , quindi vincerà il codice più breve in byte!

1
Posso usare {}e {-1*}come valori flag?
John Dvorak,

@Jan Sì, sì, puoi. Potresti persino usare potatoe while(1){}. Come citato nella domanda, "qualunque cosa sia conveniente".
Maniglia della porta

2
:( Stavo per risolvere questo problema con regex (basato su .NET), ma penso di aver trovato un bug in Regex.Replacecui non riesco a aggirare ... ho due problemi ora?
Martin Ender,

3
@Doorknob Qualcuno abuserà di questa regola solo per avere l'intero codice nell'input.
Aprıʇǝɥʇuʎs

Risposte:


6

GolfScript, 67 caratteri

n%(~:S\zip\%.0=\{.' '3$);+{{\(@[\].~<=}%+}:M~'X'/'.'*@@M}%S%zip\;n*

1 / -1 per le ombre che vanno a destra / a sinistra. Esegui l'esempio online :

      X.                               
      X..                              
      X...                             
      X....  XX.   XXXXXX.    X.X.X.   
      X..... XX..  XXXXXX..   X.X.X..  
XXX.  X......XX... XXXXXX...  X.X.X... 
XXX.. X......XX....XXXXXX.... X.X.X....

11

Perl - 85

BEGIN{$d=-<>}$d?s/X /X./g:s/ X/.X/g;s/ /substr($p,$+[0]+$d,1)eq'.'?'.':$&/ge;$p=$_;

EDIT: ho completamente dimenticato la -pbandiera con cui deve essere eseguito. Aggiunto 2 al conteggio dei caratteri.
Il flag specificato nella prima riga è 0per le ombre che vanno a sinistra e 2per le ombre che vanno a destra.


4

Python 3 - 233

Bene, è risultato più lungo del previsto ...

1 per le ombre che vanno a destra, -1 per le ombre che vanno a sinistra.

d,x=int(input()),[1]
while x[-1]:x+=[input()]
x,o,l,h=list(zip(*x[1:-1]))[::d],[],0,len(x)-1
for i in x:o+=[''.join(i[:len(i)-l])+''.join(i[len(i)-l:]).replace(' ','.')];l=max(l-1,i.count('X'))
for i in zip(*o[::d]):print(''.join(i))

EDIT: Non ho visto l'imbottitura su entrambi i lati nelle regole. Ehehe. ^^'


3

JavaScript - 14

eval(prompt())

La bandiera sulla prima riga è for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));per le ombre rivolte a sinistra o for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));per le ombre a destra.

Questo potrebbe abusare della regola "qualunque cosa ti sia conveniente" per la bandiera: P


Modifica: senza abuso (127):

c=prompt();for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+c]=='.'||p[b]=='.'||l[b+c]=='X'?'.':a}));

La bandiera per questo è 1o-1


Bene, ho fissato le regole. :-P
Maniglia della porta

Sì, non è divertente :-( Questo rende "entrambe le bandiere sono numeri interi" in conflitto con il tuo commento "Potresti persino usare potato...", a meno che non potatosia un numero intero. :-P
Zaq

c=+prompt()altrimenti b+csi concatenerà come una stringa.
nderscore,

Ottimizzato alcune cose e ridotto a 119: for(c=p=+(P=prompt)(d='.');l=P();)console.log(p=l.replace(/ /g,function(a,b){return p[b]==d|p[b+=c]==d|l[b]=='X'?d:a})) (demo)
nderscore

Salvare un altro byte sulla conversione cin un numero sottraendo invece. b-co b-=cnel mio codice sopra. (demo)
nderscore,

1

Python 2.7 - 229

p,s,M,J,L=input(),__import__('sys').stdin.readlines(),map,''.join,len
n,s,r,f=L(s),M(str.strip,M(J,zip(*s[::-1]))),0,[]
for l in s[::p]:f,r=f+[(l+'.'*(r-L(l))+' '*n)[:n]],max(r-1,L(l))
print'\n'.join(M(J,zip(*f[::p])[::-1]))

Versione Ungolfed

def shadow(st, pos):
    _len = len(st)
    st = map(str.strip, map(''.join,zip(*st[::-1])))
    prev = 0
    res = []
    for line in st[::[1,-1][pos-1]]:
        res +=[(line+'.'*(prev-len(line)) + ' '*_len)[:_len]]
        prev = max(prev - 1, len(line))
    return '\n'.join(map(''.join,zip(*res[::[1,-1][pos-1]])[::-1]))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.