Suku kata bahasa Inggris - jenis

11

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 <= 10kata-kata, di mana masing-masing memiliki panjang antara 1 - 30karakter, 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 feetmemiliki satu vokal, tetapi beatdan findingmemiliki dua). Setiap suku kata memiliki tepat satu vokal, sehingga ada satu suku kata untuk setiap vokal.

  1. Jika seluruh kata hanya memiliki empat huruf, kembalikan tidak berubah. (lewati ini selama sisa kata)
  2. Jika kata hanya memiliki satu vokal, kembalikan kata tidak berubah.
  3. Jika kata tersebut memiliki dua vokal berturut-turut, bagilah di antara keduanya (mis. diaspora-> di-as-po-ra)
  4. Ketika dua atau lebih konsonan berada di antara dua vokal (sama atau berbeda), bagi setelah konsonan pertama (yaitu. sis-ter) Kecuali bagian konsonan ck, dalam hal ini membagi kata setelah itu. (mis. nickel-> nick-el)
  5. Ketika a ymuncul di antara dua vokal, bagilah kata setelahnya (mis. paying-> pay-ing).
  6. Ketika satu konsonan muncul di antara dua vokal (sama atau berbeda), bagi sebelum konsonan (mis. dra-gon)
  7. 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
seequ
sumber
Anda yakin tentang itu x-e-non? Referensi untuk aturan # 4?
John Dvorak
@JanDvorak "Ketika sebuah kata dibagi, mulai lagi dengan bagian kanan kata.", Diikuti oleh aturan # 6.
seequ
Maksud saya, bukankah seharusnya aturan # 4 hanya terbagi antara suku kata?
John Dvorak
1
Aturan # 1 berkaitan dengan empat huruf kata. Bagaimana dengan kata-kata dengan kurang dari empat huruf? misalnyalua
Digital Trauma
1
@DigitalTrauma Mereka dituntut secara normal, tetapi jarang memiliki dua suku kata.
seequ

Jawaban:

6

Ruby, 144 byte

Jika kita pergi untuk yang tidak dapat dipastikan, bagaimana dengan satu regex raksasa?

puts gets.split.map {|w| w.scan(/(^.{4}$|[^aeiou]*([aeiou])\2?((?=[^aeiouy]?[aeiou])|ck|[^aeiou]((?=.*[aeiou])|.*$)|$))/).map(&:first)*'-'}*' '

beberapa output:

echo "hello world" | ruby syllable.rb
hel-lo world

echo "have a nice day" | ruby syllable.rb
have a nice day

echo "pour some nickel and xenon in there" | ruby syllable.rb
pour some nick-el and xe-non in the-re

echo "diaspora dragon paying sister hemlock happy quicksilver" | ruby syllable.rb
di-as-po-ra dra-gon pay-ing sis-ter hem-lock happy qu-ick-sil-ver
YenTheFirst
sumber
8

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.

i=io.read()v="([aeiou])"for s in i:gfind("%l+ ?")do
if s:len()~=4 then
s=s:gsub(v..v,function(x,y)if x==y then return x..y;end;return x.."-"..y;end)s=s:gsub("ck"..v,"ck-%1")s=s:gsub(v.."y"..v,"%1y-%2")for b=1,2 do
s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")end
end
io.write(s)end

Tidak disatukan

function checkEquals(x,y)
    if x==y then 
        return x..y
    end
    return x.."-"..y
end
i=io.read()
v="([aeiou])"
for s in i:gfind("%l+ ?") do
    if s:len()~=4 then
        s=s:gsub(v..v,checkEquals)
        s=s:gsub("ck"..v,"ck-%1")
        s=s:gsub(v.."y"..v,"%1y-%2")
        for b=1,2 do
            s=s:gsub(v.."([^aeiou\-]?)([^aeiou\-]+)"..v,"%1%2-%3%4")
        end
    end
    io.write(s)
end

Uji di sini: http://ideone.com/g57TzA

Perhubungan
sumber
Saya tidak memiliki ruby, tetapi tampaknya memang baik-baik saja.
seequ
4

Bash + coreultils, 173 byte

Saya pikir saya memiliki semua perubahan aturan terbaru:

v=aeiou
r="[$v])/\1-\2/g"
s=s/\([$v]
e="$s[^$v-])([^$v-]+$r
"
tr \  \\n|sed -r "/^([a-z]{4}|[^$v]*[$v][^$v]*)$/bx
$s)($r
${s}ck)($r
$e$e${s}y)($r
$s)([^$v-]$r
:x"|tr \\n \ 

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 sedekspresi cocok dengan aturan 1 dan 2, lalu lompat ke :xlabel di akhir ekspresi.

Huruf trawal dan akhir pipeline membuat kata-kata terpisah baris, sehingga lebih mudah untuk sedditangani. Saya berharap untuk melakukan dan semua sedjawaban, tetapi cara ini lebih sederhana dan lebih mudah.

Contoh:

$ ./sylabify.sh <<< "diaspora nickel sister dragon hello world have a nice day pour some nickel and xenon there paying tricks quicksilver"
di-as-po-ra nick-el sis-ter dra-gon hel-lo world have a nice day pour some nick-el and xe-non the-re pay-ing tricks qu-ic-ksil-ver $ 
Trauma Digital
sumber
Argh, saya selalu lupa aturan # 3 berubah. Tidak apa-apa.
seequ