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á!

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

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

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.


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


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


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]))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.