Este desafío se basa y contiene casos de prueba de un curso de programación que tomé en la Universidad de Aalto. El material se usa con permiso.
Hace dos años y medio hubo un desafío sobre los cucharares en inglés . Sin embargo, en finlandeses los cucharares son mucho más complicados.
Spoonerisms en finlandés
En finlandés, las vocales son aeiouyäö
y las consonantes son bcdfghjklmnpqrstvwxz
. ( å
técnicamente es parte del finlandés, pero no se considera aquí).
Los cucharares más básicos solo toman la primera vocal de cada palabra y las consonantes que las preceden, e intercambian las partes:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Vocales largas
Algunas palabras contienen dos de la misma vocal consecutiva. En esos casos, el par de vocales debe intercambiarse con la primera vocal de la otra palabra, acortando o alargando las vocales para mantener la misma longitud.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
En el caso de dos vocales consecutivas diferentes, esto no se aplica:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Tres o más de la misma letra consecutiva no aparecerán en la entrada.
Armonía vocal
El finlandés tiene esta cosa encantadora llamada armonía vocal . Básicamente, significa que las vocales posteriores aou
y las delanteras äöy
no deberían aparecer en la misma palabra.
Cuando el canje de vocales delanteras o traseras en una palabra, todas las vocales de otro tipo en el resto de la palabra debe ser cambiado para que coincida con el nuevo comienzo de la palabra ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
y i
son neutrales y pueden aparecer con todas las demás letras; intercambiarlos en una palabra no debe causar cambios en el resto de la palabra.
Casos especiales
La armonía vocal no se aplica a algunas palabras, incluidas muchas palabras prestadas y palabras compuestas. No es necesario que estos casos se manejen "correctamente".
Desafío
Dadas dos palabras, da salida a las palabras en cuchara.
Las palabras de entrada solo contendrán los caracteres a-z
y äö
. Puede elegir usar mayúsculas o minúsculas, pero su elección debe ser coherente entre ambas palabras y entrada / salida.
La E / S se puede hacer en cualquier formato conveniente . (Las palabras deben considerarse cadenas o matrices de caracteres).
Este es el código de golf , por lo que gana la solución más corta en bytes.
U+0308 COMBINING DIAERESIS
debería funcionarU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
bien).e
yi
son neutros, sonfihus keksy
,huvu lehy
ylesmä prihti
respuestas aceptables parakehys fiksu
,levy huhu
yprisma lehti
, respectivamente?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Respuestas:
JavaScript (ES6),
196175 bytesToma las palabras como dos cadenas en sintaxis curry
(a)(b)
. Devuelve una matriz de dos matrices de caracteres.Pruébalo en línea!
¿Cómo?
Cada palabra de entrada se pasa a través de la expresión regular e , que tiene 4 grupos de captura:
La función auxiliar g () toma todos los grupos de captura de la palabra para actualizarse como a [] y el primer y segundo grupos de captura de la otra palabra como c y v .
Aplicamos cuchara principal y cuidamos las vocales largas con:
Para aplicar la armonía vocal, primero coaccionamos la expresión regular e a una cadena agregándola a sí misma, lo que da:
Las vocales que deben armonizarse tienen una posición superior a 9 en la cadena resultante. Además, la expresión se organizó de tal manera que las vocales delanteras äöy están ubicadas en posiciones pares, mientras que las vocales traseras aou están ubicadas en posiciones impares, al lado de sus contrapartes.
De ahí la siguiente fórmula de traducción que se aplica a cada carácter c de la palabra de salida:
fuente
Python 3 ,
235231225221217215 bytesPruébalo en línea!
Salvado
fuente
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, luego en la quinta línea:(F,B)
=>S
y(B,F)
=>S[::-1]
(Esto es incompatible con la sugerencia que dio @Lynn)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
por unos pocos bytes más guardados.S=F,B='aöy','aou'
, y luego en la 4ta línea cambiar(F,B)
aS
.S=F,B=...
debería reemplazar algunos bytes si lo reemplaza(F,B)
conS
Pyth, 84 bytes
Pruébalo en línea. Banco de pruebas.
Demostrando que no es que duro en idiomas golf. Un lenguaje basado en pila podría funcionar aún mejor.
Pyth usa ISO-8859-1 de forma predeterminada, por lo que
äö
son un byte cada uno.Explicación
Q
, que contiene el par de palabras de entrada, se agrega implícitamente.m
: asigna cada palabrad
en la entrada a::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
: reemplaceA
conaeiouyäö]
en la cadena para obtener la expresión regular^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: busca todas las coincidencias y devuelve sus grupos de captura.h
: toma el primer (y único) partido.t
: suelta el primer grupo que contiene toda la coincidencia._B
: emparejar con reverso para obtener[[first, second], [second, first]]
..b
: asigna cada par de palabrasN, Y
en eso a:hY
: toma las consonantes iniciales de la segunda palabra.@N2
: toma la primera vocal larga de la primera palabra, oNone
.htY
: toma la primera vocal de la segunda palabra.J
: guardar eso enJ
.*W
…2
: Si había una vocal larga, duplica la vocal de la segunda palabra.+
: añádelo a las consonantes.c2"aouäöy"
: divididoaouäöy
en dos para llegar["aou", "äöy"]
.@DJ
: ordena el par por intersección con la primera vocal de la segunda palabra. Esto obtiene la mitad con la primera vocal de la segunda palabra al final del par.A
: guardar el par enG, H
.e
: toma la segunda mitad.}J
: ver si la primera vocal de la segunda palabra está en la segunda mitad.XW
...eNGH
: si lo fuera, asignarG
aH
en el sufijo de la primera palabra, de lo contrario mantener el sufijo tal cual.+
: agregue el sufijo.fuente