Kelime Spinner Yapboz


10

Bu bir kelime bulmaca.

Programınız standart girdi üzerinde iki kelimeyi kabul etmelidir.
Birinci kelime başlangıç ​​kelimesidir. İkinci kelime son kelimedir.

Başlangıç ​​kelimesinden her seferinde bir harf değiştirerek / ekleyerek / kaldırırken son sözcüğe ulaşmanız gerekir. Her değişiklikten sonra yeni bir geçerli kelime oluşturması gerekir. Eklenen harfler başa veya sona eklenir. Herhangi bir konumdan harfleri kaldırabilirsiniz (ancak kelime üç harf uzunluğunun altına düşmemelidir). Not: Harfleri bir sözcük oluşturacak şekilde yeniden düzenleyemezsiniz.

Programın çıktısı başlangıç ​​kelimesinden bitiş kelimesine kadar geçen kelime dizisidir.

Misal:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

Kazanan:

  • Program makul bir sürede (10 saniyeden az) çalışmalıdır.
  • Ödül kelimelerine en kısa çıkış dizisini oluşturabilen program.
    • Çinko -> Silikon
  • Birden fazla program en kısa sekansı alırsa, karakterdeki en kısa program (beyaz alanı yok sayarak).
  • Hâlâ birden fazla programımız varsa başvuru tarihi / saati kullanılacaktır.

Notlar:


"post-> pot-> hot-> shot" daha kısa olabilir.
SİZ

@ S.Mark: O zaman algoritmanız benimkini atıyor ve siz kazanıyorsunuz. Yukarıdaki olası bir çözüm örneğidir. Daha kısa bir çözüm daha uzun bir çözümü yener.
Martin York

kasten? üzgünüm, sadece yanlış anladım.
SİZ

2
Whitespace'de 0 program boyutu için çözebilir miyim ?

@Tim Nordenfur: Beyaz boşluk uygulaması görmek isterim. Not. Program süresinden önce kazanana karar vermek için iki kural vardır. Ancak bu gereksinimleri karşılıyorsanız :-)
Martin York

Yanıtlar:


2

Python, 288 karakter

(sözlük okuma satırını saymaz)

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

meydan okuma zinkiçin silicon:

ZINK
PINK
PANK
PANI
PANIC
PINIC
SINIC
SINICO
SILICO
SILICON

Bu sözlükte tuhaf kelimeler var ...


Aslında içeriği kontrol etmedim. Ben sadece herkesin kullanabileceği bir sözlük bulmaya çalıştım.
Martin York

denemek guester overturn(biraz zaman alır) veya regatta gyrally(geri gelmez) ;-)
Arnaud Le Blanc

Evet, bazı kombinasyonlar biraz zaman alıyor. En kısa çözüm uzadıkça süre uzar. Ve sonuncunun çözümü yok - bu durumda ne olması gerektiğine dair bir spesifikasyon yok :) Yine de ele almak için değiştirmek oldukça kolaydır (G.copy () 'ye bir tutamaç kaydedin ve G'yi döngü sonunda onunla karşılaştırın ).
Keith Randall

16

traceroute - 10 karakter

traceroute 

detay

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

Yönlendiriciler OSPF etkin olarak önceden yapılandırılmış ve bu şekilde düzenlenmiştir.

resim açıklamasını buraya girin

Ve evet, tüm kelimeleri tam olarak desteklemek için 233614 yönlendiriciye ihtiyacım var. :-)


Çok zekice ama 10 saniyelik kuralı başarısız oldunuz. Tüm yönlendiricileri yapılandırmanız 10 saniyeden fazla sürecektir. :-) Güzergah nedir: Zink -> Silikon
Martin York

@Martin, lütfen yapılandırma zamanı için göz ardı edin, sadece sözlük, heheh, Zink için yollar oluşturmak gibi -> Silikon zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->silicongerçekten Dijkstra algoritmasıyla (OSPF'de kullanılır) çalışıyorum ve 1s civarında bulabilir, Bir kez golf sonra, ayrı posta sonrası posta.
SİZ

3

PHP - 886 689 644 612

Sözlük yükleniyor:

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

Gerçek kod (sadece ikisini de kapatınız):

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

kullanımı:

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

Sonuç:

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

Bu, 'Zink Silicon' için 0,5 saniyeden az ve çoğu durumda 1 saniyeden az olmalıdır (bazen çözüm olmadığında daha uzun, ancak eşik geri döner).

Bu kullanır A * algoritması ile levenshtein mesafesi mesafelerinin bir alt sınır tahmin etmek.

Bazı intersting testleri:

  • vas arm-> vas bas bar barm arm(başlangıç ​​ve bitişten daha uzun bir kelime ile)
  • oxy pom -> oxy poxy poy pom
  • regatta gyrally -> (yok, ancak komut dosyası doğru bir şekilde sonlandırılıyor)
  • aal presolution -> +8 karakter
  • lenticulated aal -> -9 karakter
  • acarology lowness -> 46 atlama
  • caniniform lowness -> 51 atlama
  • cauliform lowness -> 52 atlama
  • overfoul lowness -> 54 atlama
  • dance facia -> Yoldaki bazı kelimelerin başlangıç ​​/ bitiş değerlerinden 4 karakter daha var

Zink Silicon'u deneyin
Martin York

Bu şimdi işe
yaramalı

Daha büyük bir makine bulacağım:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
Martin York

Sadece 128M memory_limit ayarına çarptı ;-) ile deneyin php -dmemory_limit=256M.
Arnaud Le Blanc

had->handgeçerli bir hareket değil, yalnızca başına veya sonuna bir harf ekleyebilirsiniz. Aynı şey vest->verst:-)
Arnaud Le Blanc

3

piton

Birkaç yüz bayta sıkıştırmak için dijkstra kodlarını golf edemediğim için, burada benim ungolfed versiyonu.

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

Testler

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

Kullanıcı300 Testleri eklendi

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

Biraz daha

$ 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]))yolun asla başlangıç ​​ve bitiş sözcüklerinden daha uzun bir sözcükten geçmeyeceği garanti ediliyor mu?
Arnaud Le Blanc

İle deneyin oxy pom; en kısa yol oxy->poxy->poy->pom. Ayrıca, izin verilmeyen herhangi bir yerde permütasyonlara ve eklemelere izin verdiğiniz görülüyor :-)
Arnaud Le Blanc

@ user300, sabit permütasyonlar ve eklemeler parçaları, çok kopyaladım, teşekkürler ;-) ve ben 5 karakter başlangıç ​​sınırı ayarlıyorum ve +1 daha fazla karakter başlangıç ​​ve bitiş kelimeleri izin, hala sorun olup olmadığını bana bildirin. Teşekkürler.
SİZ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.