単語を他の単語に分解します(たとえば、「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

わかりました。:-)

ルール

  • 任意のプログラミング言語を使用します。各言語の文字数による最短コードが優先されます。つまり、使用する言語ごとに1人の勝者がいます。全体的な勝者は、提出されたすべての中で最も短いコードになります。
  • 入力リストには、テキストファイル、標準入力、または言語が提供するリスト構造(リスト、配列、辞書、セットなど)を使用できます。単語は、英語またはその他の自然言語です。(リストが英語の単語である場合、「a」と「i」を除く単一文字の項目を無視するか、事前に除外します。同様に、他の言語では、意味のない項目を無視しますファイルに表示されます。)
  • 出力リストは、テキストファイル、標準出力、または言語が使用する任意のリスト構造にすることができます。
  • 任意の入力ディクショナリを使用できますが、多すぎるあいまいな単語、難解な単語、または難解な単語を提供するものではなく、賢明な単語を提供するものを使用することをお勧めします。これは私が使用したファイル:58000以上の英単語のCorncobリスト

ご質問

この課題は、主にタスクを達成するためのコードを書くことですが、結果をくまなく調べることも楽しいです...

  1. 最も一般的に使用されるサブワードは何ですか?
  2. どの単語が最大数のサブワードに分解できますか?
  3. どの単語を最も異なる方法で分解できますか?
  4. 最大のサブワードで構成される単語は何ですか?
  5. 最もおもしろかった分解は何ですか?

@Geobits —ああ、ありがとう!alienation切り取って貼り付けたときの2つの分解を見逃しました。修正されました。他の点では、上記のリストはほんの小さなサンプリングです。私のテストプログラムは、Corncobリストが与えられたときに何万もの回答を生成しました。
トッドリーマン14

1
「最も一般的に使用されるサブワードは何ですか?」ワイルドな推測をそこに投げて、「a」がトップ近くにあるかもしれないと言います。
セリーム14

@SebastianLamerichs —私は知らない...かもしれない、かもしれない。:)
トッドリーマン14

@ToddLehmanその文には正確に0個のサブワードが含まれているため、最初は 'a'がまだ等しい:P
Sellyme

@SebastianLamerichsもしあなたがあなたへのトッドの反応について言及していたら、「ダンノ」は「ダン」+「ノー」に分けることができます。;)
エイリアン

回答:


3

Python 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

特に効率的ではありませんが、実際には遅くありません。素朴に(私はそれが可能だと思いますが、Pythonが巧妙な最適化を行う可能性は低いと思いますが)サブワードが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 14

@ɐɔıʇǝɥʇuʎsああ、実際にjoinはすべての要素が文字列である必要があるようで、私がすでに持っているものよりも小さな形でそれを得ることができません。
KSab 14

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>* を取り、引数リスト内の各文字列の可能なサブワード配置を含む文字列を出力する関数(2つの関数のソート)です。

*タイプは実際List<of dynamic?>にはですが、それ以外のものList<of String>を提供するとおそらく壊れるでしょう。


2

Scala、132 129

編集:関数よりも標準入力から読み込むループとしてわずかに短い

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.