Word Spinner Puzzle


10

นี่คือปริศนาคำศัพท์

โปรแกรมของคุณควรยอมรับสองคำในอินพุตมาตรฐาน
คำแรกเป็นคำเริ่มต้น คำที่สองคือคำสุดท้าย

จากคำเริ่มต้นคุณจะต้องไปให้ถึงคำสุดท้ายที่เปลี่ยนแปลง / เพิ่ม / ลบทีละตัวอักษร หลังจากการแก้ไขแต่ละครั้งจะต้องสร้างคำที่ถูกต้องใหม่ ตัวอักษรที่เพิ่มเข้ามาจะถูกเพิ่มไปยังจุดเริ่มต้นหรือจุดสิ้นสุด คุณสามารถลบตัวอักษรจากตำแหน่งใดก็ได้ (แต่คำต้องไม่ยาวเกินสามตัวอักษร) หมายเหตุ: คุณไม่สามารถจัดเรียงตัวอักษรใหม่เพื่อสร้างคำ

ผลลัพธ์ของโปรแกรมคือลำดับของคำที่จะได้รับจากคำเริ่มต้นไปยังคำสุดท้าย

ตัวอย่าง:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

ผู้ชนะ:

  • โปรแกรมจะต้องทำงานในเวลาที่เหมาะสม (น้อยกว่า 10 วินาที)
  • โปรแกรมที่สามารถสร้างลำดับผลลัพธ์ที่สั้นที่สุดให้กับคำที่ได้รับรางวัล
    • Zink -> ซิลิคอน
  • หากมากกว่าหนึ่งโปรแกรมได้รับลำดับที่สั้นที่สุดดังนั้นโปรแกรมที่สั้นที่สุดในตัวอักษร (ไม่สนใจพื้นที่สีขาว)
  • หากเรายังคงมีวันที่ / เวลาในการส่งโปรแกรมมากกว่าหนึ่งครั้ง

หมายเหตุ:

  • การใช้อักษรตัวพิมพ์ใหญ่ไม่เกี่ยวข้อง
  • รหัสในการสร้างพจนานุกรมไม่นับรวมกับค่าใช้จ่ายของรหัส

อาจเป็น "post-> pot-> hot-> shot" สั้นกว่า
คุณ

@ S.Mark: จากนั้นอัลกอริทึมของคุณจะระเบิดและคุณชนะ ด้านบนเป็นตัวอย่างของวิธีแก้ปัญหาที่เป็นไปได้ วิธีแก้ปัญหาที่สั้นกว่าจะเป็นคำตอบที่ยาวกว่า
Martin York

จงใจ? ขอโทษฉันเพิ่งเข้าใจผิด
คุณ

2
ฉันจะแก้ปัญหาในWhitespaceสำหรับขนาดโปรแกรม 0 หรือไม่?

@Tim Nordenfur: ฉันชอบที่จะเห็นการใช้พื้นที่สีขาว บันทึก. มีกฎอยู่สองข้อก่อนที่ความยาวของโปรแกรมจะตัดสินผู้ชนะ แต่ถ้าคุณตอบสนองความต้องการเหล่านั้น :-)
Martin York

คำตอบ:


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

มีคำศัพท์แปลก ๆ ในพจนานุกรมนั้น ...


ฉันไม่ได้ตรวจสอบเนื้อหาจริงๆ ฉันแค่พยายามค้นหาพจนานุกรมที่ทุกคนสามารถใช้ได้
Martin York

ลองด้วยguester overturn(ใช้เวลาสักครู่) หรือregatta gyrally(ไม่ส่งคืน) ;-)
Arnaud Le Blanc

ใช่ชุดค่าผสมบางชุดใช้เวลาสักครู่ เวลาจะยาวนานขึ้นเนื่องจากทางออกที่สั้นที่สุดจะยาวขึ้น และอันสุดท้ายไม่มีวิธีแก้ปัญหา - ไม่มีสเป็คสำหรับสิ่งที่ควรเกิดขึ้นในกรณีนี้ :) มันง่ายที่จะแก้ไขเพื่อจัดการกับมัน (บันทึกที่จับไปที่ G.copy () และเปรียบเทียบ G กับที่ปลายวง )
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 วินาทีในการกำหนดค่าเราเตอร์ทั้งหมด :-) เส้นทางจาก: Zink -> Silicon
Martin York

@ มาร์ตินโปรดอย่าสนใจเวลาการตั้งค่ามันเหมือนกับการสร้างพจนานุกรม heheh เส้นทางสำหรับ Zink -> ซิลิคอนzink->pink->pank->pani->panic->pinic->sinic->sinico->silico->siliconฉันกำลังพยายามใช้อัลกอริทึม Dijkstra (ซึ่งใช้ใน 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)

การดำเนินการนี้ควรใช้เวลาน้อยกว่า 0.5 วินาทีสำหรับ 'Zink Silicon' และน้อยกว่า 1 วินาทีสำหรับกรณีส่วนใหญ่ (บางครั้งก็นานเมื่อไม่มีวิธีแก้ปัญหา

สิ่งนี้ใช้อัลกอริทึม A *พร้อมระยะทาง levenshteinเพื่อประเมินขอบเขตที่ต่ำกว่าของระยะทาง

การทดสอบ intersting บางอย่าง:

  • 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 Silicon
Martin York

ตอนนี้น่าจะใช้ได้แล้ว :-)
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

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เส้นทางที่สั้นที่สุดคือ ดูเหมือนว่าคุณอนุญาตให้มีการเรียงสับเปลี่ยนและการแทรกในสถานที่ใด ๆ ซึ่งไม่ได้รับอนุญาต :-)
Arnaud Le Blanc

@ user300, การเรียงสับเปลี่ยนคงที่และส่วนแทรก, ฉันคัดลอกวางมากเกินไป, ขอขอบคุณ ;-) และฉันกำลังตั้งค่าขีด จำกัด เริ่มต้นไว้ที่ 5 ตัวอักษรและอนุญาตให้ +1 ตัวอักษรเริ่มต้นและสิ้นสุดอีกครั้งให้ฉันรู้ว่ายังคงเป็นปัญหาอยู่หรือไม่ ขอบคุณ
คุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.