Buat gambar menjadi puzzle geser

14

Ringkasan

Tujuan dari tantangan ini adalah untuk membuat versi gambar yang dibatalkan dari puzzle 15-puzzle / geser yang juga disebut taquin dalam bahasa Prancis.

Detail:

Diberikan input yang terdiri dari:

  • sebuah gambar,
  • bilangan bulat n,
  • bilangan bulat lainnya r,

program Anda, atau fungsi, atau apa pun yang cocok, harus menampilkan gambar yang sama ( yaitu ukuran dan format yang sama) sebagai input, tetapi yang menjalani proses berikut:

  1. bagilah gambar menjadi empat persegi panjang,
  2. hapus salah satu dari empat persegi panjang itu, secara acak,
  3. pindahkan sejumlah acak persegi panjang yang berdekatan dari garis / kolom yang dipengaruhi oleh titik (2.) sehingga lubang yang dibuat diisi dan lubang lain dihasilkan di baris / kolom ini. Angka ini bisa 0jika kosong di sudut atau di tepi.

Ulangi (3.) rkali.

Klarifikasi:

  • Jika Anda memindahkan persegi panjang dari garis di langkah (3.), Anda harus memindahkan persegi panjang dari kolom di pengulangan berikutnya,
  • jika Anda memindahkan persegi panjang dari kiri ke kanan dalam langkah-langkah, mereka harus dipindahkan kanan-ke-kiri pada langkah-langkah berikutnya, sama untuk kolom terkait dari atas ke bawah dan dari bawah ke atas,
  • Anda dapat mengasumsikan bahwa nakan dipilih sehingga ia membagi panjang sisi-sisi gambar.

Poin terakhir:

Sebuah animasi yang .gifmenunjukkan seluruh proses sangat disambut.

Saya mengusulkan untuk menggunakan gambar berikut (yang 1024x768), dengan n=16dan r=100sebagai model, Anda dapat menggunakan gambar lain (selama itu relevan dan mematuhi aturan SE, tentu saja).

Perhatikan bahwa kebijakan standar lubang berlaku.

Ini adalah , jadi pengiriman yang lebih singkat menang!

Pecinta anjing, kucing dan bebek harus puas!

Karena contoh diminta, ini adalah satu, dibuat "dengan tangan", dengan n=4danr=1

Langkah 1 dan 2

masukkan deskripsi gambar di sini

Langkah 3 : garis-bijaksana, 2 persegi panjang ke kiri

masukkan deskripsi gambar di sini

Frédéric
sumber
Contoh menunjukkan bahwa persegi panjang tidak perlu memiliki ukuran yang sama, tidak perlu menutupi seluruh gambar, dan harus mencakup garis yang ditarik di atas gambar asli. Bisakah Anda mengklarifikasi ini, dengan mengubah spesifikasi atau contohnya?
trichoplax
@trichoplax: contohnya digambar dengan tangan dengan cat dan kecepatan. Saya akan mengulanginya dengan benar.
Frédéric
@trichoplax: Saya harus mengakui bahwa saya tidak sepenuhnya mengerti maksud Anda, tetapi kalimat pembuka ini tidak diperlukan untuk memahami tantangan, jadi saya kira tidak ada gunanya untuk mempertahankannya.
Frédéric
move a random number of contiguous rectanglesbisakah 0 persegi panjang? (Ini akan merepotkan untuk membuat program mengubah perilaku ketika kosong di tepi / sudut)
JungHwan Min
@JungHwanMin: ya itu bisa. Ucapan yang bagus, terima kasih!
Frédéric

Jawaban:

10

Mathematica, 246 byte

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

Fungsi anonim. Berisi U + F3C7, sesuai dengan Transposeoperator Mathematica . Fungsi ini mengambil Imageobjek dan mengembalikan Imageobjek.

Contoh Animasi, dengan n=16danr=100

Setelah 5000 iterasi:

masukkan deskripsi gambar di sini(klik gambar untuk versi yang lebih besar)

Penjelasan

Inisialisasi

n=Nest

Simpan Nestfungsi (operasi berulang) di n.

k=RandomInteger;q=Reverse;

Simpan RandomIntegerfungsi dalam k, dan Reversefungsi dalam q.

Memisahkan gambar

#~ImagePartition~Scaled[1/#2]

Partisi gambar input menjadi (input kedua) ^ 2 ubin.

{1,#2}~k~2

Hasilkan dua RandomIntegers antara 1 dan input kedua. Ini memilih ubin acak.

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

Buat ubin itu putih. Menyimpannya dalam i.

Ubin bergerak

{t,r}=1~k~2

Hasilkan dua bilangan bulat acak dari 0 hingga 1, dan simpan masing-masing dalam tdan r. Ini secara acak memilih arah.

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

Tentukan fungsi o: komposisi

  1. sebuah fungsi mentransposasikan waktu input t.
  2. fungsi membalikkan setiap rkali baris .
Hai@#

Berlaku ountuk input.

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

Temukan kolom i(gambar putih).

k[ ... -1]

Kurangi satu dan temukan bilangan bulat acak antara 0 dan angka itu. Ini secara acak memilih berapa banyak ubin untuk dipindahkan.

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

Ketika jumlah ubin dikatakan terjadi sebelum i(gambar putih), ganti tempat mereka.

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

Balikkan ofungsi dan terapkan itu ke hasil operasi di atas. Ini un-reverses dan un-transposes gambar.

Perulangan dan Perakitan Gambar

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

Ulangi proses di atas (input ketiga) kali.

ImageAssemble@

Satukan gambar.

JungHwan Min
sumber
1
Jawaban bagus ! Terima kasih atas detailnya!
Frédéric