Ce défi est basé sur, et contient des cas de test, d' un cours de programmation que j'ai suivi à l'Université Aalto. Le matériel est utilisé avec permission.
Il y a deux ans et demi, il y avait un défi concernant les spoonerismes en anglais . Cependant, dans les spoonerismes finlandais sont beaucoup plus compliqués.
Spoonerismes en finnois
En finnois, les voyelles sont aeiouyäö
et les consonnes le sont bcdfghjklmnpqrstvwxz
. ( å
fait techniquement partie du finnois, mais n'est pas considéré ici.)
Les cuillerées les plus élémentaires ne prennent que la première voyelle de chaque mot, et toutes les consonnes qui les précèdent, et échangent les parties:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Voyelles longues
Certains mots contiennent deux de la même voyelle consécutive. Dans ces cas, la paire de voyelles doit être échangée avec la première voyelle de l'autre mot, raccourcissant ou allongeant les voyelles pour garder la même longueur.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
Dans le cas de deux voyelles consécutives différentes, cela ne s'applique pas:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Trois ou plus de la même lettre consécutive n'apparaîtront pas dans l'entrée.
Harmonie vocalique
Le finnois a cette belle chose appelée harmonie des voyelles . Fondamentalement, cela signifie que les voyelles arrière aou
et les voyelles avant äöy
ne doivent pas apparaître dans le même mot.
Lorsque la permutation des voyelles avant ou arrière en un mot, toutes les voyelles de l'autre type dans le reste du mot devrait être changé pour correspondre au nouveau début du mot ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
et i
sont neutres et peuvent apparaître avec toutes les autres lettres; les échanger en un mot ne doit pas entraîner de modifications dans le reste du mot.
Cas spéciaux
L'harmonie des voyelles ne s'applique pas à certains mots, y compris de nombreux mots de prêt et mots composés. Ces cas ne doivent pas être traités "correctement".
Défi
Étant donné deux mots, sortez les mots spoonerised.
Les mots saisis ne contiendront que les caractères a-z
et äö
. Vous pouvez choisir d'utiliser des majuscules ou des minuscules, mais votre choix doit être cohérent entre les mots et les entrées / sorties.
Les E / S peuvent être effectuées dans n'importe quel format pratique . (Les mots doivent être considérés comme des chaînes ou des tableaux de caractères.)
Il s'agit de code-golf , donc la solution la plus courte en octets l'emporte.
U+0308 COMBINING DIAERESIS
devraitU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
très bien fonctionner.)e
eti
sont neutres, sontfihus keksy
,huvu lehy
et deslesmä prihti
réponses acceptables pourkehys fiksu
,levy huhu
etprisma lehti
respectivement?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Réponses:
JavaScript (ES6),
196175 octetsPrend les mots comme deux chaînes dans la syntaxe de curry
(a)(b)
. Renvoie un tableau de deux tableaux de caractères.Essayez-le en ligne!
Comment?
Chaque mot d'entrée passe par l'expression régulière e , qui a 4 groupes de capture:
La fonction d'assistance g () prend tous les groupes de capture du mot à mettre à jour en tant que [] et les premier et deuxième groupes de capture de l'autre mot en c et v .
Nous appliquons le spoonerisme de base et prenons soin des voyelles longues avec:
Pour appliquer l'harmonie des voyelles, nous contraignons d'abord l'expression régulière e à une chaîne en l'ajoutant à elle-même, ce qui donne:
Les voyelles qui doivent être harmonisées ont une position supérieure à 9 dans la chaîne résultante. De plus, l'expression a été arrangée de telle manière que les voyelles avant äöy sont situées à des positions paires, tandis que les voyelles arrières aou sont situées à des positions impaires, à côté de leurs homologues.
D'où la formule de traduction suivante qui s'applique à chaque caractère c du mot de sortie:
la source
Python 3 ,
235231225221217215 octetsEssayez-le en ligne!
Enregistré
la source
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, puis sur la cinquième ligne:(F,B)
=>S
et(B,F)
=>S[::-1]
(Ceci est incompatible avec la suggestion donnée par @Lynn)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
pour quelques octets supplémentaires enregistrés.S=F,B='aöy','aou'
, puis sur la 4e ligne, changez(F,B)
pourS
.S=F,B=...
devrait économiser quelques octets si vous remplacez(F,B)
parS
Pyth, 84 octets
Essayez-le en ligne. Suite de tests.
Prouver que ce n'est pas si difficile dans les langues de golf. Un langage basé sur la pile pourrait faire encore mieux.
Pyth utilise ISO-8859-1 par défaut, donc
äö
un octet chacun.Explication
Q
, contenant la paire de mots d'entrée, est ajoutée implicitement.m
: mappez chaque motd
de l'entrée sur::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
: remplacezA
paraeiouyäö]
dans la chaîne pour obtenir l'expression régulière^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: recherchez tous les matchs et renvoyez leurs groupes de capture.h
: prendre le premier (et unique) match.t
: supprimer le premier groupe contenant l'intégralité du match._B
: paire avec revers pour obtenir[[first, second], [second, first]]
..b
: mappez chaque paire de motsN, Y
dans celle-ci pour:hY
: prenez les consonnes de début du deuxième mot.@N2
: prendre la première voyelle longue du premier mot, ouNone
.htY
: prendre la première voyelle du deuxième mot.J
: enregistrez-le dansJ
.*W
…2
: S'il y avait une voyelle longue, dupliquer la voyelle du deuxième mot.+
: ajoutez cela aux consonnes.c2"aouäöy"
: diviséaouäöy
en deux pour obtenir["aou", "äöy"]
.@DJ
: trie la paire par intersection avec la première voyelle du deuxième mot. Cela obtient la moitié avec la première voyelle du deuxième mot à la fin de la paire.A
: enregistrer la paire dansG, H
.e
: prendre la seconde moitié.}J
: voir si la première voyelle du deuxième mot est dans la seconde moitié.XW
…eNGH
: Si tel est le cas, mappez-G
leH
dans le suffixe du premier mot, sinon conservez le suffixe tel quel .+
: ajoutez le suffixe.la source