Syllabify İngilizce kelimeler - kind of


11

Bir metin dizesindeki kelimeleri hecelerle ayırarak heceleyecek bir program yazmakla görevlendirildiniz. Bu çok iş olurdu, bu yüzden bazı bölümleri atlamak istiyorsunuz, çünkü esasen mükemmel algoritma için gerekli telaffuzların bir tablosuna sahip olmak istemiyorsunuz. Ayrıca, bu görevin verilmesinin bir intikamı kadar mümkün olduğunca kısa (ve dolayısıyla okunamaz ve sürdürülemez) olmasını da istersiniz.

İki seçeneğiniz var:

  • Dizeyi STDIN'den alan ve sonucu STDOUT'a veren bir program yazın.
  • Dizeyi tek bir parametre olarak alan ve sonucu döndüren bir işlev yazın.

Şartname

  • Bu durumda dize, tercih ettiğiniz dilde (bayt dizileri, karakter dizileri, dizeler ...) herhangi bir dize benzeri yapı anlamına gelir.
  • Ünlüler a, e, i, o, u
  • Verilen dize 1 <= n <= 10, her biri 1 - 30karakterler arasında bir uzunluk ( dahil) içeren sözcüklere sahiptir. Çıktınız tireli kelimeler olmalıdır.
  • Tüm harfler küçüktür ve kelimeler her zaman boşluklarla ayrılır. Böylece, girdi karakterlerden oluşur[a-z ]
  • Kuralları önem sırasına göre uygulayın.
  • Bir kelime bölündüğünde, sözcüğün sağ yarısıyla tekrar başlayın.

Önem sırasına göre heceleme kuralları

İki ardışık aynı ünlüler biri (yani. Olarak saymak feettek sesli harf var, ancak beatve findingiki tane). Her hecede tam olarak bir sesli harf vardır, bu nedenle her sesli harf için bir hece vardır.

  1. Eğer tüm sözcük sadece dört harf vardır, bunlar değişmeden döndürür. (kelimenin geri kalanında bunu atla)
  2. Kelimede yalnızca bir sesli harf varsa, sözcüğü değiştirmeden geri gönderin.
  3. Kelimede birbirini takip eden iki sesli harf varsa, aralarında bölün (yani. diaspora-> di-as-po-ra)
  4. İki veya daha fazla ünsüz iki sesli harf (aynı veya farklı) arasına geldiğinde sis-ter, ünsüz kısım olmadığı sürece ilk ünsüzden (yani ) cksonra bölün, bu durumda kelimeyi ondan sonra bölün. (ör. nickel-> nick-el)
  5. A yiki sesli harf arasına geldiğinde, kelimeyi ondan sonra bölün (ör. paying-> pay-ing).
  6. Bir ünsüz iki sesli harf (aynı veya farklı) arasına geldiğinde, ünsüzün önüne bölün (yani. dra-gon)
  7. Bölme yapılamazsa kelimeyi değiştirmeden döndür.

Bu kuralları seçtim, çünkü sorunsuz bir şekilde tekrar tekrar uygulanabilirler ve telaffuz tablosu gerektirmezler. Bu nedenle, doğru değildirler ve örneğin kural # 5 genellikle doğru değildir. Genel durumda olsa da, öyle.

Misal

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

Emin x-e-nonmisin? Kural # 4 için referans?
John Dvorak

@JanDvorak "Bir kelime bölündüğünde, sözcüğün sağ yarısıyla tekrar başlayın." Ve ardından kural # 6.
seequ

Yani, # 4 kuralı sadece heceler arasında bölünmemeli mi?
John Dvorak

1
Kural 1 dört harfli kelimelerle ilgilenir. Dört harften daha az kelimeye ne dersiniz? ör.lua
Dijital Travma

1
@DigitalTrauma Normal olarak yargılanırlar, ancak nadiren iki hecesi vardır.
seequ

Yanıtlar:


6

Yakut, 144 bayt

Sürdürülebilir olmaya gidersek, tek bir dev regex'e ne dersin?

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

bazı çıktı:

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

8

Lua, 292

Lua bunu yapmak için en iyi dil olmayabilir, ama işe yarıyor. Sorulan soru gibi hemen hemen akıyor. Kurallar temel olarak bazı optimizasyonlar için geçerlidir: # 2 atlanır (başlangıçta "ck" ile bir sesli harf kelimesi olmadığı sürece gerekli değildir) ve ck ve y kuralları, # 4 ve # 6 birleştirilir. Kelimedeki bazı sesli harflerin iki kez yakalanması gerektiğinden (bir tire ve diğerinden önce), bu arama iki kez yapılır.

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

Ungolfed

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

Burada test edin: http://ideone.com/g57TzA


Yakutum yok, ama gerçekten iyi görünüyor.
seequ

4

Bash + coreultils, 173 bayt

En son kural değişikliklerinin hepsine sahip olduğumu düşünüyorum:

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 \ 

Son satırın son karakterinin bir (boşluk) olduğuna dikkat edin .

Bu "okunamaz ve sürdürülemez" ;-) yeterli tatmin edici düşünüyorum

STDIN'den girdi alır.

Çoğunlukla düz regex ikamesi. sedİfadenin ilk satırı kural 1 ve 2 ile eşleşir, daha sonra :xifadenin sonundaki etikete atlar .

trOnlar için daha kolaydır böylece başlangıç ve boru hattının sonundaki s kelimeler ayrılmış yeni satır yapmak seduğraşmak. Yapmayı umuyordum ve sedcevap verdim ama bu şekilde daha basit ve daha kolay.

Misal:

$ ./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 $ 

Argh, 3. kuralın değiştiğini unutmaya devam ediyorum. Bu iyi.
seequ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.