Esse desafio é baseado e contém casos de teste de um curso de programação que fiz na Universidade de Aalto. O material é usado com permissão.
Dois anos e meio atrás, havia um desafio sobre os Spoerisms em inglês . No entanto, em Spoerisms finlandeses são muito mais complicados.
Spoonerisms em finlandês
Em finlandês, as vogais são aeiouyäö
e as consoantes são bcdfghjklmnpqrstvwxz
. ( å
é tecnicamente parte do finlandês, mas não é considerado aqui.)
Os colheristas mais básicos usam apenas a primeira vogal de cada palavra e as consoantes que as precedem e trocam as partes:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Vogais longas
Algumas palavras contêm duas da mesma vogal consecutiva. Nesses casos, o par de vogais deve ser trocado pela primeira vogal da outra palavra, encurtando ou alongando vogais para manter o mesmo comprimento.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
No caso de duas vogais consecutivas diferentes, isso não se aplica:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Três ou mais da mesma letra consecutiva não aparecerão na entrada.
Harmonia da vogal
O finlandês tem essa coisa adorável chamada harmonia de vogais . Basicamente, isso significa que as vogais traseiras aou
e vogais frontais äöy
não devem aparecer na mesma palavra.
Quando trocar dianteiras ou traseiras vogais em uma palavra, todas as vogais de outro tipo no resto da palavra deve ser alterada para coincidir com o novo início da palavra ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
e i
são neutros e podem aparecer com todas as outras letras; trocá-los por uma palavra não deve causar alterações no restante da palavra.
Casos especiais
A harmonia da vogal não se aplica a algumas palavras, incluindo muitas palavras de empréstimo e palavras compostas. Esses casos não precisam ser tratados "corretamente".
Desafio
Dadas duas palavras, produza as palavras misturadas.
As palavras de entrada conterão apenas os caracteres a-z
e äö
. Você pode optar por usar maiúsculas ou minúsculas, mas sua escolha deve ser consistente entre as palavras e a entrada / saída.
A E / S pode ser feita em qualquer formato conveniente . (As palavras devem ser consideradas cadeias ou matrizes de caracteres.)
Isso é código-golfe , então a solução mais curta em bytes vence.
U+0308 COMBINING DIAERESIS
deve lidarU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
muito bem.)e
ei
são neutros, sãofihus keksy
,huvu lehy
elesmä prihti
respostas aceitáveis parakehys fiksu
,levy huhu
eprisma lehti
, respectivamente?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Respostas:
JavaScript (ES6),
196175 bytesPega as palavras como duas strings na sintaxe de currying
(a)(b)
. Retorna uma matriz de duas matrizes de caracteres.Experimente online!
Quão?
Cada palavra de entrada é passada pela expressão regular e , que possui 4 grupos de captura:
A função auxiliar g () leva todos os grupos de captura da palavra a serem atualizados como [] e o primeiro e o segundo grupos de captura da palavra como c e v .
Aplicamos o Spoerism básico e cuidamos de vogais longas com:
Para aplicar a harmonia das vogais, primeiro coagimos a expressão regular e a uma string, adicionando-a a ela mesma, o que fornece:
As vogais que precisam ser harmonizadas têm uma posição maior que 9 na sequência resultante. Além disso, a expressão foi organizada de tal maneira que as vogais dianteiras estão localizadas em posições pares, enquanto as vogais traseiras também estão localizadas em posições ímpares, próximas às suas contrapartes.
Daí a seguinte fórmula de conversão que é aplicada a cada caractere c da palavra de saída:
fonte
Python 3 ,
235231225221217215 bytesExperimente online!
Salvou
fonte
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, em seguida, na quinta linha:(F,B)
=>S
e(B,F)
=>S[::-1]
(Isto é incompatível com a sugestão @Lynn deu)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
por mais alguns bytes salvos.S=F,B='aöy','aou'
, e depois na 4ª linha, mude(F,B)
paraS
.S=F,B=...
deve economizar alguns bytes se você substituir(F,B)
comS
Pitão, 84 bytes
Experimente online. Suíte de teste.
Provando que não é que difícil em linguagens de golfe. Um idioma baseado em pilha pode se sair ainda melhor.
Pyth usa ISO-8859-1 por padrão, assim
äö
como um byte cada.Explicação
Q
, contendo o par de palavras de entrada, é anexado implicitamente.m
: mapeie cada palavrad
na entrada para::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
: substituaA
poraeiouyäö]
na sequência para obter a regex^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: encontre todas as correspondências e retorne seus grupos de captura.h
: faça a primeira (e única) partida.t
: solta o primeiro grupo que contém a correspondência inteira._B
: emparelhe com o reverso para obter[[first, second], [second, first]]
..b
: mapeie cada par de palavrasN, Y
para:hY
: pegue as consoantes iniciais da segunda palavra.@N2
: faça a primeira vogal longa da primeira palavra ouNone
.htY
: faça a primeira vogal da segunda palavra.J
: salve isso emJ
.*W
…2
: Se houver uma vogal longa, duplique a vogal da segunda palavra.+
: acrescente isso às consoantes.c2"aouäöy"
: divididoaouäöy
em dois para obter["aou", "äöy"]
.@DJ
: classifique o par por interseção com a primeira vogal da segunda palavra. Isso chega à metade com a primeira vogal da segunda palavra no final do par.A
: salve o par emG, H
.e
: pegue a segunda metade.}J
: veja se a primeira vogal da segunda palavra está na segunda metade.XW
…eNGH
: Se foi, mapeieG
paraH
no sufixo da primeira palavra, caso contrário, mantenha o sufixo como está.+
: acrescente o sufixo.fonte