私たちは奇妙なパズル、私たち英国人が大好きです


16

イギリスの数紙の新聞にはHidatoとして知られているゲームがあります。数独にやや似ていますが、ラインとブロックに1-9を置く代わりに、番号を配置01して、一番上まで順番に接続するので、すべて水平、斜め、または垂直に触れます

入力には\n、スペースで区切られたブロックを含む、で区切られた複数の行が含まれます。これは、2文字の幅と想定できます。各ブロックは、数字、塗りつぶされる空白スペース(で示される--)、または数字を入れることができない壁(XX)になります。

出力は、番号が提供された空のブロックであるにもかかわらず、提供されたものと一致する必要があります。ユニークな、または溶液の存在すら存在しないかもしれないことに注意してくださいいくつかは非常に数独のように、その曖昧さに起因する複数得て、そしていくつかは、文字通り解けないかもしれ、あなたが与える必要があり、その場合には- falseyの出力を、あなた入力は以下のようにフォーマットされていると想定できます。

標準ヘッダーを使用しますLanguage: XX bytes。ハッピーゴルフ!

入力01 XX 0301 -- 0401 --、などは、すべての戻り何かべきfalsey

入力:

01 -- --
-- XX 05

出力:

01 03 04
02 XX 05

入力:

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

出力:

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

入力:

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

出力:

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

理解していることを確認してください:いくつかの歩行不可能なセルを含むグリッドがある場合、事前に入力されたセルに適合するハミルトニアンパスを見つけますか?
ジオビット

@AmiRuseうわー。それは難しいようです。(もちろん、これは写真編集が嫌いな人から来ています。)ここにロゴとしてVGキャラクターを持っている他の誰かを知っているのは親切です。:O
kirbyfan64sos

この例の解決策はありますか?他の例も参考になります。
カデ

鮮やかさ :)。後でジェネレーターチャレンジを行うこともできます
ベータ崩壊

3
入力方法を簡素化できますか?整数の2D配列を使用し-1、壁であり0、空白である可能性がありますか?これにより、パズルの本当の課題に集中しやすくなり、数字をゼロで埋めたり、文字列を解析したりする複雑さがなくなります。
mbomb007

回答:


1

JavaScript(Node.js)、482バイト

これはブルートフォースソリューションで01あり、空のセル(--)または目的の数をチェックし、完了または不可能なパスをたどってすべての隣接セルをチェックします。必要な番号が存在し、隣接していない場合、このソリューションをショートカットします。最大のグリッドに数秒かかります。

これはおそらく特に興味深いものではありませんが、Rosetta Codeにリンクされた回答を見る前に解決策を模索してみようと思い、少し難しいチャレンジに取り組みました!

多くが存在する場合、すべてのソリューションを検索します。本体は2次元配列を受け入れる関数であり、フッターは入力を目的の形式に処理し、結果も目的の形式に戻します。より多くの情報を提供できることを嬉しく思います(関心がある場合は、より少ないゴルフの実装)

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}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.