워드 스피너 퍼즐


10

이것은 단어 퍼즐입니다.

프로그램은 표준 입력에서 두 단어를 받아 들여야합니다.
단어 하나는 시작 단어입니다. 단어 2는 끝 단어입니다.

시작 단어에서 끝 단어를 한 번에 한 문자 씩 변경 / 추가 / 제거해야합니다. 각 수정 후에는 새로운 유효한 단어를 형성해야합니다. 추가 된 문자가 시작 또는 끝에 추가됩니다. 어느 위치에서나 문자를 제거 할 수 있습니다 (단, 3 글자 이하의 단어는 사용할 수 없습니다). 참고 : 글자를 재 배열하여 단어를 구성 할 수는 없습니다.

프로그램의 출력은 시작 단어에서 끝 단어로 가져 오는 단어의 순서입니다.

예:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

우승자:

  • 프로그램은 적절한 시간 (10 초 미만)으로 실행되어야합니다.
  • 상금에 가장 짧은 출력 순서를 생성 할 수있는 프로그램입니다.
    • Zink-> 실리콘
  • 둘 이상의 프로그램이 가장 짧은 시퀀스를 얻는 경우 가장 짧은 프로그램은 문자로 표시됩니다 (공백은 무시).
  • 우리가 여전히 둘 이상의 프로그램 제출 날짜 / 시간을 사용한다면.

노트:


"포스트-> 팟-> 핫-> 샷"이 짧을 수 있습니다.
당신

@ S.Mark : 그러면 알고리즘이 내 것을 이기고 승리합니다. 위는 가능한 솔루션의 예입니다. 솔루션이 짧을수록 솔루션이 길어집니다.
Martin York

의도적으로? 미안, 방금 틀렸어
당신

2
프로그램 크기가 0 인 공백 에서 해결할 수 있습니까?

@ Tim Nordenfur : 공백 구현을보고 싶습니다. 노트. 수상자 결정을 위해 프로그램 기간 이전에는 두 가지 규칙이 있습니다. 그러나 이러한 요구 사항을 충족한다면 :-)
Martin York

답변:


2

파이썬, 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

도전에 대한 zinksilicon:

ZINK
PINK
PANK
PANI
PANIC
PINIC
SINIC
SINICO
SILICO
SILICON

그 사전에 이상한 단어가 있습니다 ...


실제로 내용을 확인하지 않았습니다. 방금 모두가 사용할 수있는 사전을 찾으려고 노력했습니다.
Martin York

함께 노력 guester overturn(시간 소요) 또는 regatta gyrally;-) (반환하지 않음)
아르노 르 블랑

예, 일부 조합에는 시간이 걸립니다. 가장 짧은 솔루션이 길수록 시간이 길어집니다. 그리고 마지막 것은 해결책이 없습니다.이 경우에는 어떤 일이 발생 해야하는지에 대한 사양이 없습니다. ).
Keith Randall

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 초 이상이 걸립니다. :-) 경로 :
Martin York

@Martin, 구성 시간을 무시하십시오 .Zink의 사전, heheh, route 빌드와 같습니다.> Silicon은 zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->siliconDijkstra 알고리즘 (OSPF에서 사용됨)으로 실제로 시도하고 있으며 1 초 정도의 경로를 찾을 수 있습니다. 골프를 타면 나중에 별도의 게시물에 게시하십시오.
당신

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 Silicon'의 경우 0.5 초 미만, 대부분의 경우 1 초 미만이어야합니다 (때로는 솔루션이 없지만 더 길어질 때 더 길어집니다).

이것은 거리 의 하한을 추정하기 위해 levenshtein 거리 와 함께 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 문자가 더 많습니다.

아연 실리콘을 시도
마틴 뉴욕을

이것은 지금 작동합니다 :-)
Arnaud Le Blanc

더 큰 기계를 찾을 것입니다 :PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
Martin York

128M memory_limit 설정을 누르십시오 php -dmemory_limit=256M. ;-) 사용해보십시오 .
Arnaud Le Blanc

had->hand유효한 이동이 아니며 시작 또는 끝 부분에만 문자를 추가 할 수 있습니다. vest->verst:-) 와 동일
Arnaud Le Blanc 8

3

파이썬

dijkstra 코드를 골프화하여 수백 바이트로 압축 할 수 없었기 때문에 여기에 내 골판지 버전이 있습니다.

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입니다. 또한 당신이 :-) 허용되지 않은 장소에서 순열 및 삽입 허용 보인다
아르노 르 블랑

@ user300, 고정 순열 및 삽입 부분, 너무 많이 복사하여 붙여 넣습니다. ;-) 감사합니다. 초기 한도를 5 자로 설정하고 +1 더 많은 문자 시작 및 끝 단어를 허용하므로 여전히 문제가 있는지 알려주십시오. 감사.
당신
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.