ワードスピナーパズル


10

これはワードパズルです。

プログラムは、標準入力で2つの単語を受け入れる必要があります。
単語1が開始単語です。単語2は最後の単語です。

開始単語から、一度に1文字ずつ変更/追加/削除して終了単語に到達する必要があります。各変更後、新しい有効な単語を形成する必要があります。追加された文字は、最初または最後に追加されます。任意の場所から文字を削除できます(ただし、単語は3文字の長さを下回ってはいけません)。注:文字を並べ替えて単語を作成することはできません。

プログラムの出力は、開始ワードから終了ワードまで取得する一連のワードです。

例:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

勝者:

  • プログラムは妥当な時間(10秒未満)で実行する必要があります。
  • 賞品ワードへの最短出力シーケンスを生成できるプログラム。
    • 亜鉛->シリコン
  • 複数のプログラムが最短のシーケンスを取得する場合、char内の最短のプログラム(空白は無視)。
  • それでも複数のプログラムがある場合は、提出日時が使用されます。

ノート:


「post-> pot-> hot-> shot」の方が短い場合があります。
YOU

@ S.Mark:それからあなたのアルゴリズムは私のものを打ち負かし、あなたは勝ちます。上記は可能な解決策の例です。短いソリューションは長いソリューションよりも優れています。
マーティンヨーク

意図的に?すみません、間違えただけです。
YOU

2
プログラムサイズ0のホワイトスペースで解決できますか?

@ティム・ノルデンファー:ホワイトスペースの実装を見たいです。注意。勝者を決定するプログラムの長さの前に2つのルールがあります。しかし、これらの要件を満たしている場合:-)
マーティンヨーク、

回答:


2

Python、288文字

(辞書の読み上げ行は数えません)

X=set(open('websters-dictionary').read().upper().split())

(S,E)=raw_input().upper().split()
G={S:0}
def A(w,x):
 if x not in G and x in X:G[x]=w
while E not in G:
 for w in G.copy():
  for i in range(len(w)):
   for c in"ABCDEFGHIJKLMNOPQRSTUVWXYZ":A(w,w[:i]+c+w[i+1:]);A(w,w[:i]+w[i+1:]);A(w,c+w);A(w,w+c)
s=''
while E:s=E+'\n'+s;E=G[E]
print s

への挑戦のzinkためにsilicon

ZINK
PINK
PANK
PANI
PANIC
PINIC
SINIC
SINICO
SILICO
SILICON

その辞書にはいくつかの奇妙な単語があります...


実際の内容は確認していません。みんなが使える辞書を探してみました。
マーティンヨーク

guester overturn(少し時間がかかる)またはregatta gyrally(戻らない)で試してください;-)
Arnaud Le Blanc

はい、いくつかの組み合わせは時間がかかります。最短の解が長くなるほど、時間が長くなります。そして最後のものは解決策がありません-その場合に何が起こるかについての仕様はありません:)それを処理するために変更することはかなり簡単です(G.copy()にハンドルを保存し、ループの終わりにGと比較します) )。
キースランダル

16

traceroute-10文字

traceroute 

細部

post#traceroute shot

Type escape sequence to abort.
Tracing the route to shot (1.1.4.2)

  1 pot (1.1.1.2) 40 msec 68 msec 24 msec
  2 hot (1.1.3.2) 16 msec 32 msec 24 msec
  3 shot (1.1.4.2) 52 msec *  92 msec

ルーターはOSPFを有効にして事前構成され、このように配置されています。

ここに画像の説明を入力してください

そして、はい、すべての単語を完全にサポートするには、233614ルーターが必要です。:-)


非常に賢いですが、10秒ルールに失敗します。すべてのルーターを構成するのに10秒を超える時間がかかります。:-)経路は次のとおりです:Zink->シリコン
マーティンヨーク

@Martin、設定時間は無視してください。ディクショナリーを構築するのと同じです、へへ、Zinkのルート->シリコンは、zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->silicon私は本当にダイクストラアルゴリズム(OSPFで使用されています)を試しているので、1の周りにそのパスを見つけることができます。ゴルフしたら、後で別のポストに投稿します。
YOU

3

PHP- 886 689 644 612

辞書の読み込み:

<?php foreach(file('websters-dictionary') as $line) {
    $word = strtolower(trim($line));
    if (strlen($word) < 3) continue;
    $c[$word] = 1;
}

実際のコード(両方を連結するだけ):

list($d,$e)=explode(' ',strtolower(trim(`cat`)));$f=range(@a,@z);function w($a,&$g){global$c;if(isset($c[$a]))$g[]=$a;}$h[$d]=$b=@levenshtein;$i=new SplPriorityQueue;$i->insert($d,0);$j[$d]=0;$k[$d]=$b($d,$e);while($h){if(isset($c[$l=$i->extract()])){unset($h[$l],$c[$l]);if($l==$e){for(;$m=@$n[$o[]=$l];$l=$m);die(implode("\n",array_reverse($o)));}for($p=strlen($l),$g=array();$p--;){w(substr_replace($q=$l,"",$p,1),$g);foreach($f as$r){$q[$p]=$r;w($q,$g);w($r.$l,$g);w($l.$r,$g);}}foreach($g as$m){$s=$j[$l]+1;if(!isset($h[$m])||$s<$j[$m]){$n[$m]=$l;$i->insert($m,-(($k[$m]=$b($m,$e))+$j[$m]=$s));}$h[$m]=1;}}}

使用法:

php puzzle.php <<< 'Zink Silicon'
# or
echo 'Zink Silicon'|php puzzle.php

結果:

zink
pink
pank
pani
panic
pinic
sinic
sinico
silico
silicon
(0.23s)

これは、「Zinkシリコン」の場合は0.5秒未満、ほとんどの場合は1秒未満で実行されます(ソリューションが存在しない場合はさらに長くなりますが、それでも戻ります)。

これは、レーベンシュタイン距離でA *アルゴリズムを使用して、距離の下限を推定します。

いくつかの興味深いテスト:

  • vas arm-> vas bas bar barm arm(開始と終了の両方より長い単語)
  • oxy pom -> oxy poxy poy pom
  • regatta gyrally ->(なし、ただしスクリプトは正しく終了します)
  • aal presolution -> +8文字
  • lenticulated aal -> -9文字
  • acarology lowness -> 46ホップ
  • caniniform lowness -> 51ホップ
  • cauliform lowness -> 52ホップ
  • overfoul lowness -> 54ホップ
  • dance facia ->パス内の一部の単語に、開始/終了の両方より4文字多い

Zinkシリコンをお試しください
マーティンヨーク

これは動作するはずです:-)
Arnaud Le Blanc

私はもっ​​と大きなマシンを見つけます:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
マーティンヨーク

128Mのmemory_limit設定に達しただけです;-)で試してくださいphp -dmemory_limit=256M
Arnaud Le Blanc、

had->handは有効な移動ではありません。最初または最後に文字を追加することしかできません。vest->verst:-)でも同じ
Arnaud Le Blanc

3

パイソン

私は数百バイトに圧縮するためにダイクストラコードをゴルフすることができなかったので、これは私のゴルフのバージョンです。

import sys, heapq, time

# dijkstra algorithm from 
# http://code.activestate.com/recipes/119466-dijkstras-algorithm-for-shortest-paths/
def dijkstra(G, start, end):
   def flatten(L):
      while len(L) > 0:
         yield L[0]
         L = L[1]

   q = [(0, start, ())]
   visited = set()
   while True:
      (cost, v1, path) = heapq.heappop(q)
      if v1 not in visited:
         visited.add(v1)
         if v1 == end:
            return list(flatten(path))[::-1] + [v1]
         path = (v1, path)
         for (v2, cost2) in G[v1].iteritems():
            if v2 not in visited:
               heapq.heappush(q, (cost + cost2, v2, path))

nodes = tuple(sys.argv[1:])

print "Generating connections,",
current_time = time.time()

words = set(x for x in open("websters-dictionary", "rb").read().lower().split() if 3 <= len(x) <= max(5, *[len(l)+1 for l in nodes]))

print len(words), "nodes found"

def error():
    sys.exit("Unreachable Route between '%s' and '%s'" % nodes)

if not all(node in words for node in nodes):
    error()

# following codes are modified version of
# http://norvig.com/spell-correct.html
alphabet = 'abcdefghijklmnopqrstuvwxyz'

def edits(word):
   splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
   deletes = [a + b[1:] for a, b in splits if b]
   replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b]
   prepends = [c+word for c in alphabet]
   appends = [word+c for c in alphabet]
   return words & set(deletes + replaces + prepends + appends)

# Generate connections between nodes to pass to dijkstra algorithm
G = dict((x, dict((y, 1) for y in edits(x))) for x in words)

print "All connections generated, %0.2fs taken" % (time.time() - current_time)
current_time = time.time()

try:
    route = dijkstra(G, *nodes)
    print '\n'.join(route)
    print "%d hops, %0.2fs taken to search shortest path between '%s' & '%s'" % (len(route), time.time() - current_time, nodes[0], nodes[1])
except IndexError:
    error()

テスト

$ python codegolf-693.py post shot
Generating connections, 15930 nodes found
All connections generated, 2.09s taken
post
host
hot
shot
4 hops, 0.04s taken to search shortest path between 'post' & 'shot'

$ python codegolf-693.py zink silicon
Generating connections, 86565 nodes found
All connections generated, 13.91s taken
zink
pink
pank
pani
panic
pinic
sinic
sinico
silico
silicon
10 hops, 0.75s taken to search shortest path between 'zink' & 'silicon'

user300のテストを追加

$ python codegolf-693.py vas arm
Generating connections, 15930 nodes found
All connections generated, 2.06s taken
vas
bas
bam
aam
arm
5 hops, 0.07s taken to search shortest path between 'vas' & 'arm'

$ python codegolf-693.py oxy pom
Generating connections, 15930 nodes found
All connections generated, 2.05s taken
oxy
poxy
pox
pom
4 hops, 0.01s taken to search shortest path between 'oxy' & 'pom'

$ python codegolf-693.py regatta gyrally
Generating connections, 86565 nodes found
All connections generated, 13.95s taken
Unreachable Route between 'regatta' and 'gyrally'

もう少し

$ python codegolf-693.py gap shrend
Generating connections, 56783 nodes found
All connections generated, 8.16s taken
gap
rap
crap
craw
crew
screw
shrew
shrewd
shrend
9 hops, 0.67s taken to search shortest path between 'gap' & 'shrend'

$ python codegolf-693.py guester overturn
Generating connections, 118828 nodes found
All connections generated, 19.63s taken
guester
guesten
gesten
geste
gest
gast
east
ease
erse
verse
verset
overset
oversee
overseed
oversend
oversand
overhand
overhard
overcard
overcare
overtare
overture
overturn
23 hops, 0.82s taken to search shortest path between 'guester' & 'overturn'

3 <= len(x) <= max(map(len, [nodea, nodeb]))パスが開始単語と終了単語の両方より長い単語を通過しないことが保証されていますか?
Arnaud Le Blanc、

で試してくださいoxy pom。最短経路はoxy->poxy->poy->pomです。また、許可されていない任意の場所で順列と挿入を許可しているようです:-)
Arnaud Le Blanc

@ user300、順列と挿入の部分を修正しました。コピーと貼り付けをやりすぎました。おかげで;-)そして、最初の制限を5文字に設定し、開始文字と終了文字をさらに+1文字許可しています。それでも問題がある場合はお知らせください。ありがとう。
YOU
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.