Spoonerise words… po fińsku

19

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):

yhä kontti -> kouha ntti
hauva läähättää -> yvä haahattaa

ei isą 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-zi äö. 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 , więc wygrywa najkrótsze rozwiązanie w bajtach.

Przypadki testowe

PurkkaKoodari
źródło
Czy możemy wybrać kodowanie wejścia / wyjścia? Czy dopuszczalne jest także wymaganie, aby na wejściu stosowano łączenie znaków diakrytycznych zamiast pojedynczych znaków?
Klamka
@Doorknob Możesz wybrać dowolne kodowanie, ale tekst będzie w formacie NFC (tzn. Bez łączenia znaków). Kodowanie może być przypadkiem zgodności z niektórymi językami, ale NFC / NFD prawdopodobnie nie. (Wszystko, co da się poradzić, U+0308 COMBINING DIAERESISpowinno sobie poradzić U+00E4 LATIN SMALL LETTER A WITH DIAERESIS).
PurkkaKoodari
1
Ponieważ ei isą neutralne, są fihus keksy, huvu lehyi lesmä prihtidopuszczalne dla odpowiedzi kehys fiksu, levy huhui prisma lehtiodpowiednio?
Arnauld
1
Na marginesie: z powodu długich samogłosek i harmonii samogłoskowej fińska łyżka nie jest funkcją mimowolną . Na przykład: puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri.
Arnauld
@Arnauld Nie. Zaktualizuję pytanie; samogłoski neutralne nie powinny powodować żadnych zmian.
PurkkaKoodari

Odpowiedzi:

9

JavaScript (ES6), 196 175 bajtów

Pobiera słowa jako dwa ciągi w składni curry (a)(b). Zwraca tablicę dwóch tablic znaków.

a=>b=>[(e=/(.*?)([eiäaöoyu])(\2?)(.*)/,g=(a,[,c,v])=>[...c+v+(a[3]&&v)+a[4]].map(c=>(j=e.search(v),i=e.search(c))>9&j>9?e[i&~1|j&1]:c))(a=e.exec(a),b=e.exec(b),e+=e),g(b,a)]

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:

e = /(.*?)([eiäaöoyu])(\2?)(.*)/    1: leading consonants (or empty)
     [ 1 ][     2    ][ 3 ][ 4]     2: first vowel
                                    3: doubled first vowel (or empty)
                                    4: all remaining characters

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:

c + v + (a[3] && v) + a[4]

Aby zastosować harmonię samogłosek, najpierw zmuszamy wyrażenie regularne e do łańcucha, dodając je do siebie, co daje:

e = "/(.*?)([eiäaöoyu])(\2?)(.*)//(.*?)([eiäaöoyu])(\2?)(.*)/"
     ^^^^^^^^^^^^^^^^
     0123456789ABCDEF (position as hexa)

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:

(j = e.search(v), i = e.search(c)) > 9 & j > 9 ? e[i & ~1 | j & 1] : c
Arnauld
źródło
4

Python 3 , 235 231 225 221 217 215 bajtów

import re
S=F,B='äöy','aou'
def f(a,b,C=1):
 e,r,Q,W=re.findall(fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'*2,a+' '+b)[0][2:6]
 for c in zip(*S*(W in B)+(B,F)*(W in F)):r=r.replace(*c)
 return[Q+W*len(e)+r]+(C and f(b,a,[]))

Wypróbuj online!


Zapisano

  • -2 bajty, dzięki Lynn
  • -4 bajty, dzięki Zacharý
TFeld
źródło
2
Zaoszczędź dwa bajty za pomocą:fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
Lynn
1
Jeszcze lepiej: możesz zmienić drugą linię na S='äöy','aou', a następnie na piątą linię: (F,B)=> Si (B,F)=> S[::-1](Jest to niezgodne z sugestią podaną przez @Lynn)
Zacharý
Możesz także zmienić czwartą linię e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]na kilka kolejnych zapisanych bajtów.
Zacharý
Co chciałem powiedzieć: 2. linia do S=F,B='aöy','aou', a następnie w 4. linii zmień (F,B)na S.
Zacharý
S=F,B=...Należy zapisać kilka bajtów, jeśli zastąpi (F,B)sięS
Zachary
0

Pyth, 84 bajtów

.b++hY*W@N2JhtY2XW}JeA@DJc2"aouäöy"eNGH_Bmth:d:"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"4

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łowo dw danych wejściowych na:
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"Zamienić Asię 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łów N, Yna:
    • hY: weź początek spółgłosek drugiego słowa.
    • @N2: weź długą pierwszą samogłoskę pierwszego słowa lub None.
    • htY: weź pierwszą samogłoskę drugiego słowa.
    • J: zapisz to w J.
    • *W2: 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äöyna 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ę w G, H.
    • e: weź drugą połowę.
    • }J: sprawdź, czy pierwsza samogłoska drugiego słowa znajduje się w drugiej połowie.
    • XW... eNGHGdyby tak było, mapę G, aby Hw przyrostkiem pierwszego słowa, inaczej zachować sufiks jak jest.
    • +: dołącz sufiks.
PurkkaKoodari
źródło