絵をスライドパズルにする


14

概要

このチャレンジの目標は、フランス語でタキンとも呼ばれる15パズル / スライディングパズルの元に戻すイメージバージョンを作成することです。

詳細:

以下で構成される入力が与えられた場合:

  • 画像、
  • 整数n
  • 他の整数r

プログラム、関数、または適合するその他のものは、入力と同じイメージ(つまり、同じサイズと形式)を出力する必要がありますが、次のプロセスが行われました。

  1. 画像を長方形に分割し、
  2. それらの長方形の1つをランダムに削除し、
  3. ポイント(2.)の影響を受ける行/列からランダムな数の連続した長方形を移動して、作成された穴を埋め、この行/列に別の1つを生成します。この番号は0、ブランクがコーナーまたはエッジにある場合になります。

(3.)r回繰り返します。

明確化:

  • 手順(3.)で行から長方形を移動した場合、次の繰り返しで列から長方形を移動する必要があります。
  • 行ステップで長方形を左から右に移動した場合、次の行ステップで長方形を右から左に移動する必要があります。これは、列に関して上から下および下から上と同じです。
  • n画像の辺の長さを分割するように選択されると仮定できます。

最後のポイント:

.gif全体のプロセスを示すアニメーションは大歓迎です。

私は(これは、次の画像を使用することを提案1024x768して、)n=16r=100モデルとして、あなたは使用することができ、他の画像を(それはもちろん、SEの規則に関連するだと準拠限り)。

標準の抜け穴ポリシーが適用されることに注意してください。

これはので、短い提出が勝ちます!

犬、猫、アヒル愛好家は満足するはずです!

例がリクエストされたので、ここに「手で」作られたものn=4r=1

ステップ1および2

ここに画像の説明を入力してください

ステップ3:行ごとに、左に2つの長方形

ここに画像の説明を入力してください


この例は、長方形が同じサイズである必要はなく、画像全体を覆う必要はなく、元の画像の上に描かれた線を含める必要があることを示唆しています。仕様または例を変更して、これを明確にできますか?
センモウヒラムシ

@trichoplax:この例は、ペイントと素早さで手で描かれました。正しくやり直します。
フレデリック

@trichoplax:私はあなたの意見を完全には得られないことを認めなければなりませんが、この最初の行は課題を理解するために必要ではないので、それを維持するのは無意味だと思います。
フレデリック

move a random number of contiguous rectangles0個の長方形にすることはできますか?(ブランクがエッジ/コーナーにある場合にプログラム変更動作を行うのは苦痛です)
ジョンファンミン

@JungHwanMin:はい、できます。良い発言、ありがとう!
フレデリック

回答:


10

Mathematica、246バイト

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

無名関数。MathematicaのTranspose演算子に対応するU + F3C7が含まれています。この関数はImageオブジェクトを受け取り、オブジェクトを返しImageます。

サンプルアニメーション、n=16およびr=100

5000回の反復後:

ここに画像の説明を入力してください(画像を拡大するには、画像をクリックしてください)

説明

初期化

n=Nest

保管Nest中の関数(繰り返し動作)n

k=RandomInteger;q=Reverse;

RandomInteger関数をに保存し、関数をkReverse保存しqます。

画像を分割する

#~ImagePartition~Scaled[1/#2]

入力画像を(2番目の入力)^ 2タイルに分割します。

{1,#2}~k~2

RandomInteger1と2番目の入力の間に2つのを生成します。これにより、ランダムなタイルが選択されます。

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

そのタイルを白にします。に保管しiます。

移動タイル

{t,r}=1~k~2

0〜1の2つのランダムな整数を生成tr、それぞれとに保存します。これにより、方向がランダムに選択されます。

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

関数の定義o:の構成

  1. 入力t時間を入れ替える関数。
  2. 各行のr時間を逆にする関数。
o @#

o入力に適用します。

Position[o@#,i][[1,2]]

i(白い画像)の列を見つけます。

k[ ... -1]

1を減算し、0とその数値の間のランダムな整数を見つけます。これにより、移動するタイルの数がランダムに選択されます。

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

上記の数のタイルがi(白い画像)の前に発生した場合、それらの場所を切り替えます。

(... q[o= ... ])[ ... ]

o関数を逆にして、上記の操作の結果に適用します。これにより、画像の反転と転置が解除されます。

ループと画像の組み立て

(n=Nest)[ ... ,#3]

上記のプロセス(3番目の入力)を繰り返します。

ImageAssemble@

画像をまとめます。


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