Dada una entrada de una lista de palabras, envíe las palabras con sus letras dispuestas en diagonal:
p
r
o
p g
u r
z a
a z m
n l m
d e i
c s n
o g
d
g e
o
l
f
(Lo anterior debe ser la salida para la entrada programming puzzles and code golf
).
Para ser precisos, cada palabra comienza en la primera columna y tres filas debajo de la palabra anterior, y cada letra sucesiva mueve una columna a la derecha y una fila hacia abajo.
La entrada puede proporcionarse como una sola cadena de palabras, separadas exactamente por un espacio, o como una lista / conjunto de palabras. Las palabras solo se compondrán de letras minúsculas a-z
y siempre tendrán al menos un carácter.
La salida puede ser una sola cadena, una matriz de líneas o una matriz de matrices de caracteres. Los espacios en blanco iniciales o finales no están permitidos, excepto para una nueva línea final.
Otros casos de prueba:
a bcd efgh i j
a
b
c
d
e
f
g
i h
j
x
x
verylongword short
v
e
r
s y
h l
o o
r n
t g
w
o
r
d
Como se trata de code-golf , ¡el código más corto en bytes ganará!
Respuestas:
Vim,
85, 76, 66, 52 pulsaciones de teclas / bytesCuando vi por primera vez este desafío, pensé "¡Esto es perfecto para vim!" Y luego, cuando lo intenté, todo salió mal. Aquí está, en todo su desordenada gloria hacky:
Pruébelo en línea, gracias al intérprete de V (en su mayoría) compatible con versiones anteriores.
Explicación:
Al principio pensé que podía hacer esta versión bellamente simple de 37 bytes:
Lamentablemente, no es tan simple. Tomémoslo línea por línea:
Esto habilita una característica llamada 'edición virtual'. Permite que el cursor se mueva a columnas que aún no existen. Esta respuesta sería básicamente imposible sin ella.
Ahora necesitamos separar las palabras en diferentes líneas. Entonces reemplazaremos cada espacio con 3 líneas nuevas. Como se trata de un comando ex, podemos ejecutarlo simultáneamente con nuestro último comando ex
:se ve=all
separando los dos con una barra.Ahora el búfer se ve así:
Aquí es donde comienza la diversión. Configuramos la macro recursiva tradicional con:,
qq
y luego llamamos a esto:Luego terminamos la macro recursiva con
@qq@q
. En este punto, tenemos todas las diagonales, solo necesitamos hacer un poco de limpieza.fuente
Turtlèd ,
2826 bytesOh, parece que estoy superando un lenguaje diseñado específicamente para el golf. Este es un gran día.
Pruébalo en línea!
Explicación
(escribir significa escribir en la celda de la cuadrícula, char puntiagudo significa char en la entrada a la que apunta el puntero de cadena)
tenga en cuenta el espacio final.
La entrada también necesita espacio final. ya que Python puede tomar una lista, esto es muy parecido a tomar una lista en Turtlèd
fuente
MATL , 28 bytes
La entrada es una matriz de celdas de cadenas, con comas como separadores opcionales:
o
Pruébalo en línea! O verifique todos los casos de prueba: 1 , 2 , 3 , 4 .
Explicación
Considere la siguiente entrada como ejemplo:
Puede ver los resultados parciales (contenido de la pila) insertando el símbolo de comentario
%
en cualquier punto del código. Por ejemplo, vea el contenido de la pila después de la cuarta función (&n
).fuente
JavaScript (ES6),
11810984 bytesToma entrada como un conjunto de palabras. Devuelve una matriz de matrices de caracteres.
Versión alternativa, 109 bytes.
Devuelve una cadena.
Mostrar fragmento de código
fuente
Lisp común,
673668597 bytesSolución terrible, lo sé. Probablemente editaré esto más después de dormir un poco.
Uso:
Esto recorre cada palabra en la lista provista y agrega los caracteres apropiados a la línea actual. El acolchado apropiado es proporcionado por mi uso mediocre de
format
.Nota: Soy nuevo en Common Lisp, pero sé lo suficiente como para darme cuenta de que esto podría mejorar mucho.
fuente
C #, 336 bytes:
Golfizado:
Sin golf:
Pruebas:
fuente
Func<string[], string>
realice otros cambios para 297 bytes;s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};
sin embargo, debe agregar 18 bytes parausing System.Linq;
i
yj
a la declaración int en la parte superior y mover algunos++
para que se usen en el último uso de la variablePython 2, 146 bytes
Nota: las sangrías para las dos últimas líneas son
<space>
y<tab>
, lo que ahorra un byte ya que no necesito doble sangría.La entrada se debe ingresar como una matriz de cadenas como esta:
["hello", "world"]
o['hello', 'world']
. La salida es una matriz de matrices de caracteres.Probablemente haya una mejor manera de hacer esto ...
EDITAR Gracias a Doorknob por señalar un corchete cerrado que falta. Lo puse antes del
*k...
en la tercera línea.fuente
Mathematica, 146 bytes
Estoy decepcionado por este bytecount, pero bueno.
Define una función anónima que toma una lista de palabras (p
{"this","that","these"}
. Ej. ) Y devuelve una matriz bidimensional de caracteres. Para ver en forma de cuadrícula, agregue un//Grid
al final.Convierte las cadenas en una matriz, agrega líneas adicionales, transpone la matriz, antepone los cambios necesarios y luego vuelve a transponer.
Resultado de ejemplo (formateado como cuadrícula):
fuente
Jalea , 24 bytes
Pruébalo en línea!
¿Cómo?
fuente
Python 2, 182 bytes
Un poco largo, pero en el lado positivo, devuelve una cadena sin espacios en blanco finales en cada línea, y sin espacios en blanco finales o retornos al final; restricciones que algunas otras entradas no obedecen.
Se pasa una lista de palabras a la función; algunos 'espacios en blanco' se agregan a esta lista y luego el algoritmo asigna una fila, un par de columnas a una palabraNumber, characterNumber en la lista expandida. (Esto es un poco inverso a la estrategia habitual vista en otras soluciones).
Si permitimos espacios en blanco al final de todas las líneas, excepto la última, podemos hacerlo un poco mejor (163 bytes):
fuente
q / kdb +,
13010994908684 bytesSolución:
Ejemplos:
Explicación (sin golf):
La esencia básica es crear un grupo de cadenas de igual longitud a partir de la cadena de entrada, voltearlas (rotarlas) y luego agregar espacios en blanco apropiados para obtener algo similar a esto:
que se voltea de nuevo y se imprime en stdout.
Aquí hay un desglose línea por línea del concepto:
Notas:
Algunas formas de eliminar algunos (11) bytes fáciles si realmente quisiéramos :
f:
y salir como una función anónima-1
y;
y devolver una lista de cadenas en lugar de imprimir en stdoutEdiciones:
rtrim
para encontrar la longitud máxima para rellenar, se eliminó la necesidad de almacenarC
variablesmax count each
para una función lambdaa
que se crea una vez y se usa dos vecesraze
a la función lambda para guardar unraze each
(+)
como abreviatura paraflip
fuente
Carbón ,
169 bytesMi primera respuesta al carbón. Gracias a @DLosc por su sugerencia
P
y enM
lugar de usarS
yJ
(Jump) para volver al inicio de la línea (y tres abajo).Pruébelo en línea (detallado) o Pruébelo en línea (puro) .
Explicación:
Bucle mientras todavía hay una próxima cadena de entrada:
Imprima esta cadena sin mover el cursor en una dirección hacia abajo-derecha:
Y luego mueva tres posiciones hacia abajo para la siguiente iteración:
fuente
θ
variable representa la primera entrada, así que solo asigno la entrada de prueba a esa variable en el encabezado y luego escribo el resto del código, para que pueda deshacerse de laα
variable e iterar sobre los elementos divididos deθ
. Pruébalo en línea! (No compite debido a los espacios principales.)Japt
-Rx
,171613 bytesToma entrada como un conjunto de palabras. Si se permitieran espacios en blanco al final de cada línea, los últimos 4 caracteres podrían eliminarse para vincularlos con la solución de carbón.
Pruébalo o ejecuta todos los casos de prueba
Explicación
fuente
K4 , 58 bytes
Solución:
Ejemplos:
Explicación:
Las cadenas de la almohadilla derecha son de la misma longitud, se transponen, se unen con
" "
, la almohadilla izquierda para generar diagonales, luego la almohadilla derecha para corregir las longitudes y transponer hacia atrás. Toma una lista de cadenas y devuelve una lista de cadenas. Probablemente golfable pero aún más corto que mi solución q / kdb +.fuente
Perl 6 , 73 bytes
Pruébalo en línea!
El argumento de entrada es una lista de palabras. La salida es una matriz de matriz de caracteres.
fuente
PHP , 100 bytes
Pruébalo en línea!
fuente