Detonar una cuerda

34

Dada cualquier cadena, imprímala en forma de triángulo donde el texto corre hacia arriba y hacia abajo a lo largo de cada diagonal. Por ejemplo, una entrada de "Hello World"debería salir:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

El espacio entre cada carácter en una fila debe ser al menos 1, para mantener el formato adecuado.

maquiavelo
fuente
1
¿Podemos suponer que la cadena no está vacía?
Sr. Xcoder
@ Mr.Xcoder Sí, puedes
machiavelli
1
El espacio entre cada carácter en una fila debe ser al menos 1 : ¿Esto significa que H l o W r des una fila central válida? Preguntando porque en tu ejemplo cada fila tiene 3 espacios entre cada personaje.
Emigna
1
@Emigna No entendí tu pregunta, mis disculpas. Sí, tu ejemplo sería válido.
machiavelli
1
¿Se permiten espacios iniciales o finales?
Luis Mendo

Respuestas:

19

Carbón , 10 7 bytes

↗ELθ✂θιUE¹

Pruébalo en línea! Pruébalo en línea! Los enlaces son a la versión detallada del código. Explicación:

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

La primera vez pude usar el UEcomando.

Neil
fuente
Sabía que el carbón sería una de las primeras respuestas aquí ... Era casi tentador comenzar por mí mismo, pero soy inexperto con él para terminar una solución a tiempo, y de todos modos saldría del golf ...;)
Kevin Cruijssen
66
@Emigna ... pero esta fue mi gran oportunidad de usar UE...
Neil
66
@EriktheOutgolfer ... pero esta fue mi gran oportunidad de usar UE...
Neil
1
@Neil ¡ Es -3 bytes! -3 por un buen sacrificio! ¿Quién no quiere un buen -3?
Erik the Outgolfer
44
@EriktheOutgolfer Lo que se supone que debes decir es: "No puedes dejar que 05AB1E te gane, ¿verdad?"
Neil
12

05AB1E , 10 8 7 bytes

¡Gracias a Emigna por guardar 2 bytes!

ðâƶ.cðζ

Utiliza la codificación 05AB1E . Pruébalo en línea!

Adnan
fuente
Según esta línea El espacio entre cada carácter en una fila debe ser al menos 1 que puede eliminar ¶«. (también verificó la validez con OP)
Emigna
@ Emmigna Gracias! :)
Adnan
Podría querer actualizar el enlace Tio :)
Sr. Xcoder
@ Mr.Xcoder ninja'd
Adnan
1
Uso inteligente de âen ðâlugar de Sð«!
Erik the Outgolfer
9

Python 2 , 75 bytes

s=input()
k=l=len(s)
while k>1-l:k-=1;m=abs(k);print' '*m+' '.join(s[m::2])

Pruébalo en línea!

Ruud ahorró 3 bytes.

Lynn
fuente
3
Esto ha sido permitido por el OP: 78 bytes . El espacio en cada fila debe ser al menos 1 .
Sr. Xcoder
1
75 bytes
Arfie
8

C, 86 78 73 70 caracteres

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Pruébalo en línea!

Explicación

Implementación ingenua: dos ciclos, relleno de arriba a abajo, de izquierda a derecha (99 bytes):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Aquí, pone () solo imprime \ n en la salida. Combinemos declaraciones de variables y combinemos j ++ con algo (94 bytes):

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

Bueno. La variable j tiene un rango de 0 ... 2n; déjelo estar dentro de -n ... n, esto simplifica las matemáticas. Observe que la expresión booleana a la derecha de && siempre tiene el valor 0 o 1. Esto significa que podemos reemplazar && con &. 91 bytes:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Y ahora nos dimos cuenta de que imprimimos un espacio extra. Y sí, no necesitamos printf () para imprimir un solo símbolo. 86 bytes:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Aun mejor. Observe que la condición i * i> = j * j es la misma que i> = abs (j), pero más corta. Vamos a mover pone () en la expresión de incremento de bucle. ¿Y adivina qué? En realidad, no necesitamos las llaves alrededor de i + j. 78 bytes:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

¿Sabía que putchar () devuelve el carácter que ha impreso? Usemos XOR para probar números para equivalencia. Reemplacemos el espacio con su código ASCII, 32. Recuerde que el código de caracteres al final de la línea es 13. Y finalmente: ¿Sabía que GCC / Clang admite https://en.wikipedia.org/wiki/Elvis_operator ? 73 bytes:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Finalmente, ¿adivina qué? No necesitamos dos para bucles. Podemos reemplazar feo ~ i + j con solo ij. 70 bytes:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Trabajo futuro: ¿cambiar la dirección del circuito? Esto podría ahorrar algunos bytes, si se hace correctamente.

MrShoor
fuente
5

SOGL V0.12 , 13 10 9 bytes

ēI*@∑}¹╚H

Utiliza una función que acabo de agregar , pero que se documentó hace un tiempo.

Pruébalo aquí!
En ese enlace ,se agrega porque esto espera la entrada en la pila y se {agrega porque de lo contrario ,se ejecutaría cada vez en el ciclo

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise
dzaima
fuente
3

Gaia , 16 bytes

$:ċ⟪×$§×⟫†€|$¦tụ

Pruébalo en línea!

Explicación

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines
Gato de negocios
fuente
3

Octava, 59 63 58 57 bytes

@(s,a=@strjust)a([kron(+a(hankel(s)),[1 0;0 0]) '']',99)'

Pruébalo en línea!

rahnema1
fuente
1
99: buena idea :-)
Luis Mendo
3

Java, 292 bytes (lo siento)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}
ubzack
fuente
1
Puede eliminar las nuevas líneas, de lo contrario, ¡esto se ve muy bien!
Zacharý
1
Puedes jugar más al golf: 1 boolean a=1<0,o=L%2>0;.. 2. Si no es necesario i, utilice este bucle: for(i=0;i++<n;). 3. Puede deshacerse de o: j%2<L%2entonces j%2>L%2. 4. Usar dcomo flip toma tantos caracteres: solo hazlo j<(x<0?-x:x). 5. Tienes muchas más variables de las necesarias. 6. No necesita un programa completo: una lambda o método es suficiente. - Si quieres un ejemplo Java de golf, mira mi respuesta .
Olivier Grégoire
3

Java (OpenJDK 8) , 116 bytes

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

Pruébalo en línea!

Explicación

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}
Olivier Grégoire
fuente
3

C ++, 135 bytes

Bien, aquí está mi oportunidad con C ++:

auto f=[&](auto f,int y)->void{
  for(int i{};i<n;i++) putchar(y<0?f(f,y+1?i+1:n-1-i),'\n':i<y||i+y&1?' ':s[i]);
}; f(f,-1); f(f,-2);

¡Pruébelo en línea (ideone)!

Alexandr Poltavsky
fuente
3

Haskell , 140 137 bytes

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

Pruébalo en línea!

Guardado 3 bytes gracias a Challenger5

No creo que sea óptimo ...

fproduce una de las líneas ( m= 0 o 1 es el módulo del número de línea, nes el número de la línea)

g intercala líneas "impares" y "pares", y agrega al resultado un espejo de sí mismo.

jferard
fuente
Puede guardar bytes definiéndolos fcomo una función de infijo (como en (m#n)s=...) en lugar de una función de prefijo.
Esolanging Fruit
2

Mathematica 105 Bytes

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Tal vez podría eliminar otro byte o dos, pero el recuento de caracteres sobrecargado de lidiar con cadenas en Mathematica hace que desafíos simples como este no sean competitivos.

Kelly Lowder
fuente
2

J, 54 bytes

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Pruébalo en línea!(tenga en cuenta que la salida en TIO tiene una nueva línea y tres espacios, pero eso no proviene de la llamada a la función; probablemente sea lo que el intérprete J hace automáticamente).

Creo que la idea general para resolver esto es correcta, pero hay cosas pequeñas que probablemente estoy haciendo de manera subóptima que se están agregando al conteo de bytes.

Variantes anteriores

55 bytes

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 bytes

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

Explicación

Esto se dividirá en algunas funciones. Además, no fui tan minucioso con las últimas partes de la explicación, así que avíseme si desea una mejor explicación para cierta parte y puedo editarla.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup duplica cada carácter tantas veces como su índice (más uno) en la cadena
  • space inserta espacios entre cada personaje
  • pad rellena los caracteres con la cantidad correcta de espacios
  • trans transpone la matriz resultante

Llamada de muestra:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Dup

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

Los resultados están encuadrados para evitar que J rellene los extremos con espacios (ya que son de longitud desigual).

Llamada de muestra:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

Espacio

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Llamada de muestra:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

Almohadilla

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

Básicamente, rellene el primer elemento con longitud - 1 espacios, el segundo con longitud - 2, etc. También elimina el boxeo.

Llamada de muestra:

   pad space dup 'abc'
  a  
 b b 
c c c

Transponer

Esta es solo la función incorporada |:que toma la transposición de una matriz.

col
fuente
1
Utilicé un enfoque similar, pero evité el boxeo. 45 Bytes: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). seguramente se podría jugar más golf. esta parte -@i.@-@#es una fruta baja, muy probablemente
Jonás
@ Jonás No puedo descifrar rápidamente cómo funciona tu respuesta, así que te dejaré que la publiques si lo deseas, ya que me gustaría incluir una explicación de mi respuesta. Supongo que J para mí en este momento es un lenguaje de solo escritura.
cole
útil para descifrar rápidamente:, f=. <some tacit expression>luego 5!:2 <'f'ofrece una visualización en caja y 5!:4 <'f'una visualización de árbol. en mi caso, $"0~1+i.@#primero intente ejecutar con una cadena, luego ejecute todo a la derecha de |."0 1, luego entienda eso |."0 1y todo a la izquierda, guarde la transposición final, solo está haciendo las rotaciones necesarias.
Jonás
1
oh, no esperaba que actualizaras tu respuesta. fue más bien un "oye, puede que te resulte interesante". Podría haberlo publicado, pero sentí que los enfoques de alto nivel eran lo suficientemente similares como para que no valiera la pena.
Jonás
2
Acabo de recordar los complejos argumentos de #ayuda aquí, 26 bytes con|:@((-#)|."_1(1j1##)"0)~#\
millas
1

JavaScript (ECMAScript 6), 161 bytes

(s,n=console.log)=>s.split("").map((q,i,a,p)=>n(p=" ".repeat(q=a.length-++i)+a.map((v,j)=>j>=q&&j%2==q%2?a[j]+' ':'').join(''))||p).reverse().map((v,i)=>i&&n(v))

Pruébalo en línea!

sgtdck
fuente
1

Perl 5 , 86 + 2 (-F) = 88 bytes

Usé las sugerencias de @ Dom y algunos de mis propios ajustes para reducir el recuento de bytes.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

Pruébalo en línea!

Xcali
fuente
Lo siento, ¡me alegra que hayas recibido tu respuesta! Tuve un poco de juego cuando estaba tratando de arreglar el mío y no pude encontrar una solución, ¡el tuyo fue un mejor enfoque! Es posible soltar un par de bytes usando -aFpara poner todas las letras @Fy un par de pequeños ajustes ( -Fcuenta como 3 ya que necesita un espacio después): ¡ Pruébelo en línea!
Dom Hastings
1
¿Por qué -F cuenta como 3? ¿No deberían ser 2 como máximo? ¿No es la diferencia entre perl -e'code...'y perl -eF 'code...'. También -aes innecesario cuando se usa -F, por lo que el byte se puede cortar.
Xcali
Eso es exactamente. Por lo tanto, -Facepta un argumento, pero no queremos pasar uno ( -Fnos permite controlar qué se -adivide, sin argumento, dividir cada carácter por sí mismo), por lo que es la diferencia entre perl -ae '...'y perl -aF -e '...'. Por defecto se -adivide en /\s+/. Espero que ayude a aclarar!
Dom Hastings
Además, buen uso de $#F! ¡Siempre olvídate de eso!
Dom Hastings
0

q / kdb +, 55 bytes

Solución:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Ejemplo:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Explicación:

QUE HACER. la versión sin golf es de 66 bytes:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Prima:

Para obtener el mismo resultado que el ejemplo (74 bytes):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
callejero
fuente