Una palabra de portmanteau es una combinación de dos palabras que forma parte de cada palabra y las convierte en una sola palabra nueva. Por ejemplo, lion + tiger => liger .
Escribamos un programa para generar carteras a partir de un par de palabras de entrada. Las computadoras no son las mejores en inglés, por lo que tendremos que establecer algunas reglas para asegurarnos de que las carteras de salida sean agradables a la vista y al oído.
(Los ejemplos aquí se muestran con un separador entre el prefijo y el sufijo para mayor claridad:. li|ger
Sin embargo, las salidas reales del programa no deberían tener un separador:. liger
)
- Cada portmanteau consistirá en un prefijo no vacío de la primera palabra concatenado a un sufijo no vacío de la segunda palabra: sí a
li|ger
, no a|iger
. - Si el prefijo termina con una vocal, el sufijo debe comenzar con una consonante, y viceversa: sí a
lio|ger
ol|er
, no alio|iger
ol|ger
. Puedes decidir si contary
como vocal o consonante. Sin embargo, su solución debe elegir una opción y seguir con ella. - La palabra resultante no debe contener ninguna de las palabras originales en su totalidad: sí a
lio|ger
, no alion|iger
oli|tiger
.- Esta regla se cumple incluso si la parte en cuestión está formada por partes de ambas palabras: con la entrada de
two
+words
, la salidatw|ords
sigue siendo ilegal porque contiene la subcadenawords
. (La única salida válida para este par seríat|ords
).
- Esta regla se cumple incluso si la parte en cuestión está formada por partes de ambas palabras: con la entrada de
Su programa o función debe tomar dos palabras y generar / devolver una lista de todos los acolchados agradables que se pueden formar a partir de esas palabras en ese orden.
Detalles
- Se aplican métodos estándar de entrada y salida . Las lagunas estándar están prohibidas.
- Las palabras consistirán solo en letras minúsculas (o, si lo prefiere, solo en letras mayúsculas).
- Puede tomar las dos palabras de entrada como una lista, tupla, dos entradas separadas, una sola cadena con un delimitador sin letras, etc.
- El formato de salida es igualmente flexible; si devuelve o genera una cadena, debe delimitarse de modo que quede claro dónde termina una palabra de portmanteau y comienza la siguiente.
- No debe haber delimitadores dentro de una palabra de portmanteau.
- Está bien si su lista de resultados incluye resultados duplicados; También está bien eliminar duplicados.
Casos de prueba
> lion, tiger
< liger, ler, liger, lir, lioger, lior
> tiger, lion
< tion, ton, tin, tigion, tigon, tigen
> spoon, fork
< sork, spork, spork, spok, spoork, spook
> smoke, fog
< sog, smog, smog, smokog
> gallop, triumph
< giumph, gumph, gariumph, gamph, gaph, gah, galiumph, galumph, galliumph, gallumph, galloriumph, gallomph, galloh
> breakfast, lunch
< bunch, brunch, brench, brech, breh, breanch, breach, breah, breakunch, breakfunch, breakfanch, breakfach, breakfah, breakfasunch
> two, words
< tords
> harry, ginny (if y is treated as a consonant)
< hinny, hanny, hany, hay, harinny, harrinny
> harry, ginny (if y is treated as a vowel)
> hinny, hy, hanny, hany, harinny, hary, harrinny
Solución de referencia
Aquí hay una solución de referencia en Pip (trata y
como una consonante).
Este es el código de golf : ¡la respuesta más corta en cada idioma gana!
Respuestas:
05AB1E , 28 bytes
y
es una vocal (aunque el mismo número de bytes que la consonante).Pruébalo en línea! o como un conjunto de pruebas ligeramente modificado
fuente
ʒs¢Z_
;ʒsåO_
;ʒsм__
; etc.Retina , 72 bytes
Pruébalo en línea!
fuente
Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])
pero no podía concentrarme en jugar al golf debido a un dolor de cabeza.(?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))
y luego necesité probablemente al menos seis iteraciones para llegar a donde está ahora.^
mensajes de correo electrónico en mi comentario anterior son erróneos) De hecho, nunca habría pensado en ese()|.()
truco, probablemente me habría detenidoLw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou]))
.Pyth , 38 bytes
La entrada es una lista de las dos palabras, y y no se trata como una consonante.
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
fuente
Java 8,
228225215 bytesToma dos cadenas en la sintaxis de curry y devuelve una cadena. Se trata
y
como una consonante. Pruébelo en línea aquí .Gracias a DLosc por jugar al golf 2 bytes.
Sin golf:
fuente
Japt , 32 bytes
Intérprete Japt
Ahorró 10 bytes gracias a la comprensión más clara de Shaggy de la sintaxis de Japt.
Se guardaron 8 bytes debido a una nueva función de idioma
Guardado 2 bytes gracias a algunas sugerencias de ETHproductions
La versión más reciente de Japt introdujo la función de producto cartesiano, que ahorró bastantes bytes y me permitió restaurar el orden de las entradas (de modo que "lion" "tiger" genera "liger" y demás). "y" todavía se trata como una consonante.
Explicación:
fuente
Python 3 ,
156150 bytesLo he considerado
y
como una consonante.-6 bytes gracias a Jonathan Frech
Pruébalo en línea!
fuente
lambda x=0
para bajarlo y guardar ... 0 caracteres, molesto.lambda a,b,v='aeiou',r=range:{a[:i]+b[j:]for i in r(1,len(a))for j in r(1,len(b))if((a[i-1]in v)^(b[j]in v))*0**(a in a[:i]+b[j:]or b in a[:i]+b[j:])}
(Todavía 150)JavaScript (ES6), 124 bytes
Toma las 2 palabras en sintaxis de curry
(a)(b)
e imprime los resultados conalert()
. Asume que y es una consonante.Pruébalo en línea!
fuente
Jalea , 27 bytes
Pruébalo en línea!
Yy es una consonante. Ambos casos soportados. Devuelve duplicados.
La salida ha sido prettified sobre TIO. Eliminar
+/€
del pie de página para ver la salida real.fuente
C ++ 11,
217202 bytesHace un uso intensivo de
std::string#find
. Se tratay
como una consonante. Pruébelo en línea aquí .Sin golf:
fuente
Python 2 ,
179176166162 bytesPruébalo en línea!
3 bytes de Jonathan Frech . Y 10 bytes gracias a The Matt .
En mi mundo,
y
no es una vocal. (¡Es un aullido!)fuente
t) if
yt) or []
.(s in w)<1>(t in w)
.Ruby ,
113 112 109104 bytesy
es una consonanteEsto genera los mismos duplicados que los ejemplos en la pregunta, debo estar usando el mismo bucle
Pruébalo en línea!
fuente
Emacs Lisp , 306 + 13 = 319 bytes
+13 para
(require'seq)
¡Pruébelo en línea!
Define una función lambda anónima. Emite una secuencia de cartelas separadas por nueva línea con cada una entre comillas. Consejos de golf son bienvenidos. La letra
y
se considera una consonante.Sin golf
fuente