Wir lieben unsere seltsamen Rätsel, wir Briten

16

In einigen britischen Zeitungen gibt es ein Spiel namens Hidato . Es ist etwas ähnlich wie Sudoku , aber anstatt 1-9 in einer Linie und einem Block zu haben, geht es darum, die Zahlen so zu platzieren, dass sie von 01ganz oben nach ganz oben verbunden sind, sodass sie sich alle horizontal, diagonal oder vertikal berühren .

Eingaben enthalten mehrere durch getrennte Zeilen \nmit durch ein Leerzeichen getrennten Blöcken, von denen Sie annehmen können, dass sie zwei Zeichen breit sind. Jeder Block ist eine Zahl, ein Leerzeichen, das ausgefüllt werden muss (gekennzeichnet durch --), oder eine Wand, an der keine Zahlen stehen dürfen ( XX).

Ihre Ausgabe sollte mit der angegebenen übereinstimmen, obwohl leere Blöcke mit Zahlen versehen sind. Beachten Sie, dass es möglicherweise keine eindeutige Lösung gibt oder sogar die Existenz einer Lösung - einige ergeben aufgrund ihrer Mehrdeutigkeit ein Vielfaches, ähnlich wie Sudoku, und einige sind möglicherweise buchstäblich unlösbar. In diesem Fall sollten Sie jedoch eine falsche Ausgabe angeben kann davon ausgehen, dass die Eingaben wie folgt formatiert sind.

Verwenden Sie einen Standardheader Language: XX bytes. Viel Spaß beim Golfen!

Beispiele

Eingänge 01 XX 03, 01 -- 04, 01 --usw. sollten alle Rückkehr etwas Falsey .

Eingang:

01 -- --
-- XX 05

Ausgabe:

01 03 04
02 XX 05

Eingang:

-- 33 35 -- -- XX XX XX    
-- -- 24 22 -- XX XX XX      
-- -- -- 21 -- -- XX XX
-- 26 -- 13 40 11 XX XX
27 -- -- -- 09 -- 01 XX
XX XX -- -- 18 -- -- XX
XX XX XX XX -- 07 -- --
XX XX XX XX XX XX 05 --

Ausgabe:

32 33 35 36 37 XX XX XX
31 34 24 22 38 XX XX XX
30 25 23 21 12 39 XX XX
29 26 20 13 40 11 XX XX
27 28 14 19 09 10 01 XX
XX XX 15 16 18 08 02 XX
XX XX XX XX 17 07 06 03
XX XX XX XX XX XX 05 04

Eingang:

XX XX XX XX -- 53 XX XX XX XX
XX XX XX XX -- -- XX XX XX XX
XX XX 56 -- -- -- 30 -- XX XX
XX XX -- -- -- -- -- -- XX XX
XX -- -- 20 22 -- -- -- -- XX
XX 13 -- 23 47 -- 41 -- 34 XX
-- -- 11 18 -- -- -- 42 35 37
-- -- -- -- 05 03 01 -- -- --
XX XX XX XX -- -- XX XX XX XX
XX XX XX XX 07 -- XX XX XX XX

Ausgabe:

XX XX XX XX 52 53 XX XX XX XX
XX XX XX XX 54 51 XX XX XX XX
XX XX 56 55 28 50 30 31 XX XX
XX XX 26 27 21 29 49 32 XX XX
XX 25 24 20 22 48 45 44 33 XX
XX 13 19 23 47 46 41 43 34 XX
14 12 11 18 04 02 40 42 35 37
15 16 17 10 05 03 01 39 38 36
XX XX XX XX 09 06 XX XX XX XX
XX XX XX XX 07 08 XX XX XX XX
Mia yun Ruse
quelle
Stellen Sie sicher, dass ich Folgendes verstehe: Suchen Sie bei einem Gitter mit einigen nicht begehbaren Zellen einen Hamilton-Pfad, der zu den vorgefüllten Zellen passt?
Geobits
@ Amiruse Wow. Das sieht knifflig aus. (Natürlich kommt dies von einer Person, die Fotobearbeitung hasst.) Es ist nett, jemanden hier zu kennen, der einen VG-Charakter als Logo hat. : O
kirbyfan64sos
Können wir eine Lösung für das Beispiel sehen? Weitere Beispiele werden ebenfalls hilfreich sein.
Kade,
Brillant :). Sie könnten auch später eine Generator-Herausforderung haben
Beta Decay
3
Könnte die Eingabemethode vereinfacht werden? Verwenden Sie möglicherweise ein 2D-Array mit ganzen Zahlen, und geben Sie an, dass es sich -1um eine Wand und 0eine Leerstelle handelt. Das würde es einfacher machen, sich auf die eigentliche Herausforderung des Puzzles zu konzentrieren, und dann gibt es keine Komplexität beim Auffüllen von Zahlen mit Nullen oder beim Parsen von Zeichenfolgen.
mbomb007

Antworten:

1

JavaScript (Node.js) , 482 Byte

Dies ist eine Brute-Force-Lösung. Sie beginnt bei 01und überprüft jede benachbarte Zelle auf leere Zellen ( --) oder die gewünschte Anzahl und folgt dem Weg zur Vervollständigung oder Unmöglichkeit. Wenn die gewünschte Nummer existiert und kein Nachbar ist, wird diese Lösung gekürzt. Dauert einige Sekunden für das größte Raster.

Das ist wahrscheinlich nicht besonders interessant, aber ich dachte, ich würde versuchen, eine Lösung zu finden, bevor ich mir die Antworten auf Rosetta Code anschaue, und es hat mir Spaß gemacht, eine etwas schwierigere Herausforderung anzupacken!

Findet alle Lösungen, wenn viele existieren . Der Body ist eine Funktion, die ein zweidimensionales Array akzeptiert, und die Fußzeile verarbeitet die Eingabe in das gewünschte Format und gibt das Ergebnis auch in das gewünschte Format zurück. Gerne geben wir Ihnen weitere Informationen (und bei Interesse auch eine weniger erfolgreiche Implementierung).

f=a=>{F=(D,n,j)=>[Z=[].concat(...D),z=Z.indexOf(j),z>-1&&[x=z%w,y=z/w|0],z>-1&&[[x-1,y-1],[x,y-1],[x+1,y-1],[x-1,y],[x+1,y],[x-1,y+1],[x,y+1],[x+1,y+1]]][n];C=q=>q.map(Q=>Q.slice());w=a[0][L='length'];l=F(a,0).filter(c=>c!='XX')[L];R=[];r=(s,d)=>{let n=`0${+s+1}`.slice(-2);N=F(d,2,n);n>l?R.push(C(d)):~F(d,1,s)?(p=F(d,3,s),p.filter(P=>P==N+'')[L]?r(n,C(d)):!~F(d,1,n)?p.map(I=>{[x,y]=I,(x<0||x>w-1||y<0||y>d[L]-1)||d[y][x]=='--'&&(D=C(d),r(D[y][x]=n,D))}):0):0};r('01',a);return R}

Probieren Sie es online!

Dom Hastings
quelle