Tổng hợp các từ tiếng Anh - loại


11

Bạn được giao nhiệm vụ viết một chương trình tổng hợp các từ trong một chuỗi văn bản, bằng cách tách chúng bằng dấu gạch nối. Đó sẽ là rất nhiều công việc, vì vậy bạn muốn bỏ qua một số phần, chủ yếu là vì bạn không muốn có một bảng phát âm cần thiết cho thuật toán hoàn hảo. Bạn cũng muốn làm cho nó càng ngắn (và do đó không thể đọc được và không thể nhận ra) càng tốt như một sự trả thù cho việc được giao nhiệm vụ này.

Bạn có hai lựa chọn:

  • Viết chương trình lấy chuỗi từ STDIN và đưa kết quả ra STDOUT.
  • Viết hàm lấy chuỗi làm tham số đơn và trả về kết quả.

Sự chỉ rõ

  • Trong trường hợp này, chuỗi có nghĩa là bất kỳ cấu trúc giống chuỗi nào trong ngôn ngữ bạn chọn (mảng byte, mảng ký tự, chuỗi ...).
  • Nguyên âm là a, e, i, o, u
  • Chuỗi đã cho có các 1 <= n <= 10từ, trong đó mỗi chuỗi có độ dài giữa các 1 - 30ký tự, bao gồm .. Đầu ra của bạn phải là những từ được gạch nối.
  • Tất cả các chữ cái là chữ thường và các từ luôn được phân cách bằng dấu cách. Do đó, đầu vào bao gồm các ký tự[a-z ]
  • Áp dụng các quy tắc theo thứ tự quan trọng.
  • Khi một từ được chia, bắt đầu lại với một nửa bên phải của từ.

Quy tắc cho âm tiết , theo thứ tự quan trọng

Hai nguyên âm liên tiếp cùng tính là một (tức là. feetChỉ có một nguyên âm, nhưng beatfindingcó hai). Mỗi âm tiết có chính xác một nguyên âm, do đó có một âm tiết cho mỗi nguyên âm.

  1. Nếu toàn bộ từ chỉ có bốn chữ cái, trả lại nó không thay đổi. (bỏ qua phần này cho phần còn lại của từ)
  2. Nếu từ chỉ có một nguyên âm, trả lại từ không thay đổi.
  3. Nếu từ có hai nguyên âm liên tiếp, hãy phân chia giữa chúng (nghĩa là diaspora-> di-as-po-ra)
  4. Khi hai hoặc nhiều phụ âm nằm giữa hai nguyên âm (giống hoặc khác nhau), hãy chia sau phụ âm đầu tiên (nghĩa là sis-ter) trừ khi phần phụ âm là ck, trong trường hợp đó chia từ sau nó. (tức là nickel-> nick-el)
  5. Khi a yđến giữa hai nguyên âm, chia từ sau nó (ví dụ paying-> pay-ing).
  6. Khi một phụ âm nằm giữa hai nguyên âm (giống hoặc khác nhau), hãy chia trước phụ âm (nghĩa là dra-gon)
  7. Trả lại từ không thay đổi nếu không có phân chia có thể được thực hiện.

Tôi đã chọn các quy tắc này, bởi vì chúng có thể được áp dụng đệ quy mà không gặp vấn đề gì và không yêu cầu bảng phát âm. Do đó, chúng không chính xác và ví dụ quy tắc số 5 thường không chính xác. Trong trường hợp chung mặc dù, nó là.

Thí dụ

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

Bạn có chắc chắn về x-e-non? Tham chiếu cho quy tắc số 4?
John Dvorak

@JanDvorak "Khi một từ được chia, hãy bắt đầu lại với nửa bên phải của từ.", Tiếp theo là quy tắc số 6.
xem

Ý tôi là, không nên quy tắc số 4 chỉ phân chia giữa các âm tiết?
John Dvorak

1
Quy tắc số 1 liên quan đến bốn chữ cái từ. Còn những từ có ít hơn bốn chữ cái thì sao? ví dụlua
Digital Chấn thương

1
@DigitalTrauma Họ được công nhận bình thường, nhưng hiếm khi có hai âm tiết.
xem

Câu trả lời:


6

Ruby, 144 byte

Nếu chúng ta không thể đo lường được, thì còn một regex khổng lồ thì sao?

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

một số đầu ra:

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 có thể không phải là ngôn ngữ tốt nhất để làm điều này, nhưng nó hoạt động. Nó khá nhiều dòng chảy như câu hỏi. Các quy tắc chủ yếu theo thứ tự với một số tối ưu hóa: # 2 bị bỏ qua (không cần thiết trừ khi có một từ nguyên âm với "ck" ở đầu) và các quy tắc ck và y được thông qua trước phần còn lại của # 4 và # 6, được kết hợp. Vì một số nguyên âm trong từ cần phải được ghi lại hai lần (sau một dấu gạch nối và trước một dấu gạch nối khác), tìm kiếm đó được thực hiện hai lần.

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

Ung dung

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

Kiểm tra nó ở đây: http://ideone.com/g57TzA


Tôi không có ruby, nhưng nó thực sự tốt.
xem

4

Bash + coreultils, 173 byte

Tôi nghĩ rằng tôi có tất cả các thay đổi quy tắc mới nhất:

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 \ 

Lưu ý ký tự cuối cùng của dòng cuối cùng là một (khoảng trắng).

Tôi nghĩ rằng điều này đủ thỏa mãn "không thể đọc được và không thể nhầm lẫn" ;-)

Lấy đầu vào từ STDIN.

Chủ yếu là thay thế regex thẳng. Dòng đầu tiên của sedbiểu thức khớp với quy tắc 1 và 2, sau đó chỉ cần nhảy đến :xnhãn ở cuối biểu thức.

Các trs ở đầu và cuối của đường ống làm cho các từ được phân tách bằng dòng mới, vì vậy chúng dễ sedxử lý hơn. Tôi đã hy vọng để làm và tất cả sedtrả lời, nhưng cách này đơn giản và dễ dàng hơn.

Thí dụ:

$ ./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, tôi tiếp tục quên quy tắc số 3 đã thay đổi. Tốt rồi.
hẹn gặp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.