Escriba un programa o una función que generará una cadena dada en forma de escalera, escribiendo cada parte de una palabra que comienza con una vocal una línea debajo de la parte anterior.
Por ejemplo:
Input: Programming Puzzles and Code Golf
Output: Pr P C G
ogr uzzl and od olf
amm es e
ing
Entrada
Una cadena que no contiene más que letras y espacios.
La cadena se puede pasar a través de STDIN
argumentos de función o algo equivalente.
Las letras pueden ser minúsculas o mayúsculas.
Siempre se supone que las entradas siguen esas reglas, no es necesario verificar las entradas incorrectas.
Salida
Cada vez que una vocal (es decir, a
, e
, i
, o
, u
o y
) se encuentra en una palabra, debe emitir el resto de la palabra en la línea siguiente (la vocal encontrado incluido), en la posición horizontal correcta. Esta regla es recursiva, lo que significa que si hay n vocales en la palabra, se escribirá en n + 1 líneas.
La vocal debe escribirse al comienzo de la siguiente línea, y no al final de la línea anterior cuando se encuentra una.
Cada palabra comienza en la primera línea y, por lo tanto, debe formatearse independientemente de otras palabras. Dos palabras están separadas por un espacio.
Si una palabra comienza con una vocal, debe escribirla comenzando en la segunda línea.
Casos de prueba
- Entrada:
Programming Puzzles and Code Golf
Salida:
Pr P C G
ogr uzzl and od olf
amm es e
ing
- Entrada:
The quick brown fox jumps over the lazy dog
Salida:
Th q br f j th l d
e u own ox umps ov e az og
ick er y
- Entrada:
aeiouy
Salida:
a
e
i
o
u
y
- Entrada:
YEAh UppErcAsE VOwEls
Salida:
V
Y Upp Ow
E Erc Els
Ah As
E
- Entrada:
If you only knew the power of the Dark Side
Salida:
kn th p th D S
If y onl ew e ow of e ark id
o y er e
u
Tanteo
Este es el código de golf , por lo que gana el código más corto.
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.
Después de pensarlo, entiendo que esto significa que el movimiento a la siguiente línea debe ocurrir antes de que se imprima la vocal, no después, pero puede valer la pena redactar esto de una manera que sea comprensible al instante: me llevó un tiempo.Respuestas:
Retina ,
504434(+10)3230 bytesGracias a Dennis por guardar 14 bytes usando caracteres de control reales.
Según esta respuesta , estoy usando códigos de escape ANSI para mover el cursor del terminal verticalmente. El
<ESC>
debe ser reemplazado por el carácter de control 0x1B, y<VT>
con el tabulador vertical0x0B
. Para una prueba más simple, también puede reemplazar<ESC>
con\e
,<VT>
con\v
y alimentar la salidaprintf
.Para fines de conteo, cada línea va en un archivo separado. Sin embargo, por conveniencia, es más simple pegar el código en un solo archivo e invocar Retina con la
-s
opción.El primer reemplazo rodea cada vocal
\v...#
, donde el\v
cursor desplaza hacia abajo y#
es un marcador para el segundo paso. Estai`
es la notación de Retina para la coincidencia entre mayúsculas y minúsculas.El segundo paso luego (repetidamente
+`
) elimina a#
de una palabra y coloca une\[A
al final de la palabra que desplaza el cursor hacia arriba. Esto se detiene una vez que la cadena deja de cambiar, es decir, cuando no hay más#
marcadores en la cadena.fuente
printf
. Simplemente reemplácelo\e
con el byte ESC (0x1b).CJam,
3936 bytesLo anterior es un volcado xxd reversible, ya que el código fuente contiene el carácter no imprimible VT (punto de código 0x0b) y ESC (punto de código 0x1b).
Al igual que esta respuesta , utiliza pestañas verticales y secuencias de escape ANSI .
Esto requiere un terminal de texto de video compatible, que incluye la mayoría de los emuladores de terminales que no son de Windows.
Prueba de funcionamiento
Antes de ejecutar el código real, deshabilitaremos el mensaje y borraremos la pantalla.
Esto asegura que la salida se muestre correctamente.
Para restaurar la solicitud, ejecute esto:
Cómo funciona
Insertamos una pestaña vertical antes de cada vocal para mover el cursor hacia abajo y suficientes copias de la secuencia de bytes 1b 5b 41 (
"\e[A"
) después de cada espacio para mover el cursor de regreso a la primera fila.fuente
unset PS1save
después.Java, 428 bytes
Lo se, es horrible. Probablemente hay algunos caracteres que se pueden depilar, pero soy demasiado vago para hacerlo.
fuente
int
variables (es deciri
,r
,p
,o
, yx
) donde se inicializal
ym
ya que va a dar valores más tarde. También puede hacerString v="...",a[]=...;
y hacer lo mismo para arribaString u
. Eso debería reducir tu puntaje un poco.x++-~-p
Perl, 31 bytes
Lo anterior es un volcado xxd reversible, ya que el código fuente contiene el carácter no imprimible VT (punto de código 0x0b) y ESC (punto de código 0x1b).
El código tiene 27 bytes de longitud y requiere los conmutadores
040p
(4 bytes).El programa requiere un terminal de texto de video que admita pestañas verticales y secuencias de escape ANSI , que incluye la mayoría de los emuladores de terminal que no son de Windows.
Prueba de funcionamiento
Antes de ejecutar el código real, deshabilitaremos el mensaje y borraremos la pantalla.
Esto asegura que la salida se muestre correctamente.
Para restaurar la solicitud, ejecute esto:
Cómo funciona
perl -040p
lee automáticamente la entrada como tokens separados por espacios (-040
), guarda cada token en$_
(-p
) y ejecuta el programa.s/[aeiouy]/.$&/gi
realiza una búsqueda global, sin distinción entre mayúsculas y minúsculas,$_
para las vocales y reemplaza cada vocal por el carácter de control VT (mueve el cursor hacia abajo), seguido de la vocal en sí.s
devuelve el número de reemplazos que realizó, por lo que$\=".[A"x s...
guarda varias copias de la secuencia de bytes 1b 5b 41 (mueve el cursor hacia arriba)$\
, una para cada vocal.Al final del programa, Perl imprime automáticamente
"$_$\"
, debido al-p
cambio.fuente
C,
200190 bytesSin golf:
Asigna un búfer rectangular (en realidad cuadrado), lo llena con espacios y líneas nuevas, luego atraviesa la cadena dada. Al final, agrega un carácter nulo para evitar el arrastre de nuevas líneas.
Técnicamente no es una función ya que contiene globales; de hecho no se puede llamar más de una vez (
j
yl
debe ser 0 al inicio). Para cumplir,i,j,k,l,M;
se puede mover alint i,j=0,k,l=0,M;
inicio de la función.fuente
char*t=malloc(M*M);
->char t[M*M];
yfor(i=0;i<M*M;++i)
->for(;i<M*M;++i)
char t[M*M]
?CJam, 47
Sí, es un poco largo, pero no es "trampa" con los códigos ANSI :)
Pruébalo en línea
La idea es calcular un número de línea para cada carácter (comenzando en 0, aumentando en vocales y volviendo a 0 en el espacio), y luego para cada línea, repita la cadena pero reemplace los caracteres que tienen un número de línea diferente con un espacio .
fuente
K,
81727066 bytesBueno, es un comienzo:
Ejemplos de uso:
Editar 1:
Mejor. Se hicieron algunas mejoras a nivel de superficie:
Notablemente, invertí los argumentos para
?
cuando realizo la búsqueda de vocales y, por lo tanto, eliminé la necesidad de una lambda, hice la misma inversión_
donde dividí las palabras en espacios en blanco, y me di cuenta de que~{" "?x}'x
es una forma de decir realmente tonta y complicada" "=x
.Edición 2:
Otro ajuste de nivel de superficie
s
antes de aplicarlo a la lambda, guardando los parens en el interior:Edición 3:
OK, tomemos un enfoque diferente para calcular el desplazamiento de cada carácter. En lugar de dividir la secuencia en espacios y calcular una suma continua (
+\
) de las posiciones de las vocales, podemos operar en toda la cadena de entrada en una pasada, multiplicando la suma continua por 0 cada vez que encontremos un espacio. Necesito la negación de esta secuencia, por lo que puedo restar en lugar de sumar mientras escaneo y usar el número de distinción (#?
) en lugar de max (|/
) cuando calculo la cantidad de relleno vertical.Eso ahorra otros 4 caracteres. ¡Uf!
fuente
Rubí:
135131124115112 caracteresEjecución de muestra:
fuente
/(?=[aeiouy ])/i
.C, 192 bytes
Esto itera a través de la cadena, dejando en blanco los caracteres a medida que los imprime. Se repite hasta que no queden caracteres sin espacio para imprimir. Es C portátil, sin hacer suposiciones sobre la codificación de caracteres.
Versión legible
fuente
' '
->32
yf(char*s){int l=0,r=1,v,c;
->l,r=1,v,c;f(char*s){
' '
puede ser32
, pero depende de la codificación de caracteres, y como dije, hice este portátil C. Sinint
embargo, descartar lo explícito es genial, ¡no estoy seguro de por qué lo olvidé!Pitón 3,
265207202185177 caracteresEsto es terrible y no estoy orgulloso. Sé que esto se puede acortar, pero pensé en publicar de todos modos.
Inspirado por la versión C, crea una lista que luego se llena al atravesar la cadena de entrada.
fuente
GNU Sed, 151 + 1
(+1 ya que necesita el
-r
bandera)Pensé que sed sería la herramienta para este trabajo, pero lo encontré sorprendentemente difícil.
Versión legible:
fuente
p
, por lo que no genera nada. Un pequeño problema es que las salidas comienzan con un espacio extra. Un gran problema es que el primer texto que comienza con vocal desaparece.c
, debido a la línea justo antestx
. He restablecido una versión anterior con su bucle similar, y tendré otro intento más tarde.Python 2,
145142 BytesProbablemente no sea tan competitivo como algunos otros métodos, pero pensé que esta era una forma genial de usar expresiones regulares.
La expresión regular
(?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).
coincide con cualquier carácter individual que no se encuentre dentro del grupo N-ésimo de letras desde el final de una palabra. Como cuenta desde el fin del mundo, invierto la cadena antes y después, y también tengo que agregar un espacio al final, pero después de eso se convierte en una simple cuestión de usarre.sub
para reemplazar cada instancia de estos caracteres con un espacio. Hace esto para cada valor de N hasta que la cadena está vacía.fuente
re.I
, se puede ahorrar 3 bytes sustituyendo el valor del indicador apropiado, es decir2
.Octava,
132129 caracteresPrueba
Entrada:
"YEAh UppErcAsE VOwEls"
Salida:
fuente
Gema :
5348 caracteresTenga en cuenta que
^[
(x1b) y^K
(x0b) son caracteres individuales. (En la ejecución de muestra a continuación, utilizo sus equivalentes\e
y\v
equivalentes de copiar y pegar , en caso de que desee probarlo).Ejecución de muestra:
fuente
Jelly , 42 bytes (¿no compite?)
Pruébalo en línea!
¿Por qué Jelly, por qué? :-(
fuente