Cuerdas en zig-zag

8

Cuerdas en zig-zag

Dada una cadena y un entero positivo, genera la cadena en un patrón de onda en zig-zag con una amplitud máxima y un espaciado entre caracteres igual al entero.

Esto es similar a esta pregunta pero también incluye el espacio entre caracteres.

Entrada

La entrada puede leerse desde STDIN o tomarse como argumentos de función. La entrada es una cadena sin líneas nuevas y un número entero positivo.

Salida

La salida esperada es la cadena transformada en un patrón de onda en zig-zag, comenzando hacia arriba, con el primer carácter en la línea base. El patrón de onda debe tener una amplitud y espaciado de caracteres igual al entero.

Ejemplos

Entrada

Programming Puzzles & Code Golf
2

Salida

    o               g                s               
  r   g           n                e               e   G
P       r       i       P        l       &       d       o  
          a   m           u    z               o           l
            m                z               C               f

Entrada

Programming Puzzles & Code Golf
1

Salida

 r   a   n   u   e       e   l
P o r m i g P z l s & C d   o f
   g   m       z       o   G

Este es el código de golf: el programa más corto gana.

kvill
fuente
3
No creo que este sea un duplicado del desafío que Martin mencionó , ya que este desafío tiene un tamaño de onda variable, reglas ligeramente diferentes para hacer olas y no requiere imprimir el lenguaje del programa.
ASCIIThenANSI
1
No creo que esto sea un duplicado tampoco.
orlp
1
Tampoco creo que esto sea un duplicado
Willem

Respuestas:

4

Javascript (ES6), 133 132 136 134 bytes

(s,n,o=Array(2*n+1).fill``)=>[...s].map((v,i)=>o=o.map((w,a)=>w+(a-((j=(i+3*n)%(4*n))>2*n?4*n-j:j)?" ":v)+" ".repeat(n-1)))&&o.join`
`

Define una función anónima. Para llamarlo, agregue f=al principio para llamar a la función f. Entonces, se puede probar conconsole.log(f("Programming Puzzles & Code Golf", 2))


¡Gracias a @vihan y @ edc65 por ayudar a salvar algunos bytes! :)

@kvill: el código se ha modificado para abordar el requisito de espacio entre caracteres variable en la especificación. ¡No lo noté al principio!

jrich
fuente
En lugar de unir y dividir, puede usar keysofill
Downgoat
1
Bien hecho, puede ser 118: (s,n,o=Array(2*n+1).fill'')=>[...s].map((v,i)=>o=o.map((w,a)=>a-((j=(i+3*n)%(4*n))>2*n?4*n-j:j)?w+" ":w+v))&&o.join''(llenar y unir usando una cadena de plantilla sin corchetes)
edc65
Esto no cumple con las especificaciones: el espacio entre caracteres debe variar con el tamaño del número entero. Ver ejemplos
kvill
0

J, 75 bytes

f=:4 :0
|:((]*>:@i.@#)((+:<:b)|i.#y){x|.}:(],}.@|.)|.=/~i.b=.>:+:x){' ',y
)

Aquí está la función en uso

   7 f'code golf is awesome and I like it'

       l                          
      o f                         
     g                           t
          i                     i 
   e       s                      
  d                           e   
 o           a               k    
c             w             i     
               e           l      
                s                 
                 o       I        
                  m               
                   e   d          
                      n           
                     a            
protista
fuente
1
Agradable, pero esto no cumple con las especificaciones: el espacio entre caracteres debe variar con el tamaño del número entero. Ver ejemplos
kvill
0

Pitón 2, 151

Aquí está mi respuesta usando Python 2:

s,n=input()
a=2*n+1
l,j,o=['',]*a,n,1
for c in s:
 for k in range(a):l[k]+=c+(n-1)*' ' if j==k else' '*n
 j-=o
 if j in [0,2*n]:o=-o
print'\n'.join(l)

Salida de muestra:

         t                                   e                                   h                                   t                                   e  
      s     i                             v     ,                             t     e                             s     i                             v     
   e           n                       a                                                                       e           n                       a        
t                 g                 w                 t                 g                 w                 t                 g                 w           
                                                         e           n                       a                                                              
                        t     e                             s     i                             v     ,                             t     e                 
                           h                                   t                                   e                                   h                    

y

 r   a   n   u   e       e   l 
P o r m i g P z l s & C d   o f
   g   m       z       o   G   
Willem
fuente
1
Esto no cumple con las especificaciones: el espacio entre caracteres debe variar con el tamaño del número entero. Ver ejemplos
kvill
actualizado para incluir el espacio entre caracteres
Willem