Spoonerise单词…用芬兰语


19

这个挑战基于我在阿尔托大学(Aalto University)上的一门编程课程,并包含来自该课程的测试案例。该材料经许可使用。

两年半前,英语中的尖刺主义面临挑战。但是,在芬兰,勺子主义要复杂得多。

芬兰语中的语

在芬兰语中,元音为aeiouyäö,辅音为bcdfghjklmnpqrstvwxz。(å从技术上讲,这是芬兰语的一部分,但在此不予考虑。)

最基本的竖笛演奏只取每个单词的第一个元音以及它们前面的任何辅音,然后交换各部分:

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

长元音

有些单词包含两个相同的连续元音。在这种情况下,必须将元音对与另一个单词的第一个元音交换,缩短或延长元音以保持长度不变。

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

对于两个不同的连续元音,这不适用于:

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

同一连续字母中的三个或三个以上不会出现在输入中。

元音和声

芬兰语有这种可爱的东西,叫做元音和声。基本上,这意味着后元音 aou前元音 äöy不应出现在同一单词中。

当交换前面或后面的元音成一个字,其他类型的单词的其余所有元音应该改变以匹配字的新的开始(a <-> äo <-> öu <-> y):

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

e并且i是中性的,并且可能与所有其他字母一起出现;将它们交换为一个单词一定不能导致其余单词的更改。

特别案例

元音和声不适用于某些词,包括许多借词和复合词。这些情况不需要“正确”处理。

挑战

给定两个单词,输出单词挖出的。

输入的单词将仅包含字符a-zäö。您可以选择使用大写或小写,但是您的选择在单词和输入/输出之间必须保持一致。

I / O可以采用任何方便的格式进行。(单词应视为字符串或字符数组。)

这是,因此以字节为单位的最短解决方案为准。

测试用例


我们可以选择输入/输出编码吗?另外,要求输入使用变音符号而不是单个字符是可以接受的吗?
门把手

@Doorknob您可以选择任何编码,但是文本将使用NFC(即没有组合字符)。编码可能是与某些语言兼容的情况,但NFC / NFD可能不会。(任何可以处理的U+0308 COMBINING DIAERESIS都应该可以处理U+00E4 LATIN SMALL LETTER A WITH DIAERESIS。)
PurkkaKoodari

1
由于ei是中性的,是fihus keksyhuvu lehylesmä prihti可以接受的答案kehys fiksulevy huhuprisma lehti分别?
Arnauld

1
顺带:由于元音长且元音和谐,芬兰的勺子演奏不是强制性的功能。例如:puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
Arnauld

@Arnauld不。我将更新问题;中性元音应保持不变。
PurkkaKoodari

Answers:


9

的JavaScript(ES6),196个 175字节

在currying语法中将单词作为两个字符串(a)(b)。返回由两个字符组成的数组。

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

在线尝试!

怎么样?

每个输入词都通过正则表达式e传递,该正则表达式有4个捕获组:

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

辅助函数g()将要更新的单词的所有捕获组作为a [],将另一个单词的第一和第二捕获组作为cv

我们采用基本的笔尖主义,并通过以下方式照顾长元音:

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

为了使元音和谐,我们首先将正则表达式e强制添加到字符串中,从而将其强制添加到字符串中,从而得到:

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

需要协调的元音在结果字符串中的位置大于9。此外,该表述的排列方式是,前元音äöy位于偶数位置,而后元音aou位于奇数位置,与对应的元音相邻

因此,以下翻译公式适用于输出单词的每个字符c

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

4

Python 3中235个 231 225 221 217 215字节

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

在线尝试!


已保存

  • -2个字节,感谢Lynn
  • -4个字节,感谢Zacharý

2
使用以下方法保存两个字节:fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
Lynn

1
更妙的是:你可以改变第二行S='äöy','aou',然后在第五行:(F,B)=> S(B,F)=> S[::-1](这是@Lynn给的建议不兼容)
扎卡里

同样,您可以将第四行更改e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]为保存更多字节。
扎卡里

我的意思是:将第二行改为S=F,B='aöy','aou',然后将第四行更改(F,B)S
扎卡里

S=F,B=...如果替换(F,B)S
–Zacharý18年

0

Pyth,84个字节

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

在线尝试。 测试套件。

证明这不是很难在高尔夫的语言。基于堆栈的语言可能会做得更好。

Pyth默认使用ISO-8859-1,因此äö每个都是一个字节。

说明

  • Q包含输入的单词对,则被隐式附加。
  • md将输入中的每个单词映射到:
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]":替换Aaeiouyäö]的字符串中获得正则表达式^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
    • :d:找到所有匹配项并返回其捕获组。
    • h:参加第一个(也是唯一一个)比赛。
    • t:删除包含整个匹配项的第一组。
  • _B:与反向配对获得[[first, second], [second, first]]
  • .b:将其中的每个单词映射N, Y到:
    • hY:取第二个单词的开头辅音。
    • @N2:拿第一个单词的长元音或None
    • htY:取第二个单词的第一个元音。
    • J:保存在J
    • *W2:如果元音很长,请复制第二个单词的元音。
    • +:将其附加到辅音中。
    • c2"aouäöy":一分为aouäöy["aou", "äöy"]
    • @DJ:通过与第二个单词的第一个元音的交集对对进行排序。这是一对中第二个单词的第一个元音的一半。
    • A:将货币对保存到G, H
    • e:拿下半场。
    • }J:查看第二个单词的第一个元音是否在下半部分。
    • XWeNGH:如果是,请映射GH第一个单词的后缀,否则保持原样。
    • +:附加后缀。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.