단어를 다른 단어로 분해합니다 (예 : "afterglow"= "aft"+ "erg"+ "low")


13

여기 당신의 모든 대장장이를위한 것이 있습니다! 단어 목록을 가져 와서 각 단어에 대해 가능한 모든 분해 분해 목록을 생성하는 프로그램 또는 함수를 작성하십시오. 예를 들면 다음과 같습니다.

(참고 : 이것은 설명을위한 작은 샘플링에 불과합니다. 실제 출력은 훨씬 더 방대합니다.)

afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty

좋아, 당신은 아이디어를 얻는다. :-)

규칙

  • 원하는 프로그래밍 언어를 사용하십시오. 각 언어의 문자 수 에 따라 가장 짧은 코드가 승리합니다. 이것은 사용 된 각 언어마다 한 명의 승자가 있다는 것을 의미합니다. 전체 우승자는 제출 된 모든 코드 중 가장 짧은 코드입니다.
  • 입력 목록은 텍스트 파일, 표준 입력 또는 언어에서 제공하는 목록 구조 (목록, 배열, 사전, 세트 등) 일 수 있습니다. 단어는 영어 또는 다른 자연어 일 수 있습니다. (목록이 영어 단어 인 경우 "a"및 "i"를 제외하고 단일 문자 항목을 무시하거나 미리 필터링해야합니다. 마찬가지로 다른 언어의 경우 무의미한 항목은 무시합니다. 파일에 나타납니다.)
  • 출력 목록은 텍스트 파일, 표준 출력 또는 언어에서 사용하는 목록 구조 일 수 있습니다.
  • 원하는 입력 사전을 사용할 수 있지만, 모호하거나, 간결하거나, 애매 모호한 단어를 너무 많이 제공하는 단어보다는 의미있는 단어를 제공하는 단어를 사용하고 싶을 것입니다. 내가 사용한 파일 : 58000 개가 넘는 영어 단어의 Corncob 목록

질문

이 과제는 주로 작업을 수행하기위한 코드 작성에 관한 것이지만 결과를 결합하는 것도 재미 있습니다 ...

  1. 어떤 하위 단어가 가장 일반적으로 발생합니까?
  2. 가장 많은 수의 하위 단어로 어떤 단어를 분해 할 수 있습니까?
  3. 가장 다양한 방법으로 어떤 단어를 분해 할 수 있습니까?
  4. 가장 큰 하위 단어로 구성된 단어는 무엇입니까?
  5. 가장 재미 있었던 분해는 무엇입니까?

@Geobits — 아, 감사합니다! alienation잘라서 붙여 넣을 때의 두 가지 분해를 놓쳤습니다 . 지금 수정했습니다. 다른 측면에서, 위의 목록은 작은 샘플링에 불과합니다. 내 테스트 프로그램은 Corncob 목록을 받았을 때 수만 개의 답변을 생성했습니다.
Todd Lehman

1
"어떤 단어가 가장 일반적으로 발생합니까?" 거기에 거친 추측을 던지고 'a'가 정상 근처에 있다고 말할 것입니다.
Sellyme

@SebastianLamerichs — 몰라요 .. 아마 아닐 수도 있습니다. :)
Todd Lehman

@ToddLehman은 문장에 정확히 0 개의 하위 단어가 포함되어 있으므로 'a'는 여전히 똑같습니다. : P
Sellyme

@SebastianLamerichs Todd의 답변을 "dunno"는 "dun"+ "no"로 나눌 수 있습니다. ;)
나는 외계인을 경고했다.

답변:


3

파이썬 186

a=open(raw_input()).read().split()
def W(r):
 if r:
    for i in range(1,len(r)+1):
     if r[:i]in a:
        for w in W(r[i:]):yield[r[:i]]+w
 else:yield[]
while 1:
 for f in W(raw_input()):print f

특히 효율적이지는 않지만 실제로는 느리지 않습니다. 그것은 순진하게 (나는 파이썬이 영리한 최적화를 할 것 같지 않다고 생각하지만) 하위 단어가 corncob 사전에 있는지 확인하고 가능한 한 많은 단어를 재귀 적으로 찾습니다. 물론이 사전은 매우 광범위하며 다양한 약어와 약어가 포함되지 않은 것을 시도 할 수 있습니다 (와 같은 것들로 이어짐 bedridden: be dr id den). 또한 연결된 사전에는 'A'또는 'I'가 단어로 나열되지 않아서 수동으로 추가했습니다.

편집하다:

이제 첫 번째 입력은 사용할 사전의 파일 이름이며 모든 추가 항목은 단어입니다.


코드가 Python 3에서 실행되지 않기 때문에 이것이 Python 2라는 것을 언급 할 가치가 print f있습니다.print(f)

또한 어떻게 실행합니까? echo archer|python2 filename.py마지막 줄에 대해 EOFError를 출력 함

당신이 여전히 변경할 수있는 것들 (이것을 테스트하지는 않았지만 제대로 작동 할 것이라고 확신합니다) : for f in W(raw_input()):print f=> ''.join(W(raw_input()); a=open('c').read().split('\n')=>a=open('c').readlines()
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs 첫 번째 readlines문자 는 작동하지만 줄 끝에 줄 바꿈 문자를 유지하므로 내가했던 것처럼 줄 바꿈합니다.
KSab

@ ɐɔıʇǝɥʇuʎs 아 실제로 join는 모든 요소가 문자열이어야하고 이미 가지고있는 것보다 작은 형태로는 얻을 수 없습니다.
KSab

2

코브라-160

sig Z(x,y)
def f(b)
    c as Z=do(x,y)
        if x.length<1,print y
        for z in File.readLines('t'),if z==x[:e=z.length].toLower,c(x[e:],y+' '+z)
    for t in b,c(t,'[t]:')

이 함수는 List<of String>*를 사용하여 인수 목록의 각 문자열에 대해 가능한 하위 단어 배열이 포함 된 문자열을 인쇄 하는 함수 (두 가지 기능 중 정렬 된 함수)입니다 .

* 유형은 실제로 List<of dynamic?>이지만 다른 것을 제공 List<of String>하면 아마 손상 될 수 있습니다.


2

스칼라 132 129

편집 : 함수보다 stdin에서 루프 판독으로 약간 짧음

while(true)print(readLine.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _)))

로 실행

scala decompose.scala aft after erg glow low

(또는 더 긴 단어 목록을 사용하십시오.) :)

기발한:

def f(s:Seq[String])=s.map{_.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _))}

Seq [String]에서 Seq [Seq [List [String]]]까지의 함수입니다. 사전을 명령 행 인수로 사용합니다.

언 골프 드 :

def decompose(wordList: Seq[String]) =
  wordList.map{ word =>                              // for each word
    word.foldRight(Seq(List(""))){ (char, accum) =>  // for each character
      accum.flatMap{list =>
        Seq(char+""::list,char+list.head::list.tail) // add it as both a new list and 
      }                                              // the to start of the first list
    }.filter(_.forall(args contains _))              // filter out lists w/ invalid words
  }

접근 방식은 가능한 모든 하위 문자열 목록을 생성하고 사전에없는 문자열을 포함하는 목록을 필터링하는 것입니다. 생성 된 일부 하위 문자열에는 여분의 빈 문자열이 포함되어 있으므로 빈 문자열이 사전에 없을 것이라고 가정합니다 (어쨌든 명령 줄에 전달할 방법이 없습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.