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
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
und i
sind 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-z
und äö
. 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 Code-Golf , also gewinnt die kürzeste Lösung in Bytes.
U+0308 COMBINING DIAERESIS
sollte inU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
Ordnung sein.)e
undi
sind neutral sindfihus keksy
,huvu lehy
undlesmä prihti
akzeptable Antworten aufkehys fiksu
,levy huhu
undprisma lehti
jeweils?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Antworten:
JavaScript (ES6),
196 bis175 ByteNimmt die Wörter als zwei Zeichenfolgen in der Currysyntax
(a)(b)
. Gibt ein Array von zwei Arrays von Zeichen zurück.Probieren Sie es online!
Wie?
Jedes Eingabewort wird durch den regulären Ausdruck e geleitet , der 4 Erfassungsgruppen aufweist:
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:
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:
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 :
quelle
Python 3 ,
235231225221217215 BytesProbieren Sie es online!
Gerettet
quelle
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, dann in die fünfte Zeile:(F,B)
=>S
und(B,F)
=>S[::-1]
(Dies ist nicht kompatibel mit dem Vorschlag, den @Lynn gab)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
um ein paar weitere Bytes zu speichern.S=F,B='aöy','aou'
, und dann in die 4. Zeile wechseln(F,B)
nachS
.S=F,B=...
sollte ein paar Bytes sparen, wenn Sie(F,B)
mitS
Pyth, 84 Bytes
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
Q
wird implizit angehängt und enthält das eingegebene Wortpaar.m
: Ordne jedes Wortd
in der Eingabe zu::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
: Ersetzen SieA
mitaeiouyäö]
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 WortpaarN, Y
darin zu:hY
: nimm die Anfangskonsonanten des zweiten Wortes.@N2
: nimm den langen ersten Vokal des ersten Wortes, oderNone
.htY
: nimm den ersten Vokal des zweiten Wortes.J
: Speichern Sie das inJ
.*W
…2
: Wenn es einen langen Vokal gab, duplizieren Sie den Vokal des zweiten Wortes.+
: Hänge das an die Konsonanten an.c2"aouäöy"
:aouäöy
in 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 zuG, 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.XW
…eNGH
: Wenn ja, ordnen SieG
esH
dem Suffix des ersten Wortes zu, andernfalls behalten Sie das Suffix bei.+
: das Suffix anhängen.quelle