最も認識可能なスライディングパズルは15パズルです。4 x 4のグリッド、15のタイル、1つの空のグリッドスペースがあります。タイルは空のスペースにのみ移動でき、常にグリッドに沿っている必要があります。
レッツは、二次元のような一般スライディングパズル定義W、幅Hの高いグリッド(W、Hのいくつかの数含まれて正の整数の両方)同一のマークされていないタイル(0との間をW × Hそれらの)に配置されたグリッドにスナップ任意の方法(重複なし)、空のグリッドスペースが残りの領域を埋めます。
たとえば、WとHが3で、タイルがT
あり、空のスペースがE
多くのサイディングパズル配置の1つである場合、
TTT
TET
EET
これらのパズルのために4つの可能な動きがあります。突き出すすべてのアップ、突き出すすべてのダウンは、突き出すすべてが左、または突き出すすべての権利。ある方向の「シェービング」により、すべてのタイルは、別のタイルまたはグリッド境界に到達するまで、可能な限りその方向に移動します。時々、突き出してもグリッドのレイアウトは変わらないことがありますが、
サンプルのグリッドが正しく押し込まれた場合、結果は
TTT
ETT
EET
突き出した結果は
TTT
TTE
TEE
結果を削った
EET
TET
TTT
(左端T
の両方が移動したことに注意してください)
この場合、突き上げてもグリッドのレイアウトは変更されません。
タイルは区別できないため、これらのパズルには「解決済み」状態がないことに注意してください。また、パズルは、ひとたび押し出された後に戻ることが不可能なレイアウトで始まる場合があることに注意してください(3 x 3グリッドの中央にある1つのタイルなど)。
チャレンジ
印刷可能なASCIIのみを使用して、M文字幅とN文字高さ(正の整数M、Nの両方)の2つの長方形のコードブロックを書き込みます。1つのコードブロックはスライドパズルのタイルを表し、もう1つのコードブロックは空のグリッドスペースを表します。
これらの2つのコードブロックをW by Hグリッドに配置すると、コードで表されたスライドパズルが作成され、テキストファイルとして保存して通常のプログラムとして実行できます。これらの種類のプログラムを実行すると、stdinを介して1から4までの数字をユーザーに要求するはずです。1は上、2は下、左は3、右は4です。ユーザーが番号を入力してEnterキーを押すと、プログラムはソースコードタイルをその方向に押し出す方法を計算し、新しいパズルレイアウトをファイル(新しいファイルまたは同じファイル)に保存してから終了します。
このプロセスは、突き出すたびに生成される新しいスライドパズルコードファイルで無期限に繰り返すことができます。
例
タイルコードブロックが次のようになっているとします
// my
// tile
空のグリッドスペースコードブロックは次のようになります
//empty
//space
(M = 7、N = 2、これはもちろん実際のコードではありません)
これらの2つのブロックの有効なスライドパズルの配置は、ユーザーが何らかの方向に押し出すために実行できる、使用している言語でプログラムを作成する必要があります。
サンプルグリッドのコード表現は次のとおりです。
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
したがって、これを実行し、2(ダウン)を押してEnterを押すと、これが別のファイル(または同じファイル)に書き込まれます。
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
そのファイルを実行して、まったく同じ方法で押し込むことができます。
ノート
W by Hスライディングパズルのコード表現はすべて実行可能であり、適切に突き出せる必要があります。これには、1 x 1から妥当な最大値(2 16 x 2 16以上)までのすべてのグリッドサイズが含まれます。
プログラムは、独自のソースコードを読み取ることができます。クインベースの制限はありません。どんな種類のコメントでも結構です。
プログラムは、突き出すタイルがないか、突き出すことができるタイルがない場合でも、突き出す方向を促すプロンプトを表示する必要があります。プロンプトは単に数字を入力する場所であり、メッセージは必要ありません。
入力が常に有効であると仮定することができます(1、2、3、または4)。
コードブロックをスペースでパディングしても問題ありません。それらは印刷可能なASCIIのみであることに注意してください。これは、タブや改行がないことを意味します(コードブロックの形成に役立つ改行を除く)。
言語が標準入力をサポートしていない場合は、最も近いと思われる入力方法を使用してください。
コードパズルファイルの最後に改行を含めるように要求できます。(または、存在しないことを要求します。)
新しいファイルに名前を付ける方法は重要ではありません。
f.txt
または単にf
大丈夫です。2つのコードブロックは同一ではない場合があります。
得点
目標は、最小のコードサイズでこれを行うことです(これがタグ付きcode-golfである理由です)。最小のコードブロック領域(M × N)の提出が勝者です。タイブレーカーは、最も投票数の多い回答に進みます。
f.txt
か?はい。