Spoonerise Wörter ... auf Finnisch

19

Diese Herausforderung basiert auf und enthält Testfälle aus einem Programmierkurs, den ich an der Aalto University absolviert habe. Das Material wird mit Genehmigung verwendet.

Vor zweieinhalb Jahren gab es eine Herausforderung in Bezug auf Spoonerismen auf Englisch . In Finnland sind Spoonerismen jedoch viel komplizierter.

Spoonerisms auf Finnisch

Im Finnischen sind die Vokale aeiouyäöund die Konsonanten bcdfghjklmnpqrstvwxz. ( ågehört technisch zum Finnischen, wird hier aber nicht berücksichtigt.)

Die grundlegendsten Spoonerismen nehmen nur den ersten Vokal jedes Wortes und die ihnen vorangehenden Konsonanten und tauschen die Teile aus:

henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo

Lange Vokale

Einige Wörter enthalten zwei gleiche aufeinanderfolgende Vokale. In diesen Fällen muss das Vokalpaar mit dem ersten Vokal des anderen Wortes vertauscht werden, wobei die Vokale verkürzt oder verlängert werden müssen, um die Länge beizubehalten.

haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi

Bei zwei verschiedenen aufeinanderfolgenden Vokalen gilt dies nicht:

hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti

Mindestens drei gleiche aufeinanderfolgende Buchstaben werden in der Eingabe nicht angezeigt.

Vokalharmonie

Finnisch hat dieses schöne Ding namens Vokalharmonie . Grundsätzlich bedeutet dies, dass die hinteren aou und vorderen Vokale äöy nicht im selben Wort vorkommen dürfen.

Wenn der vordere oder hintere Vokale in einem Wort tauschen, alle Vokale der anderen Art in den Rest des Wortes sollte den neuen Anfang des Wortes (passend geändert werden a <-> ä, o <-> ö, u <-> y):

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

eund isind neutral und können mit allen anderen Buchstaben erscheinen; Das Vertauschen in ein Wort darf keine Änderungen am Rest des Wortes verursachen.

Spezialfälle

Die Vokalharmonie gilt nicht für einige Wörter, einschließlich vieler Lehnwörter und zusammengesetzter Wörter. Diese Fälle müssen nicht "korrekt" behandelt werden.

Herausforderung

Geben Sie bei zwei gegebenen Wörtern die Wörter spoonerisiert aus.

Die Eingabewörter enthalten nur die Zeichen a-zund äö. Sie können zwischen Groß- und Kleinschreibung wählen, aber Ihre Wahl muss zwischen Wörtern und Eingabe / Ausgabe konsistent sein.

I / O kann in jedem geeigneten Format erfolgen . (Wörter sollten als Zeichenfolgen oder Arrays von Zeichen betrachtet werden.)

Das ist , also gewinnt die kürzeste Lösung in Bytes.

Testfälle

PurkkaKoodari
quelle
Können wir eine Eingabe / Ausgabe-Codierung auswählen? Ist es auch akzeptabel zu verlangen, dass bei der Eingabe diakritische Zeichen anstelle einzelner Zeichen kombiniert werden?
Türknauf
@Doorknob Sie können eine beliebige Codierung auswählen, der Text wird jedoch in NFC (dh ohne Zeichenkombination) angezeigt. Eine Kodierung ist möglicherweise mit einigen Sprachen kompatibel, NFC / NFD jedoch wahrscheinlich nicht. (Alles, was damit umgehen kann, U+0308 COMBINING DIAERESISsollte in U+00E4 LATIN SMALL LETTER A WITH DIAERESISOrdnung sein.)
PurkkaKoodari
1
Da eund isind neutral sind fihus keksy, huvu lehyund lesmä prihtiakzeptable Antworten auf kehys fiksu, levy huhuund prisma lehtijeweils?
Arnauld
1
Als Nebenbemerkung: Wegen langer Vokale und Vokalharmonie ist der finnische Spoonerismus keine unabdingbare Funktion . Zum Beispiel: puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri.
Arnauld
@ Arnauld Nein. Ich werde die Frage aktualisieren. neutrale Vokale sollten keine Veränderung bewirken.
PurkkaKoodari

Antworten:

9

JavaScript (ES6), 196 bis 175 Byte

Nimmt die Wörter als zwei Zeichenfolgen in der Currysyntax (a)(b). Gibt ein Array von zwei Arrays von Zeichen zurück.

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

Probieren Sie es online!

Wie?

Jedes Eingabewort wird durch den regulären Ausdruck e geleitet , der 4 Erfassungsgruppen aufweist:

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

Die Hilfsfunktion g () nimmt alle Erfassungsgruppen des zu aktualisierenden Wortes als [] und die erste und zweite Erfassungsgruppe des anderen Wortes als c und v .

Wir wenden einfachen Spoonerismus an und kümmern uns um lange Vokale mit:

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

Um die Vokalharmonie anzuwenden, erzwingen wir zunächst den regulären Ausdruck e zu einer Zeichenfolge, indem wir ihn zu sich selbst hinzufügen. Dies ergibt:

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

Vokale, die harmonisiert werden müssen, haben eine Position größer als 9 in der resultierenden Zeichenfolge. Außerdem wurde der Ausdruck so angeordnet, dass sich die vorderen Vokale äöy an geraden Positionen befinden, während sich die hinteren Vokale aou an ungeraden Positionen neben ihren Gegenstücken befinden.

Daher die folgende Übersetzungsformel, die auf jedes Zeichen c des Ausgabeworts angewendet wird :

(j = e.search(v), i = e.search(c)) > 9 & j > 9 ? e[i & ~1 | j & 1] : c
Arnauld
quelle
4

Python 3 , 235 231 225 221 217 215 Bytes

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,[]))

Probieren Sie es online!


Gerettet

  • -2 Bytes, danke an Lynn
  • -4 Bytes, danke an Zacharý
TFeld
quelle
2
Speichern Sie zwei Bytes mit:fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
Lynn
1
Noch besser: Sie können die zweite Zeile in ändern S='äöy','aou', dann in die fünfte Zeile: (F,B)=> Sund (B,F)=> S[::-1](Dies ist nicht kompatibel mit dem Vorschlag, den @Lynn gab)
Zacharý
Sie können auch die vierte Zeile in ändern, e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]um ein paar weitere Bytes zu speichern.
Zacharý
Was ich sagen wollte: 2. Zeile nach S=F,B='aöy','aou', und dann in die 4. Zeile wechseln (F,B)nach S.
Zacharý
S=F,B=...sollte ein paar Bytes sparen, wenn Sie (F,B)mitS
Zacharý
0

Pyth, 84 Bytes

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

Probieren Sie es online aus. Testsuite.

Der Beweis, dass es in Golfsprachen nicht so schwer ist. Eine stapelbasierte Sprache könnte noch besser sein.

Pyth verwendet standardmäßig ISO-8859-1, also jeweils äöein Byte.

Erläuterung

  • Qwird implizit angehängt und enthält das eingegebene Wortpaar.
  • m: Ordne jedes Wort din der Eingabe zu:
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]": Ersetzen Sie Amit aeiouyäö]in der Zeichenfolge, um den regulären Ausdruck zu erhalten ^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+).
    • :d: Finde alle Übereinstimmungen und gib ihre Fanggruppen zurück.
    • h: Nimm das erste (und einzige) Match.
    • t: Lasse die erste Gruppe fallen, die das gesamte Spiel enthält.
  • _B: Paar mit Rückwärtsgang zu bekommen [[first, second], [second, first]].
  • .b: Ordne jedes Wortpaar N, Ydarin zu:
    • hY: nimm die Anfangskonsonanten des zweiten Wortes.
    • @N2: nimm den langen ersten Vokal des ersten Wortes, oder None.
    • htY: nimm den ersten Vokal des zweiten Wortes.
    • J: Speichern Sie das in J.
    • *W2: Wenn es einen langen Vokal gab, duplizieren Sie den Vokal des zweiten Wortes.
    • +: Hänge das an die Konsonanten an.
    • c2"aouäöy": aouäöyin zwei Teile geteilt zu bekommen ["aou", "äöy"].
    • @DJ: Sortiere das Paar nach dem Schnittpunkt mit dem ersten Vokal des zweiten Wortes. Dies ergibt die Hälfte mit dem ersten Vokal des zweiten Wortes am Ende des Paares.
    • A: Speichern Sie das Paar zu G, H.
    • e: nehmen Sie die zweite Hälfte.
    • }J: Überprüfen Sie, ob der erste Vokal des zweiten Wortes in der zweiten Hälfte liegt.
    • XWeNGH: Wenn ja, ordnen Sie Ges Hdem Suffix des ersten Wortes zu, andernfalls behalten Sie das Suffix bei.
    • +: das Suffix anhängen.
PurkkaKoodari
quelle