Syllabify 영어 단어-종류


11

텍스트 문자열로 단어를 구분하여 하이픈으로 분리하는 프로그램을 작성해야합니다. 그것은 많은 작업이 될 것입니다. 따라서 완벽한 알고리즘에 필요한 발음 표를 원하지 않기 때문에 일부 부분을 건너 뛰고 싶습니다. 또한이 과제에 대한 복수로서 가능한 짧게 (따라서 읽을 수없고 유지 보수 할 수없는) 것으로 만들고자합니다.

두 가지 선택이 있습니다.

  • STDIN에서 문자열을 가져 와서 결과를 STDOUT으로 출력하는 프로그램을 작성하십시오.
  • 문자열을 단일 매개 변수로 사용하고 결과를 리턴하는 함수를 작성하십시오.

사양

  • 이 경우 string은 선택한 언어 (바이트 배열, 문자 배열, 문자열 ...)로 된 문자열과 유사한 구문을 의미합니다.
  • 모음은 a, e, i, o, u
  • 주어진 문자열은 1 <= n <= 10단어를 포함하는데, 여기서 각각의 1 - 30문자 사이에는 길이가 포함됩니다. 출력은 하이픈으로 묶어야합니다.
  • 모든 문자는 소문자이며 단어는 항상 공백으로 구분됩니다. 따라서 입력은 문자로 구성됩니다[a-z ]
  • 중요한 순서대로 규칙을 적용하십시오.
  • 단어를 나누면 단어의 오른쪽 절반부터 다시 시작하십시오.

중요도 에 따른 음절 규칙

두 개의 연속 된 동일한 모음은 하나로 계산됩니다 (즉 feet, 하나의 모음 만 beat있고 finding두 개가 있음). 모든 음절에는 정확히 하나의 모음이 있으므로 각 모음마다 하나의 음절이 있습니다.

  1. 경우 전체 단어가 네 개의 문자를 가지고, 그것은 변하지 돌아갑니다. (이 단어의 나머지 부분을 위해 이것을 건너 뛰십시오)
  2. 단어에 모음이 하나만 있으면 변경되지 않은 단어를 반환하십시오.
  3. 단어에 두 개의 연속 모음이있는 경우 두 모음을 나눕니다 (예 : diaspora-> di-as-po-ra).
  4. 두 개 이상의 자음이 두 모음 (동일하거나 다른) 사이에있을 때 sis-ter, 자음 부분이 아닌 경우 첫 번째 자음 (즉 ck,)으로 나눕니다. (예 : nickel-> nick-el)
  5. y두 모음 사이에 a 가 오면 그 단어 뒤에 단어를 나눕니다 (예 : paying-> pay-ing).
  6. 하나 개의 자음은 자음 전에 두 (동일하거나 서로 다른) 모음, 분할 사이에 올 때 (예. dra-gon)
  7. 나눌 수 없다면 단어를 바꾸지 마십시오.

이 규칙은 문제없이 재귀 적으로 적용 할 수 있고 발음 표가 필요하지 않기 때문에 선택했습니다. 따라서 그것들은 정확하지 않으며, 예를 들어 규칙 # 5는 종종 정확하지 않습니다. 그러나 일반적인 경우입니다.

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합니까? 규칙 # 4에 대한 참조?
John Dvorak

@JanDvorak "단어를 나누면 단어의 오른쪽 절반부터 다시 시작하십시오."다음에 규칙 # 6이 나옵니다.
seequ

규칙 # 4가 음절 사이에서만 나뉘어서는 안됩니까?
John Dvorak

1
규칙 # 1은 네 글자 단어를 다룹니다. 네 글자 미만의 단어는 어떻습니까? 예lua
디지털 외상

1
@DigitalTrauma 그들은 정상적으로 소집되지만 거의 두 음절이 없습니다.
seequ

답변:


6

루비, 144 바이트

우리가 유지할 수 없다면, 하나의 거대한 정규 표현식은 어떻습니까?

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

일부 출력 :

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

루아, 292

루아는 이것을하기에 가장 적합한 언어는 아니지만 작동합니다. 질문과 같이 거의 흐릅니다. 규칙은 주로 일부 최적화와 함께 순서대로 진행됩니다. # 2는 건너 뛰고 (처음에 "ck"가 포함 된 모음 단어가 없으면 필요하지 않습니다.) ck 및 y 규칙은 나머지 # 4와 # 6이 결합되어 있습니다. 단어의 일부 모음은 한 하이픈 다음과 다른 하이픈 앞에 두 번 캡처되어야하므로 검색이 두 번 수행됩니다.

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

언 골프

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

여기에서 테스트하십시오 : http://ideone.com/g57TzA


나는 루비가 없지만 실제로는 괜찮아 보입니다.
seequ

4

Bash + coreultils, 173 바이트

최신 규칙이 모두 변경되었다고 생각합니다.

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 \ 

마지막 줄의 마지막 문자는 (공백)입니다.

나는 이것이 "판독 불가능하고 유지 불가능한" ;-)을 충분히 만족한다고 생각한다.

STDIN에서 입력을받습니다.

대체로 정규식 대체입니다. sed표현식 의 첫 번째 줄은 규칙 1 및 2와 일치 한 다음 :x표현식 끝의 레이블 로 간단히 이동합니다 .

tr파이프 라인의 시작과 끝에 있는 s는 단어를 줄 바꿈으로 구분 sed하여 처리 하기가 더 쉽습니다 . 나는하고 모든 sed답변을 원했지만이 방법은 더 간단하고 쉽습니다.

예:

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

아아, 나는 규칙 3이 바뀌 었다는 것을 잊고있다. 괜찮아.
seequ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.