Desenhe as sombras dos edifícios

23

Entrada:

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    

Saída:

      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....

Entrada:

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

Saída:

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

Especificação:

  • Você deve tomar como entrada
    1. Uma bandeira indicando se a luz vem do canto superior esquerdo ou do canto superior direito. Pode ser 1ou 2, -1ou 1, 0ou 65536, ou o que for conveniente para você, desde que os dois sinalizadores sejam inteiros.
    2. Linhas compostas por um Xou com o mesmo comprimento em caracteres (ou seja, preenchidas com )
      • Todos os Xs estarão na última linha ou terão um Xsob eles (o que significa que não há edifícios flutuantes)
  • Você deve gerar as linhas (edifícios) com sombras adicionadas. Isso é feito com o seguinte procedimento:
    • Se a luz estiver vindo do canto superior esquerdo, desenhe um triângulo retângulo de .s com a mesma altura e largura que a altura do edifício, começando de um espaço além da borda direita e indo para a direita.
    • Caso contrário, se for do canto superior direito, faça o mesmo, mas comece de um espaço além da borda esquerda e apontando para a esquerda.
    • Lembre-se, não altere Xs alterando-os para .s; deixe-os como estão.
    • Sempre haverá "espaço" para as suas sombras, ou seja, se houver um edifício alto de três espaços no final, haverá pelo menos três espaços de preenchimento após ele.
  • Isso é , então o código mais curto em bytes vencerá!
Maçaneta da porta
fonte
1
Posso usar {}e {-1*}como valores de sinalizador?
John Dvorak
@ Jan Sim, sim, você pode. Você pode até usar potatoe while(1){}. Como citado na pergunta, "o que for conveniente".
Maçaneta da porta
2
:( Eu estava indo para resolver isso de regex (.NET com sabor), mas eu acho que encontrei um bug no Regex.Replaceque eu não posso resolver ... eu tenho dois problemas agora?
Martin Ender
3
@Doorknob Alguém vai abusar dessa regra para ter apenas o código inteiro na entrada.
precisa saber é o seguinte
2
@ Synthetica Essa é uma das "brechas padrão".
Maçaneta

Respostas:

6

GolfScript, 67 caracteres

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

1 / -1 para sombras indo para a direita / esquerda. Execute o exemplo 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....
Howard
fonte
11

Perl - 85

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

Edição: Eu esqueci totalmente sobre a -pbandeira que precisa ser executado. Adicionado 2 à contagem de caracteres.
O sinalizador especificado na primeira linha é 0para sombras indo para a esquerda e 2para sombras indo para a direita.

mniip
fonte
4

Python 3-233

Bem, isso acabou mais do que o esperado ...

1 para sombras indo para a direita, -1 para sombras indo para a esquerda.

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: Não viu o preenchimento de ambos os lados nas regras. Ehehe. ^^ '

cjfaure
fonte
3

JavaScript - 14

eval(prompt())

A bandeira na primeira linha é for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b+1]=='.'||p[b]=='.'||l[b+1]=='X'?'.':a}));para sombras voltadas para a esquerda ou for(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a}));para sombras para a direita.

Isso pode abusar da regra "o que for conveniente para você" para a bandeira: P


Editar: sem 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}));

A bandeira para isso é 1ou-1

Zaq
fonte
Tudo bem, eu fixei as regras. :-P
Maçaneta da porta
AAWW, isso não é divertido :-( Isso faz "ambas as bandeiras são inteiros" conflito com o seu comentário "Você poderia até usar potato...", a menos que potatoseja um inteiro :-P.
Zaq
c=+prompt()ou b+cconcatenará como uma string.
Ndscore
Otimizado algumas coisas e tenho esse até 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
Salve outro byte ao converter cpara um número, subtraindo-o. b-cou b-=cno meu código acima. (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]))

Versão 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]))
Abhijit
fonte