Tile papan catur dengan triomino empat warna

12

Tugas:

Pertimbangkan masalahnya: "diberi papan catur dengan satu kotak yang hilang, potong menjadi 21 L-triomino". Ada bukti konstruktif yang terkenal bahwa ini dapat dilakukan untuk ukuran papan catur persegi yang merupakan kekuatan dua. Ia bekerja dengan memecah papan catur menjadi papan catur yang lebih kecil dengan lubang di dalamnya dan satu triomino besar dan kemudian mengamati bahwa triomino dapat dipotong menjadi empat triomino secara rekursif.

Dalam tugas ini, Anda diminta untuk memotong papan catur 8x8 menjadi triomino berbentuk L dan kemudian mewarnainya dengan empat warna sehingga tidak ada dua triomino yang berdekatan memiliki warna yang sama.

Spesifikasi:

Input Anda adalah posisi lubang, diberikan sebagai sepasang bilangan bulat. Anda dapat memilih mana yang merupakan indeks kolom dan mana yang merupakan indeks baris. Anda dapat memilih apakah masing-masing mulai dari 0 atau pada 1 dan jauh dari sudut mana mereka meningkat. Anda mungkin memerlukan A..H sebagai koordinat pertama, bukan 0..7 atau 1..8. Anda juga dapat menerima kedua koordinat yang dikemas dalam bilangan bulat tunggal 0..63 atau 1..64 dalam urutan leksikografis (baris-utama atau kolom-utama, kiri ke kanan atau kanan ke kiri, atas ke bawah atau ke bawah ke atas). Anda dapat menulis program lengkap, atau suatu fungsi.

Anda dapat menampilkan ubin sebagai ASCII, berwarna ASCII atau sebagai grafis primitif. Jika Anda memilih output ASCII, Anda dapat memilih empat karakter ASCII yang dapat dicetak untuk mewakili empat warna. Jika Anda memilih ASCII berwarna, Anda dapat memilih empat karakter ASCII yang dapat dicetak atau hanya satu karakter selain spasi. Lubang harus diwakili oleh karakter spasi. Jika salah satu karakter Anda adalah karakter luar angkasa, tidak ada triomino yang bersebelahan dengan lubang atau di tepi papan catur yang berwarna ini.

Jika Anda memilih ASCII berwarna atau keluaran grafis, Anda dapat memilih empat warna dari # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF atau padanan terdekatnya yang tersedia di lingkungan Anda. Jika Anda memilih output grafis, primitif grafis Anda harus diisi dengan kotak berukuran setidaknya 32x32 piksel dan dipisahkan oleh tidak lebih dari dua piksel warna lainnya. Jika hal di atas melebihi resolusi layar lingkungan Anda, persyaratan ukuran minimum disesuaikan dengan ukuran persegi terbesar yang masih pas di layar.

Anda dapat memilih ubin yang valid dari papan catur yang diberikan. Anda dapat memilih empat warna dari ubin yang Anda pilih. Pilihan Anda empat warna harus sama di semua output, tetapi Anda tidak diharuskan untuk menggunakan setiap warna di setiap output.

Contoh:

Output yang mungkin untuk input = [0, 0] (sudut kiri atas)

 #??##??
##.?#..?
?..#??.#
??##.?##
##?..#??
#.??##.?
?..#?..#
??##??##

Output lain yang mungkin dari program yang sama (input = [0, 7]):

??#??#?
?##?##??
..xx..xx
.?x#.?x#
??##??##
..xx..xx
.?x#.?x#
??##??##

Program yang berbeda juga dapat menghasilkan, untuk input "D1" (perhatikan orientasi papan catur yang tidak standar tetapi diizinkan),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA
John Dvorak
sumber
4
Jika ada input, itu bukan kompleksitas Kolmogorov
Jonathan Allan
@JonathanSemua deskripsi tag menggunakan siapa pokemon itu sebagai contoh pertanyaan kompleksitas kolmogorov yang membutuhkan input. Terserah Anda jika Anda ingin mengompres satu set 64 solusi konstan atau jika Anda ingin menerapkan prosedur untuk memasang papan catur dan mewarnainya.
John Dvorak
1
Bukankah tiga warna sudah cukup?
Arnauld
1
@Arnauld saya akan mengizinkannya. Saya akan mengedit.
John Dvorak

Jawaban:

22

JavaScript (ES6),  184 ... 171  163 byte

(x)(y)0x70y7012

h=>v=>(a=[...'3232132031021010'],a[5+(v&4|h>3)]^=3,a[v/2<<2|h/2]=v%2*2+h%2,g=x=>y&8?'':(x<8?x-h|y-v?a[y/2<<2|x/2]^y%2*2+x%2?(x^y)&2:1:' ':`
`)+g(-~x%9||!++y))(y=0)

Cobalah online!

metode

4×4

(t0t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15)

Setiap triomino adalah salah satu dari:

triomino

Konfigurasi awal dari matriks adalah sebagai berikut:

(3232132031021010)

Kami mengganti 2 warna pertama seperti yang kami lakukan pada papan catur mana pun, yang memberikan:

matrix0

Langkah selanjutnya adalah:

  1. t5t6t9t10
  2. Kami memutar triomino tempat lubang itu berada (mungkin triomino yang sama seperti pada langkah # 1), sehingga tidak menutupi lubang itu.
  3. Kami mengisi lubang dengan warna ke-3 (kecuali lubang 'nyata').

(3,0)

matrix1

Dan jika demikian, matriks terakhir adalah:

(3132102031021010)

Berkomentar

h => v => (                       // (h, v) = hole coordinates
  a = [...'3232132031021010'],    // a[] = flat representation of the 4x4 matrix
  a[5 + (v & 4 | h > 3)] ^= 3,    // first rotation, achieved by XOR'ing with 3
  a[v / 2 << 2 | h / 2] =         // second rotation according to the
    v % 2 * 2 + h % 2,            // position of the hole within the triomino's square
  g = x =>                        // g is a recursive function that converts the 4x4
                                  // matrix into a 8x8 ASCII art
    y & 8 ?                       // if y = 8:
      ''                          //   stop recursion and return an empty string
    :                             // else:
      ( x < 8 ?                   //   if this is not the end of the row:
          x - h | y - v ?         //     if this is not the position of the hole:
            a[y / 2 << 2 | x / 2] //       if this part of the triomino located at this
            ^ y % 2 * 2 + x % 2 ? //       position is 'solid':
              (x ^ y) & 2         //         use either color #0 or color #2
            :                     //       else:
              1                   //         use color #1
          :                       //     else:
            ' '                   //       the hole is represented with a space
        :                         //   else:
          `\n`                    //     append a linefeed
      ) + g(-~x % 9 || !++y)      //   append the result of a recursive call
)(y = 0)                          // initial call to g with x = y = 0

Output grafis

Klik pada gambar untuk mengatur posisi lubang.

Arnauld
sumber
Bukti konstruktif bahwa tiga warna selalu mencukupi, sangat bagus!
John Dvorak
6
Sukai output grafis yang dapat diklik!
Kevin Cruijssen
3

Arang , 78 byte

NθNη”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷ηJ⊕÷θ²⊕÷粧#$⁺ⅈⅉJθη Fζ‖Fε‖↓

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Keluaran menggunakan #$%karakter. Penjelasan:

NθNη

Masukkan koordinat dari kotak kosong.

”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”

Keluarkan string terkompresi. Berisi baris baru sehingga untuk menghindari putusnya aliran penjelasan ini Anda akan menemukan string di akhir jawaban.

≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷η

Jika salah satu koordinat lebih besar dari 3maka ingat fakta itu dan kurangi koordinasi dari 7.

J⊕÷θ²⊕÷粧#$⁺ⅈⅉ

Lompat ke %kuadrat kiri atas terdekat %dan timpa dengan a #atau $sesuai. (Tapi ini akan ditimpa oleh yang kosong jika sudah ada di alun-alun ini.)

Jθη Fζ‖Fε‖↓

Kosongkan kotak pada koordinat yang dikurangi dan kemudian refleksikan output seperlunya untuk mendapatkan yang kosong ke posisi semula.

##$$##$$
#%%$#%%$
$%%#$$%#
$$##%$##
##$%%#$$
#%$$##%$
$%%#$%%#
$$##$$##

Saya mencoba memulai dengan kuadrat %s di tengah dan mencari jalan keluar ke koordinat yang diinginkan tetapi butuh 90 byte.

Neil
sumber