Dibuja las sombras de los edificios.

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    

Salida:

      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

Salida:

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

Especificación:

  • Debes tomar como entrada
    1. Una bandera que indica si la luz proviene de la parte superior izquierda o superior derecha. Esto puede ser 1o 2, -1o 1, 0o 65536, o lo que sea conveniente para usted, siempre y cuando ambos indicadores sean enteros.
    2. Filas compuestas por uno Xo todos, todos de la misma longitud en caracteres (es decir, rellenados con )
      • Todos X s estarán en la última fila o Xdebajo de ellos (lo que significa que no hay edificios flotantes)
  • Debe generar las filas (edificios) con sombras agregadas. Esto se hace con el siguiente procedimiento:
    • Si la luz proviene de la esquina superior izquierda, dibuje un triángulo rectángulo de .s con la misma altura y anchura que la altura del edificio, comenzando desde un espacio más allá de su borde derecho y hacia la derecha.
    • De lo contrario, si es desde la parte superior derecha, haga lo mismo, pero comience desde un espacio más allá de su borde izquierdo y apunte hacia la izquierda.
    • Recuerda no alterar X s cambiándolos a .s; déjalos como están.
    • Siempre habrá "espacio" para sus sombras, es decir, si hay un edificio de 3 espacios de altura al final, habrá al menos 3 espacios de relleno después.
  • Este es el , por lo que el código más corto en bytes ganará
Perilla de la puerta
fuente
1
¿Puedo usar {}y {-1*}como valores de bandera?
John Dvorak
@ Jan Sí, sí puedes. Incluso podrías usar potatoy while(1){}. Como se cita en la pregunta, "lo que sea conveniente".
Pomo de la puerta
2
:( Iba a resolver esto en expresiones regulares (con sabor a .NET), pero creo que encontré un error en el Regex.Replaceque no puedo solucionar ... ¿Tengo dos problemas ahora?
Martin Ender,
3
@Doorknob Alguien va a abusar de esta regla para tener todo su código en la entrada.
Aprıʇǝɥʇuʎs
2
@ Synthetica Esa es una de las "lagunas estándar".
Pomo de la puerta

Respuestas:

6

GolfScript, 67 caracteres

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

1 / -1 para sombras que van hacia la derecha / izquierda. Ejecute el ejemplo en línea :

      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
fuente
11

Perl - 85

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

EDITAR: Olvidé por completo la -pbandera con la que se debe ejecutar. Se agregaron 2 al recuento de char.
La bandera especificada en la primera línea es 0para las sombras que van hacia la izquierda y 2para las sombras que van hacia la derecha.

mniip
fuente
4

Python 3 - 233

Bueno, eso resultó más de lo esperado ...

1 para las sombras que van hacia la derecha, -1 para las sombras que van hacia la izquierda.

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

EDITAR: No vi el relleno lateral en las reglas. Ehehe ^^ '

cjfaure
fuente
3

JavaScript - 14

eval(prompt())

La bandera en la primera línea es 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 que miran hacia la izquierda ofor(p='';l=prompt();)console.log(p=l.replace(/ /g,function(a,b){return p[b-1]=='.'||p[b]=='.'||l[b-1]=='X'?'.':a})); para las sombras hacia la derecha.

Esto podría abusar de la regla "lo que sea conveniente para usted" para la bandera: P


Editar: sin 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 bandera para esto es 1o-1

Zaq
fuente
Bien, arreglé las reglas. :-P
Pomo de la puerta
Aaww, eso no es divertido :-( Esto hace que "ambas banderas sean enteras" en conflicto con tu comentario "Incluso podrías usar potato...", a menos que potatosea ​​un entero. :-P
Zaq
c=+prompt()o de lo contrario b+cse concatenará como una cadena.
nderscore
Optimicé algunas cosas y bajé 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
Ahorre otro byte en la conversión ca un número restando en su lugar. b-co b-=cen mi código de arriba. (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]))

Versión sin golf

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
fuente