Wyzwanie to opiera się na testowych kursach, które wziąłem na Uniwersytecie Aalto i zawierają je . Materiał jest używany za zgodą.
Dwa i pół roku temu pojawiło się wyzwanie dotyczące spoilerstwa w języku angielskim . Jednak w Finlandii łyżki są znacznie bardziej skomplikowane.
Spoonerizmy po fińsku
W języku fińskim samogłoski są, aeiouyäö
a spółgłosek są bcdfghjklmnpqrstvwxz
. ( å
technicznie jest częścią fińskiego, ale nie jest tutaj brany pod uwagę.)
Najbardziej podstawowe spooneryzm biorą tylko pierwszą samogłoskę każdego słowa i poprzedzające je spółgłosek i wymieniają części:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Długie samogłoski
Niektóre słowa zawierają dwa takie same kolejne samogłoski. W takich przypadkach para samogłosek musi zostać zamieniona na pierwszą samogłoskę drugiego słowa, skracanie lub wydłużanie samogłosek, aby zachować tę samą długość.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
W przypadku dwóch różnych kolejnych samogłosek nie dotyczy to:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Trzy lub więcej takich samych kolejnych liter nie pojawi się na wejściu.
Harmonia samogłoskowa
Fiński ma tę uroczą rzecz zwaną harmonią samogłosek . Zasadniczo oznacza to, że tylne aou
i przednie samogłoski äöy
nie powinny występować w tym samym słowie.
Kiedy przednie lub tylne zamiana samogłoski w słowie, wszystkie samogłoski innego rodzaju w pozostałej części tego słowa powinny być zmienione, aby dopasować nowy początek słowa ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
i i
są neutralne i mogą pojawiać się wraz ze wszystkimi innymi literami; zamiana ich na słowa nie może powodować zmian w pozostałej części słowa.
Przypadki specjalne
Harmonia samogłoskowa nie dotyczy niektórych słów, w tym wielu słów pożyczkowych i złożonych. Przypadki te nie muszą być traktowane „poprawnie”.
Wyzwanie
Biorąc pod uwagę dwa słowa, wypisz słowa spłaszczone.
Słowa wejściowe będą zawierać tylko znaki a-z
i äö
. Możesz wybrać użycie wielkich lub małych liter, ale twój wybór musi być spójny zarówno dla słów, jak i dla danych wejściowych / wyjściowych.
I / O można wykonać w dowolnym dogodnym formacie . (Słowa należy traktować jako ciągi lub tablice znaków.)
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie w bajtach.
U+0308 COMBINING DIAERESIS
powinno sobie poradzićU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
).e
ii
są neutralne, sąfihus keksy
,huvu lehy
ilesmä prihti
dopuszczalne dla odpowiedzikehys fiksu
,levy huhu
iprisma lehti
odpowiednio?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Odpowiedzi:
JavaScript (ES6),
196175 bajtówPobiera słowa jako dwa ciągi w składni curry
(a)(b)
. Zwraca tablicę dwóch tablic znaków.Wypróbuj online!
W jaki sposób?
Każde słowo wejściowe przechodzi przez wyrażenie regularne e , które ma 4 grupy przechwytywania:
Funkcja pomocnicza g () pobiera wszystkie grupy przechwytywania słowa do aktualizacji jako [], a pierwsze i drugie grupy przechwytywania drugiego słowa jako c i v .
Stosujemy podstawową łyżkę i dbamy o długie samogłoski, stosując:
Aby zastosować harmonię samogłosek, najpierw zmuszamy wyrażenie regularne e do łańcucha, dodając je do siebie, co daje:
Samogłoski, które należy zharmonizować, mają pozycję większą niż 9 w powstałym ciągu. Ponadto wyrażenie zostało ułożone w taki sposób, że samogłoski przednie ööy znajdują się w pozycjach parzystych, podczas gdy samogłoski tylne aou znajdują się w pozycjach nieparzystych, obok ich odpowiedników.
Dlatego następująca formuła tłumaczenia stosowana jest do każdego znaku c słowa wyjściowego:
źródło
Python 3 ,
235231225221217215 bajtówWypróbuj online!
Zapisano
źródło
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, a następnie na piątą linię:(F,B)
=>S
i(B,F)
=>S[::-1]
(Jest to niezgodne z sugestią podaną przez @Lynn)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
na kilka kolejnych zapisanych bajtów.S=F,B='aöy','aou'
, a następnie w 4. linii zmień(F,B)
naS
.S=F,B=...
Należy zapisać kilka bajtów, jeśli zastąpi(F,B)
sięS
Pyth, 84 bajtów
Wypróbuj online. Zestaw testowy.
Udowadniając, że nie jest to takie trudne w językach golfowych. Język oparty na stosie może działać jeszcze lepiej.
Pyth domyślnie korzysta z ISO-8859-1, więc
äö
każdy ma jeden bajt.Wyjaśnienie
Q
, zawierający wejściową parę słów, jest dołączany niejawnie.m
: zamapuj każde słowod
w danych wejściowych na::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
ZamienićA
sięaeiouyäö]
w ciąg, aby uzyskać regex^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: znajdź wszystkie mecze i zwróć ich grupy przechwytywania.h
: weź pierwszy (i jedyny) mecz.t
: upuść pierwszą grupę zawierającą całe dopasowanie._B
: sparuj z rewersem, aby uzyskać[[first, second], [second, first]]
..b
: zamapuj każdą parę słówN, Y
na:hY
: weź początek spółgłosek drugiego słowa.@N2
: weź długą pierwszą samogłoskę pierwszego słowa lubNone
.htY
: weź pierwszą samogłoskę drugiego słowa.J
: zapisz to wJ
.*W
…2
: Jeśli była długa samogłoska, zduplikuj samogłoskę drugiego słowa.+
: dołącz to do spółgłosek.c2"aouäöy"
: Podziałaouäöy
na dwie części, aby uzyskać["aou", "äöy"]
.@DJ
: posortuj parę według przecięcia z pierwszą samogłoską drugiego słowa. To dostaje połowę z pierwszą samogłoską drugiego słowa na końcu pary.A
: zapisz parę wG, H
.e
: weź drugą połowę.}J
: sprawdź, czy pierwsza samogłoska drugiego słowa znajduje się w drugiej połowie.XW
...eNGH
Gdyby tak było, mapęG
, abyH
w przyrostkiem pierwszego słowa, inaczej zachować sufiks jak jest.+
: dołącz sufiks.źródło