Word Spinner Puzzle


10

To jest łamigłówka słowna.

Twój program powinien zaakceptować dwa słowa na standardowym wejściu.
Słowo pierwsze to słowo początkowe. Słowo drugie to słowo końcowe.

Od słowa początkowego musisz dotrzeć do słowa końcowego zmieniając / dodając / usuwając jedną literę na raz. Po każdej modyfikacji musi utworzyć nowe ważne słowo. Dodane litery są dodawane na początku lub na końcu. Możesz usuwać litery z dowolnego miejsca (ale słowo nie może składać się z trzech liter). Uwaga: Nie można zmieniać kolejności liter w celu utworzenia słowa.

Wynikiem programu jest sekwencja słów, które przechodzą od słowa początkowego do słowa końcowego.

Przykład:

Input:
    Post Shot

Output:
    Post
    cost
    coat
    goat
    got
    hot
    shot

Zwycięzca:

  • Program musi zostać uruchomiony w rozsądnym czasie (mniej niż 10 sekund).
  • Program, który może wygenerować najkrótszą sekwencję wyjściową do słów nagrody.
    • Cynk -> Krzem
  • Jeśli więcej niż jeden program otrzyma najkrótszą sekwencję, to najkrótszy program w znakach (ignorując białe znaki).
  • Jeśli nadal mamy więcej niż jeden program, należy użyć daty / godziny.

Uwagi:


może być „post-> pot-> hot-> shot” jest krótszy.
TY

@ S.Mark: Twój algorytm bije mój i wygrywasz. Powyżej jest przykładem możliwego rozwiązania. Krótsze rozwiązanie pokonuje dłuższe rozwiązanie.
Martin York,

celowo? przepraszam, popełniłem błąd.
TY

2
Czy mogę rozwiązać to w Whitespace dla rozmiaru programu 0?

@Tim Nordenfur: Chciałbym zobaczyć wdrożenie białej przestrzeni. Uwaga. przed rozpoczęciem programu obowiązują dwie zasady określające zwycięzcę. Ale jeśli spełniasz te wymagania :-)
Martin York

Odpowiedzi:


2

Python, 288 znaków

(nie licząc linii czytania słownika)

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

na wyzwanie zinkdo silicon:

ZINK
PINK
PANK
PANI
PANIC
PINIC
SINIC
SINICO
SILICO
SILICON

Słownik zawiera kilka dziwnych słów ...


Tak naprawdę nie sprawdziłem treści. Właśnie próbowałem znaleźć słownik, z którego wszyscy mogliby korzystać.
Martin York,

spróbuj guester overturn(zajmuje trochę czasu) lub regatta gyrally(nie wraca) ;-)
Arnaud Le Blanc

Tak, niektóre kombinacje mogą trochę potrwać. Czas wydłuża się, ponieważ najkrótsze rozwiązanie się wydłuża. I ostatni nie ma rozwiązania - nie ma specyfikacji tego, co powinno się zdarzyć w takim przypadku :) Łatwo jest go zmodyfikować, aby go obsłużyć (zapisz uchwyt do G.copy () i porównaj G z nim na końcu pętli ).
Keith Randall

16

traceroute - 10 znaków

traceroute 

Szczegół

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

Routery są wstępnie skonfigurowane z włączonym OSPF i ustawione w ten sposób.

wprowadź opis zdjęcia tutaj

I tak, potrzebuję 233614 routerów, aby w pełni obsłużyć wszystkie słowa. :-)


Bardzo sprytne, ale zawiodłeś zasadę 10 sekund. Konfiguracja wszystkich routerów zajmie Ci więcej niż 10 sekund. :-) Jaka jest trasa z: Zink -> Silicon
Martin York

@Martin, proszę zignoruj ​​czas konfiguracji, to tak jak budowanie słownika, heheh, trasy dla Zink -> Silicon to zink->pink->pank->pani->panic->pinic->sinic->sinico->silico->siliconnaprawdę próbuję z algorytmem Dijkstra (który jest używany w OSPF) i może znaleźć tę ścieżkę wokół 1s, będę zamieść to w osobnym poście później, kiedy zacznę grać w golfa.
TY

3

PHP - 886 689 644 612

Ładowanie słownika:

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

Rzeczywisty kod (wystarczy połączyć oba):

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

stosowanie:

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

Wynik:

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

Powinno to trwać krócej niż 0,5 sekundy dla „Zink Silicon” i krócej niż 1 sekundę dla większości przypadków (czasem dłużej, gdy nie ma rozwiązania, ale nadal powraca).

Wykorzystuje algorytm A * z odległością Levenshteina do oszacowania dolnych granic odległości.

Niektóre interesujące testy:

  • vas arm-> vas bas bar barm arm(ze słowem dłuższym niż początek i koniec)
  • oxy pom -> oxy poxy poy pom
  • regatta gyrally -> (brak, ale skrypt poprawnie się kończy)
  • aal presolution -> +8 znaków
  • lenticulated aal -> -9 znaków
  • acarology lowness -> 46 chmielu
  • caniniform lowness -> 51 chmielu
  • cauliform lowness -> 52 chmielu
  • overfoul lowness -> 54 chmielu
  • dance facia -> niektóre słowa na ścieżce mają 4 znaki więcej niż oba początkowe / końcowe

Wypróbuj Zink Silicon
Martin York

To powinno teraz działać :-)
Arnaud Le Blanc

Znajdę większą maszynę:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
Martin York

Właśnie wcisnąłeś ustawienie 128M memory_limit ;-) Spróbuj z php -dmemory_limit=256M.
Arnaud Le Blanc

had->handnie jest prawidłowym posunięciem, możesz dodać tylko literę na początku lub na końcu. To samo dotyczy vest->verst:-)
Arnaud Le Blanc

3

Pyton

Ponieważ nie mogłem skompresować kodów dijkstra do kilkuset bajtów, oto moja wersja bez golfa.

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

Testy

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

Dodano testy 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'

Trochę więcej

$ 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]))czy gwarantuje się, że ścieżka nigdy nie będzie przechodzić przez słowo dłużej niż słowo początkowe i końcowe?
Arnaud Le Blanc

Spróbuj z oxy pom; najkrótsza ścieżka to oxy->poxy->poy->pom. Wygląda również na to, że zezwalasz na permutacje i wstawianie w dowolnym miejscu, które nie są dozwolone :-)
Arnaud Le Blanc

@ user300, naprawiono permutacje i wstawki, za dużo wkleiłem, dziękuję ;-) i ustawiam początkowy limit na 5 znaków i pozwalam +1 dodatkowym znakom na rozpoczęcie i zakończenie słów, daj mi znać, jeśli nadal będzie problem. dzięki.
TY
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.