คำสปูนทั้งหมด…ในฟินแลนด์


19

ความท้าทายนี้ขึ้นอยู่กับและประกอบด้วยกรณีทดสอบจากหลักสูตรการเขียนโปรแกรมที่ฉันเรียนที่มหาวิทยาลัย Aalto วัสดุที่ใช้มีสิทธิ์

สองปีครึ่งที่ผ่านมามีความท้าทายเกี่ยวกับspoonerisms ในภาษาอังกฤษ อย่างไรก็ตามในช้อนชาวฟินแลนด์มีความซับซ้อนมากขึ้น

สปูนในฟินแลนด์

ในฟินแลนด์, สระที่มีและพยัญชนะที่มี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ไม่ควรปรากฏในคำเดียวกัน

เมื่อการแลกเปลี่ยนด้านหน้าหรือด้านหลังสระลงใน word, สระทั้งหมดของชนิดอื่น ๆ ในส่วนที่เหลือของคำว่าควรจะมีการเปลี่ยนแปลงเพื่อให้ตรงกับการเริ่มต้นใหม่ของคำว่า ( 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
ตั้งแต่eและiเป็นกลางมีfihus keksy, huvu lehyและlesmä prihtiคำตอบที่ได้รับการยอมรับสำหรับkehys fiksu, levy huhuและprisma lehtiตามลำดับ?
Arnauld

1
เป็นความคิดเห็นด้านเนื่องจากความยาวสระและสระสามัคคี, คำผวนฟินแลนด์ไม่ได้เป็นฟังก์ชั่น involutory ตัวอย่างเช่น: puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri.
Arnauld

@Arnauld ไม่ฉันจะอัปเดตคำถาม สระกลางไม่ควรทำให้เกิดการเปลี่ยนแปลง
PurkkaKoodari

คำตอบ:


9

JavaScript (ES6), 196 175 ไบต์

(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 ()ใช้กลุ่มการบันทึกทั้งหมดของคำเพื่ออัปเดตเป็น[]และกลุ่มการจับภาพที่หนึ่งและสองของคำอื่น ๆ เป็นและโวลต์

เราใช้การตักแบบพื้นฐานและดูแลสระที่ยาวด้วย:

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 ให้)
Zacharý

นอกจากนี้คุณสามารถเปลี่ยนบรรทัดที่สี่e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]เป็นอีกไม่กี่ไบต์ที่บันทึกไว้
Zacharý

สิ่งที่ฉันหมายถึงว่า: บรรทัดที่ 2 S=F,B='aöy','aou'และจากนั้นในการเปลี่ยนแปลงสาย 4 ไป(F,B) S
Zacharý

S=F,B=...ควรบันทึกสองสามไบต์ถ้าคุณแทนที่(F,B)ด้วยS
Zacharý

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ที่มีคำที่ป้อนเข้าคู่จะถูกผนวกเข้าด้วยกัน
  • m: แมปคำแต่ละคำdในอินพุตกับ:
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]": แทนที่Aด้วยaeiouyäö]ในสายที่จะได้รับ ^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)regex
    • :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: ถ้าเป็นแผนที่Gให้Hที่คำต่อท้ายของคำแรกมิฉะนั้นให้ต่อท้ายตามที่เป็นอยู่
    • +: ผนวกส่วนต่อท้าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.