コードSlidey Puzzleをコーディングしてください!


12

最も認識可能なスライディングパズル15パズルです。4 x 4のグリッド、15のタイル、1つの空のグリッドスペースがあります。タイルは空のスペースにのみ移動でき、常にグリッドに沿っている必要があります。

レッツは、二次元のような一般スライディングパズル定義W、幅Hの高いグリッド(WHのいくつかの数含まれて正の整数の両方)同一のマークされていないタイル(0との間をW × Hそれらの)に配置されたグリッドにスナップ任意の方法(重複なし)、空のグリッドスペースが残りの領域を埋めます。

たとえば、WHが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文字高さ(正の整数MNの両方)の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)の提出が勝者です。タイブレーカーは、最も投票数の多い回答に進みます。

関連:それ自体でGame of Lifeを実行するコード


だから、プログラムは空のスペースだけがあり、タイルブロックがない(そしてその逆)ときに動作する必要がありますか?
-grc

@grc最初の質問にはい、そして完全に空または満杯であっても、突き出す値の入力を求める必要があることを忘れないでください。いいえ、ブロックを同一にすることはできません。もし彼らがあなたがかなり些細な答えを持っていると主張することができたと思います。それで私はそれについて言及します。
カルビンの趣味

元のソースファイルの名前を指定できますか?
feersum

@feersumいつもそうだと思いますf.txtか?はい。
カルビンの趣味

コードブロックは常に1行になりませんか?複数行のコードブロックは私には本当に複雑に思えますし、2D Esolanguageはおそらくファイルの書き込みをサポートしていません。
デフ

回答:


5

TECO、153

空のブロック:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

タイルブロック:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

所定の位置に自分自身を変更するプログラムは、という名前のファイルに保存する必要がありますx。コマンドで実行できますtecoc mung x.。ドットは重要です。それなしで、TECOはという名前のファイルを見つけようとしましたx.tec。末尾の改行が存在する必要があります。

言語は多くの印刷できない文字を使用するため、印刷可能なASCIIの制限はこの制限のために少し苦痛でした。それらのほとんどは、キャレットで始まる2バイトシーケンスに置き換えることができますが、「エスケープ」(ASCII 27)は「不可能」な1文字なので、取得するにはそのASCII値を文字列に入れて、それを実行します。したがって、4バイトはにEBx<Esc>爆発しました@^Ux#EBx#27@:^UX##Mx

これは、特にプログラムを2つの部分に分割し、文字列として保存し、両方が存在する場合にのみ実行することにより、大幅に削減できます。

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