Anda ditugaskan menulis program yang menyusun kata-kata dalam serangkaian teks, dengan memisahkannya dengan tanda hubung. Itu akan banyak pekerjaan, jadi Anda ingin melewati beberapa bagian, terutama karena Anda tidak ingin memiliki tabel pengucapan yang diperlukan untuk algoritma yang sempurna. Anda juga ingin membuatnya sesingkat mungkin (dan karenanya tidak dapat dibaca dan tidak dapat dipelihara) sebagai balas dendam karena diberi tugas ini.
Anda memiliki dua pilihan:
- Tulis program yang mengambil string dari STDIN dan output hasilnya ke STDOUT.
- Tulis fungsi yang menggunakan string sebagai parameter tunggal, dan mengembalikan hasilnya.
Spesifikasi
- Dalam hal ini, string berarti konstruksi seperti string dalam bahasa pilihan Anda (array byte, array karakter, string ...).
- Vokal adalah
a, e, i, o, u
- String yang diberikan memiliki
1 <= n <= 10
kata-kata, di mana masing-masing memiliki panjang antara1 - 30
karakter, inklusif .. Output Anda harus kata-kata ditulis dgn tanda penghubung. - Semua huruf kecil dan kata-kata selalu dipisahkan dengan spasi. Jadi, input terdiri dari karakter
[a-z ]
- Terapkan aturan dalam urutan kepentingan.
- Ketika sebuah kata dibagi, mulai lagi dengan bagian kanan kata tersebut.
Aturan untuk silabifikasi , sesuai urutan kepentingannya
Dua vokal yang sama berturut-turut dihitung sebagai satu (mis. Hanya feet
memiliki satu vokal, tetapi beat
dan finding
memiliki dua). Setiap suku kata memiliki tepat satu vokal, sehingga ada satu suku kata untuk setiap vokal.
- Jika seluruh kata hanya memiliki empat huruf, kembalikan tidak berubah. (lewati ini selama sisa kata)
- Jika kata hanya memiliki satu vokal, kembalikan kata tidak berubah.
- Jika kata tersebut memiliki dua vokal berturut-turut, bagilah di antara keduanya (mis.
diaspora
->di-as-po-ra
) - Ketika dua atau lebih konsonan berada di antara dua vokal (sama atau berbeda), bagi setelah konsonan pertama (yaitu.
sis-ter
) Kecuali bagian konsonanck
, dalam hal ini membagi kata setelah itu. (mis.nickel
->nick-el
) - Ketika a
y
muncul di antara dua vokal, bagilah kata setelahnya (mis.paying
->pay-ing
). - Ketika satu konsonan muncul di antara dua vokal (sama atau berbeda), bagi sebelum konsonan (mis.
dra-gon
) - Kembalikan kata tidak berubah jika tidak ada pembagian yang bisa dilakukan.
Saya memilih aturan-aturan ini, karena mereka dapat diterapkan secara rekursif tanpa masalah dan tidak memerlukan tabel pengucapan. Dengan demikian, mereka tidak akurat, dan misalnya aturan # 5 sering tidak benar. Namun, dalam kasus umum.
Contoh
In: hello world
Out: hel-lo world
In: have a nice day
Out: have a nice day
In: pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re
x-e-non
? Referensi untuk aturan # 4?lua
Jawaban:
Ruby, 144 byte
Jika kita pergi untuk yang tidak dapat dipastikan, bagaimana dengan satu regex raksasa?
beberapa output:
sumber
Lua, 292
Lua mungkin bukan bahasa terbaik untuk melakukan ini, tetapi berhasil. Cukup banyak mengalir seperti pertanyaan yang diajukan. Aturan utamanya adalah dengan beberapa optimasi: # 2 dilewati (tidak diperlukan kecuali ada satu kata vokal dengan "ck" di awal), dan aturan ck dan y dilalui sebelum sisa # 4 dan # 6, yang digabungkan. Karena beberapa vokal dalam kata perlu ditangkap dua kali (setelah satu tanda hubung dan sebelum yang lain), pencarian itu dilakukan dua kali.
Tidak disatukan
Uji di sini: http://ideone.com/g57TzA
sumber
Bash + coreultils, 173 byte
Saya pikir saya memiliki semua perubahan aturan terbaru:
Perhatikan karakter terakhir dari baris terakhir adalah
(spasi).
Saya pikir ini cukup memuaskan "tidak terbaca dan tidak dapat dipelihara" ;-)
Mengambil input dari STDIN.
Substitusi regex paling lurus. Baris pertama
sed
ekspresi cocok dengan aturan 1 dan 2, lalu lompat ke:x
label di akhir ekspresi.Huruf
tr
awal dan akhir pipeline membuat kata-kata terpisah baris, sehingga lebih mudah untuksed
ditangani. Saya berharap untuk melakukan dan semuased
jawaban, tetapi cara ini lebih sederhana dan lebih mudah.Contoh:
sumber