Word Spinner Puzzle


10

Đây là một câu đố chữ.

Chương trình của bạn nên chấp nhận hai từ trên đầu vào tiêu chuẩn.
Từ một là từ bắt đầu. Từ hai là từ kết thúc.

Từ từ bắt đầu, bạn phải đạt được từ cuối thay đổi / thêm / xóa một chữ cái cùng một lúc. Sau mỗi lần sửa đổi, nó phải tạo thành một từ hợp lệ mới. Thêm chữ cái được thêm vào đầu hoặc cuối. Bạn có thể xóa các chữ cái khỏi bất kỳ vị trí nào (nhưng từ không được rơi xuống dưới ba chữ cái). Lưu ý: Bạn không thể sắp xếp lại các chữ cái để tạo thành một từ.

Đầu ra của chương trình là chuỗi các từ cần lấy từ từ bắt đầu đến từ kết thúc.

Thí dụ:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

Người chiến thắng:

  • Chương trình phải chạy trong thời gian hợp lý (dưới 10 giây).
  • Chương trình có thể tạo ra chuỗi đầu ra ngắn nhất cho các từ giải thưởng.
    • Zink -> Silicon
  • Nếu có nhiều hơn một chương trình có chuỗi ngắn nhất thì chương trình ngắn nhất trong ký tự (bỏ qua khoảng trắng).
  • Nếu chúng tôi vẫn còn nhiều hơn một ngày / thời gian nộp chương trình sẽ được sử dụng.

Ghi chú:


có thể "bài-> nồi-> nóng-> bắn" ngắn hơn.
BẠN

@ S.Mark: Sau đó, thuật toán của bạn đánh bại tôi và bạn thắng. Trên đây là một ví dụ về một giải pháp có thể. Một giải pháp ngắn hơn đánh bại một giải pháp dài hơn.
Martin York

Cố ý? xin lỗi, tôi chỉ hiểu sai
BẠN

2
Tôi có thể giải quyết nó trong Whitespace cho kích thước chương trình 0 không?

@Tim Nordenfur: Tôi rất thích thấy một triển khai không gian trắng. Ghi chú. Có hai quy tắc trước thời lượng chương trình để quyết định người chiến thắng. Nhưng nếu bạn đáp ứng các yêu cầu đó :-)
Martin York

Câu trả lời:


2

Con trăn, 288 ký tự

(không tính dòng đọc từ điển)

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

cho thử thách zinkđể silicon:

ZINK
PINK
PANK
PANI
PANIC
PINIC
SINIC
SINICO
SILICO
SILICON

Có một số từ lạ trong từ điển đó ...


Tôi đã không thực sự kiểm tra nội dung. Tôi chỉ cố gắng tìm một từ điển mà mọi người đều có thể sử dụng.
Martin York

thử với guester overturn(mất một chút thời gian) hoặc regatta gyrally(không trả lại) ;-)
Arnaud Le Blanc

Vâng, một số kết hợp mất một lúc. Thời gian sẽ dài hơn vì giải pháp ngắn nhất sẽ lâu hơn. Và cái cuối cùng không có giải pháp - không có thông số cụ thể cho những gì sẽ xảy ra trong trường hợp đó :) Thật dễ dàng để sửa đổi để xử lý nó (lưu một tay cầm vào G.copy () và so sánh G với nó ở cuối vòng lặp ).
Keith Randall

16

theo dõi - 10 ký tự

traceroute 

chi tiết

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

Bộ định tuyến được cấu hình sẵn với OSPF được kích hoạt và sắp xếp theo cách này.

nhập mô tả hình ảnh ở đây

Và vâng, tôi cần 233614 bộ định tuyến để hỗ trợ đầy đủ tất cả các từ. :-)


Rất thông minh nhưng bạn thất bại quy tắc 10 giây. Bạn sẽ mất quá nhiều thời gian hơn 10 giây để cấu hình tất cả các bộ định tuyến. :-) Tuyến đường từ: Zink -> Silicon
Martin York

@Martin, xin vui lòng bỏ qua thời gian cấu hình, giống như xây dựng từ điển, heheh, các tuyến cho Zink -> Silicon zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->silicontôi thực sự đang thử với thuật toán Dijkstra (được sử dụng trong OSPF) và tôi có thể tìm thấy đường dẫn đó trong khoảng 1 giây, tôi sẽ gửi nó trong bài riêng biệt sau, một khi tôi chơi golf.
BẠN

3

PHP - 886 689 644 612

Tải từ điển:

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

Mã thực tế (chỉ concat cả hai):

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;}}}

sử dụng:

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

Kết quả:

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

Điều này sẽ chạy trong ít hơn 0,5 giây cho 'Zink Silicon' và ít hơn 1 giây cho hầu hết các trường hợp (đôi khi lâu hơn khi không có giải pháp nào tồn tại, nhưng nó sẽ trả về).

Điều này sử dụng thuật toán A * với khoảng cách levenshtein để ước tính giới hạn khoảng cách thấp hơn.

Một số bài kiểm tra xen kẽ:

  • vas arm-> vas bas bar barm arm(với một từ dài hơn cả bắt đầu và kết thúc)
  • oxy pom -> oxy poxy poy pom
  • regatta gyrally -> (không có, nhưng tập lệnh kết thúc chính xác)
  • aal presolution -> +8 ký tự
  • lenticulated aal -> -9 ký tự
  • acarology lowness -> 46 bước
  • caniniform lowness -> 51 bước
  • cauliform lowness -> 52 bước
  • overfoul lowness -> 54 bước
  • dance facia -> một số từ trong đường dẫn có thêm 4 ký tự so với cả bắt đầu / kết thúc

Hãy dùng thử Zink Silicon
Martin York

Điều này sẽ hoạt động, ngay bây giờ :-)
Arnaud Le Blanc

Tôi sẽ tìm thấy một cỗ máy lớn hơn:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
Martin York

Bạn chỉ cần nhấn cài đặt 128M memory_limit ;-) Hãy thử với php -dmemory_limit=256M.
Arnaud Le Blanc

had->handkhông phải là một động thái hợp lệ, bạn chỉ có thể thêm một chữ cái vào đầu hoặc cuối. Tương tự cho vest->verst:-)
Arnaud Le Blanc

3

Con trăn

Vì tôi không thể mã golf dijkstra để nén đến vài trăm byte, đây là phiên bản không có bản quyền của tôi.

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()

Xét nghiệm

$ 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'

Đã thêm Bài kiểm tra của người dùng

$ 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'

Một số chi tiết

$ 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]))Có đảm bảo rằng con đường sẽ không bao giờ đi qua một từ dài hơn cả từ bắt đầu và kết thúc?
Arnaud Le Blanc

Hãy thử với oxy pom; con đường ngắn nhất là oxy->poxy->poy->pom. Ngoài ra, dường như bạn cho phép hoán vị và chèn vào bất cứ nơi nào không được phép :-)
Arnaud Le Blanc

@ user300, các phần hoán vị và chèn cố định, tôi đã sao chép quá nhiều, cảm ơn ;-) và tôi đang đặt giới hạn ban đầu là 5 ký tự và cho phép thêm 1 ký tự bắt đầu và kết thúc các từ, hãy cho tôi biết nếu đó vẫn là vấn đề. cảm ơn.
BẠN
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.