Tantangan ini didasarkan pada, dan berisi uji kasus dari, kursus pemrograman yang saya ikuti di Universitas Aalto. Materi digunakan dengan izin.
Dua setengah tahun yang lalu ada tantangan tentang spoonerisme dalam bahasa Inggris . Namun, dalam spoonerisme Finlandia jauh lebih rumit.
Spoonerisme dalam bahasa Finlandia
Dalam bahasa Finlandia, vokal adalah aeiouyäö
dan konsonan adalah bcdfghjklmnpqrstvwxz
. ( å
secara teknis bagian dari bahasa Finlandia, tetapi tidak dipertimbangkan di sini.)
Spoonerisme paling dasar hanya mengambil vokal pertama dari setiap kata, dan setiap konsonan yang mendahuluinya, dan menukar bagian-bagiannya:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Vokal panjang
Beberapa kata mengandung dua vokal berturut-turut yang sama. Dalam kasus tersebut, pasangan vokal harus ditukar dengan vokal pertama kata lain, memperpendek atau memperpanjang vokal agar panjangnya tetap sama.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
Dalam hal dua vokal berturut-turut yang berbeda ini tidak berlaku:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Tiga atau lebih huruf berturut-turut yang sama tidak akan muncul di input.
Harmoni vokal
Bahasa Finlandia memiliki hal yang indah yang disebut harmoni vokal . Pada dasarnya, ini berarti bahwa vokal belakang aou
dan vokal depan äöy
tidak boleh muncul dengan kata yang sama.
Ketika swapping depan atau belakang vokal dalam kata, semua vokal dari jenis lain di sisa kata harus diubah agar sesuai dengan awal baru dari kata ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
dan i
netral dan dapat muncul dengan semua surat lainnya; menukarnya dengan kata tidak boleh menyebabkan perubahan pada kata lainnya.
Kasus khusus
Harmoni vokal tidak berlaku untuk beberapa kata, termasuk banyak kata pinjaman dan kata majemuk. Kasus-kasus ini tidak perlu ditangani "dengan benar".
Tantangan
Diberi dua kata, tampilkan kata-kata spoonerised.
Kata-kata input hanya akan berisi karakter a-z
dan äö
. Anda dapat memilih untuk menggunakan huruf besar atau kecil, tetapi pilihan Anda harus konsisten antara kata dan input / output.
I / O dapat dilakukan dalam format yang mudah . (Kata-kata harus dianggap string atau array karakter.)
Ini adalah kode-golf , jadi solusi terpendek dalam byte menang.
U+0308 COMBINING DIAERESIS
harus ditangani denganU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
baik-baik saja.)e
dani
netral, apakahfihus keksy
,huvu lehy
danlesmä prihti
jawaban yang dapat diterimakehys fiksu
,levy huhu
danprisma lehti
masing - masing?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Jawaban:
JavaScript (ES6),
196175 byteMengambil kata sebagai dua string dalam sintaks currying
(a)(b)
. Mengembalikan array dua array karakter.Cobalah online!
Bagaimana?
Setiap kata input dilewatkan melalui ekspresi reguler e , yang memiliki 4 grup penangkap:
Fungsi helper g () mengambil semua grup penangkap kata untuk diperbarui sebagai [] dan grup penangkap pertama dan kedua dari kata lain sebagai c dan v .
Kami menerapkan spoonerisme dasar dan menangani vokal panjang dengan:
Untuk menerapkan harmoni vokal, pertama-tama kita memaksa ekspresi reguler e ke string dengan menambahkannya sendiri, yang memberikan:
Vokal yang perlu diselaraskan memiliki posisi lebih besar dari 9 pada string yang dihasilkan. Lebih jauh, ekspresi diatur sedemikian rupa sehingga vokal depan äöy berada di posisi genap, sedangkan vokal belakang Anda berada di posisi ganjil, di sebelah rekan-rekan mereka.
Maka rumus terjemahan berikut yang diterapkan pada setiap karakter c dari kata keluaran:
sumber
Python 3 ,
235231225221217215 byteCobalah online!
Diselamatkan
sumber
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, kemudian pada baris kelima:(F,B)
=>S
dan(B,F)
=>S[::-1]
(Ini tidak sesuai dengan saran yang diberikan @Lynn)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
untuk menyimpan beberapa byte lagi.S=F,B='aöy','aou'
, dan kemudian pada baris ke-4 ubah(F,B)
menjadiS
.S=F,B=...
harus menyimpan beberapa byte jika Anda ganti(F,B)
denganS
Pyth, 84 byte
Cobalah online. Suite uji.
Membuktikan bahwa itu tidak yang keras dalam bahasa golf. Bahasa berbasis tumpukan mungkin lebih baik.
Pyth menggunakan ISO-8859-1 secara default, jadi
äö
masing-masing satu byte.Penjelasan
Q
, yang mengandung pasangan input kata, ditambahkan secara implisit.m
: memetakan setiap katad
dalam input ke::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
: gantiA
denganaeiouyäö]
dalam string untuk mendapatkan regex^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: temukan semua kecocokan dan kembalikan grup penangkapnya.h
: ambil pertandingan pertama (dan satu-satunya).t
: jatuhkan grup pertama yang berisi seluruh pertandingan._B
: pasangkan dengan terbalik untuk mendapatkan[[first, second], [second, first]]
..b
: memetakan setiap pasangan kataN, Y
ke:hY
: ambil konsonan awal kata kedua.@N2
: ambil vokal pertama panjang dari kata pertama, atauNone
.htY
: ambil vokal pertama dari kata kedua.J
: simpan itu diJ
.*W
...2
: jika ada vokal panjang, duplikat vokal kata kedua.+
: menambahkan itu ke konsonan.c2"aouäöy"
: dibagiaouäöy
dua untuk mendapatkan["aou", "äöy"]
.@DJ
: urutkan pasangan berdasarkan persimpangan dengan vokal pertama dari kata kedua. Ini mendapat setengah dengan vokal pertama kata kedua di akhir pasangan.A
: simpan pasangan keG, H
.e
: ambil babak kedua.}J
: lihat apakah vokal pertama kata kedua ada di babak kedua.XW
…eNGH
: Jika ya, petakanG
keH
dalam akhiran kata pertama, jika tidak biarkan sufiks apa adanya.+
: tambahkan akhiran.sumber