¡Este desafío es un tributo al ganador de la Mejor Película en los Oscar 2017, La La Land Moonlight !
Escriba una función / programa que tome una cadena que contenga solo letras [A-Za-z]
, los cuatro símbolos que son comunes en las oraciones .,'?
y espacios de cada día , y genere la cadena al estilo de La La Land.
Para ser más específico, tome las letras hasta el primer grupo de vocales, e imprímalo / imprímalo dos veces agregando un espacio cada vez, luego imprima / imprima toda la cadena. y es una vocal en este desafío. La puntuación y la capitalización deben mantenerse.
Puede suponer que todas las cadenas contienen al menos una vocal, y que todas las cadenas comienzan con una letra.
Casos de prueba:
Land
La La Land
Moonlight
Moo Moo Moonlight
quEueIng
quEueI quEueI quEueIng
This isn't a single word.
Thi Thi This isn't a single word.
It's fun to play golf
I I It's fun to play golf
Ooo
Ooo Ooo Ooo
I'm okay
I I I'm okay
Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.
Why is y a vowel?
Why Why Why is y a vowel?
Este es el código de golf, por lo que gana el código más corto en cada idioma. Se alientan las explicaciones , también en los idiomas principales.
MOONLIGHT
. Y solo por diversión:Why did the chicken cross the road?
Respuestas:
Sed 30 bytes
fuente
*
lugar de\+
?05AB1E ,
231918 bytesGuardado 1 byte gracias a Okx .
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
Gelatina ,
24 22 20 1914 bytes-5 bytes utilizando un truco de la brillante respuesta de Emigna (busque 10 en la lista isVowel)
Pruébalo en línea! (no estoy seguro de cómo hacer un conjunto de pruebas para este programa completo)
15 alternativa de bytes:
Aquí está el conjunto de pruebas completo.
¿Cómo?
fuente
Python, 61 bytes
Aquí viene el primer lenguaje no basado en expresiones regulares (usando expresiones regulares).
Guardado 1 byte gracias a Neil .
fuente
JavaScript (ES6), 40
46Editar 5 + 1 bytes guardados gracias a @Arnauld
Demasiado largo en comparación con otros que usan el mismo truco (como de costumbre)
fuente
'$& $& $&'
: siempre olvido los caracteres especiales en dólares. Gracias. Desafortunadamente ahora es realmente un puerto de la respuesta de retina de Martin.^
requiere en Retina que, creo, busca todas las coincidencias por defecto. ¿Pero realmente lo necesitamos aquí?x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
Retina , 24 bytes
Pruébalo en línea!
fuente
Lote, 180 bytes
Implementa una máquina de estados.
g
realiza un seguimiento de si alguna vez hemos visto una vocal, por lo que si la letra actual no es una vocal, sabemos si se debe emitir o continuar con la siguiente letra.fuente
PowerShell ,
4647413938 bytesPruébalo en línea!
Gracias a Maarten Bamelis por la corrección de errores.
Guardado 6 bytes gracias a Rynant
Guardado
23 bytes gracias a Joeyfuente
Rubí,
313230 bytesDos bytes guardados gracias a GB y Cyoce.
fuente
PHP,
5554 bytesNota: la versión codificada utiliza la codificación IBM-850.
Corre así:
Explicación
Solo una expresión regular se reemplaza por una coincidencia no ansiosa de cualquier carácter al comienzo de la cadena, seguido de cualquier cantidad de vocales (use
i
opción para la insensibilidad a mayúsculas y minúsculas). Ese grupo de captura se imprime dos veces, seguido de la cadena completa.Ajustes
-R
para poner a$argn
disposición (Thx Titus)fuente
Javascript (ES6), 38 bytes
fuente
Perl, 25 + 1 (
-p
bandera)fuente
Perl 6 , 30 bytes
Pruébalo en línea!
fuente
{S:i/.*?<[aeiouy]>+/$/ $/ $//}
C,
202196195193190180i,j,k,m,n;f(char*a){if((a[i/12]-"AEIOUY"[i++%6])%32==0)k=n=24-(i%12);else if(k&&!n--){m=j=(i-13)/12;for(i=0;i<j*2;)printf("%c%c",a[i%j],(i==j-1)*32),i++;printf(" %s", a);}m?:f(a);}
Pruébalo en línea!
Cosa que queda al golf:
• Contrae dos printf en uno.
• La impresión de mi espacio de caracteres se puede cambiar a
%*c
lógica, estoy seguro.• Estoy usando condicionales que se pueden eliminar de alguna manera
•
j=(i-13)/12
probablemente puede acortarse.• [AY] verificaciones condicionales si
==0
generalmente no es necesario, aunque actualmente estoy atascado en eso (intenté cambiar if-else y deshacerme del==0
todo, pero eso requiere agregar más {corchetes} y aumentar el tamaño del byte)Trucos que he usado para jugar golf:
• Combinó una búsqueda de doble cadena de bucle mediante el módulo para el eje xy la división de enteros para el eje y (cadena de entrada vs cadena de vocal). (El eje X se repite dos veces antes de iterar una vez en el eje y; la primera vez con [AZ] y la segunda con [az] usando el valor de carácter 32 diferencial.
• Omitió tener que usar "[AY] y [ay]" simplemente tomando la distancia entre los conjuntos de caracteres y el módulo 32. De esa manera, si la distancia es 0 (AA) o si la distancia es 32 (aA)
• Reutilizar variables enteras que ya no se usan como variables booleanas.
• Llamada recursiva a una función con la misma cadena para procesarla y evitar un segundo for-loop.
• Establezca los valores BOOL en la lógica de establecer otra variable. (por ejemplo, bool = i = 5;) para noquear a los dos de una piedra.
• Abuso de exploits ternario vacío verdadero. (CCG)
Formato legible:
Eliminó 10 bytes gracias a Keyu Gan (en comentarios)
fuente
j=(i-13)/12
es probable que se pueda acortar.i=j=k=m=n=0;
?i,j,k,m,n;
para la inicialización.MATL, 33 bytes
Pruébalo en MATL Online
Explicación
fuente
'(^.*?[yY%s]+)'13Y2YD'$1 '8:)YX
ahorra 2 bytes'(^.*?[%s]+)'19Y2YD'$1 '8:)YX
salva otro 219Y2
no existía cuando desafortunadamente se envió esta respuestaV ,
21, 20 bytesPruébalo en línea!
Explicación:
Hexdump:
Versión alternativa (21 bytes):
Pruébalo en línea!
Esto utiliza una compresión ridícula de expresiones regulares, y aún se las arregla para que otros lenguajes de golf lo pateen a tope. Como referencia, esto es aproximadamente dos tercios de la longitud de la versión regular "sin comprimir", a saber:
Explicación:
Aquí hay un hexdump:
fuente
Python 3 ,
7568 bytesPruébalo en línea!
Explicación:
Funciona generando un valor booleano para cada carácter en la cadena de entrada en función de si es o no una vocal, y encuentra el índice más bajo de
0
la primera no vocal (excluyendo el primer carácter). Devuelve la subcadena a este índice dos veces, separadas por espacios y la cadena original.fuente
Clojure,
192188181 bytes-4 bytes en línea
first-sp-pred
(whoops).-7 bytes eliminando algunos espacios perdidos
¡Esto fue mucho más desafiante de lo que pensaba! Estoy analizando manualmente la cadena ... ya que todavía no he podido aprender regex: /
Vea el código previo al golf para el desglose:
fuente
Python 3 ,
10196 bytesPruébalo en línea!
una solución no regex
Comentado:
fuente
w=c in a
conw=c in'aAeEiIoOuUyY'
Ohm , 19 bytes (CP437), no competidor
Nuevo lenguaje, y como tal, tuve que agregar algunas características nuevas para que esto funcione, lo que lamentablemente hace que esto no sea competitivo (debido a las lagunas).
Explicación:
fuente
Q
), búsqueda de submatriz (u
), corte de cadena / matriz (├
) y constantes vocales (αv
yαy
).PHP,
69 6553 bytesrequiere PHP 5.3 o posterior. Ejecutar como pipe con
-F
o probar algunas versiones en línea .Se guardaron 4 bytes (y se arregló el código) con expresiones regulares robadas de @aross;
10 más con en
preg_filter
lugar depreg_match
y-F
y otros dos con una expresión regular mejorada.
7581 bytes para una versión no regex:requiere PHP 5 o posterior; reemplazar
?:
con?1:
PHP anterior. Corre con-nR
Descompostura
fuente
This isn't a single word
:T T This isn't a single word.
i
modificador que hace que las mayúsculas y minúsculas sean insensibles. La otra versión solo marcó en minúsculas. Fijo.R, 49bytes
sub("(.*?[aeiouy]+)","\\1 \\1 \\1",scan(,""),T,T)
Reemplazo basado en expresiones regulares, unir todo hasta que no sea una vocal, capturarlo y reemplazarlo solo 3 veces.
scan
espere unadouble
entrada de tipo, para decirle que usecharacter
tipo tenemos que darle dos argumentos, primero es la cadena predeterminada, emtpy para stdin, y para el segundo la evaluación R permite usar soloc
ya que no es ambiguocharacter
en este contexto.T
representaTRUE
y guarda algunos caracteres como 4º y 5º parámetro en sub para indicar que ignore mayúsculas y minúsculas y use PCRE (la codicia no es lo mismo con la sintaxis R regex)4 bytes guardados por cortesía de Sumner18 junto con el enlace Tio al código en ejecución
fuente
Java 8,
147140 bytesGolfizado:
Sin golf:
Nota: el literal
2
en el código es el valor dejava.util.regex.Pattern.CASE_INSENSITIVE
.fuente
import java.util.regex.*;
para guardar algunos bytes.C, 123 bytes
Llamar como:
fuente
Pyke , 22 bytes
Pruébalo en línea!
Esto es 4 bytes más de lo que debería haberse implementado. Implementé una forma más corta de obtener vocales incluidas
y
.fuente
Retina, 24 bytes
Pruébalo en línea
fuente
Python 3 ,
130102 bytesPruébalo en línea!
¡No utiliza ninguna función de ningún tipo ni bibliotecas externas! (A menos que la impresión y la entrada cuenten como funciones, lo que hacen).
Funciona al ver si sale de las consonantes al comienzo del título hacia la "zona de vocales". Si está en la 'zona de vocales' y detecta una consonante, imprime el título.
Guardado 28 bytes gracias a @LliwTelracs
fuente
MATLAB / Octave,
5851 bytes7 bytes guardados gracias a @HughNolan
Crea una función anónima llamada a la
ans
que se puede llamar pasándole una cadena:ans('Land')
Demo en línea
Para compatibilidad con MATLAB,
$0
debe usarse en lugar de$1
en la función anterior.fuente
@(x)regexprep(x,'^.*?[aeiouyAEIOUY]+','$0 $0 $0 ');
- también Matlab parece usar $ 0 en lugar de $ 1 de manera extrañaC (gcc) ,
111110 bytesPruébalo en línea!
Esto sólo utiliza funciones de biblioteca
strspn()
ystrcspn()
y explota el orden en que gcc evalúa parámetros de la función. Ligeramente menos golfizadoGracias a @gastropner por -1.
fuente
Pyth - 24 bytes
Test Suite .
fuente
y
?