Piastrella la scacchiera con triomino a quattro colori


12

Compito:

Considera il problema: "data una scacchiera con un quadrato mancante, tagliala in 21 L-triomino". Esiste una dimostrazione costruttiva ben nota che ciò può essere fatto per qualsiasi dimensione di scacchiera quadrata con una potenza di due. Funziona dividendo la scacchiera in una scacchiera più piccola con il buco al suo interno e un grosso triomino e poi osservando che quel triomino può essere tagliato in quattro triomino ricorsivamente.

In questo compito, è necessario tagliare una scacchiera 8x8 in triomino a forma di L e poi colorarli con quattro colori in modo tale che due triomini adiacenti non abbiano lo stesso colore.

Specifica:

Il tuo input è la posizione del foro, dato come una coppia di numeri interi. Puoi scegliere quale è l'indice di colonna e quale è l'indice di riga. Puoi scegliere se ognuno inizia da 0 o da 1 e lontano da quale angolo aumentano. È possibile che sia necessario A..H come prima coordinata anziché 0..7 o 1..8. Puoi anche accettare entrambe le coordinate impacchettate in un singolo numero intero 0..63 o 1..64 in ordine lessicografico (riga maggiore o colonna maggiore, da sinistra a destra o da destra a sinistra, in alto o in basso o in alto). È possibile scrivere un programma completo o una funzione.

È possibile produrre la piastrellatura come ASCII, come ASCII colorato o come primitive grafiche. Se si sceglie l'output ASCII, è possibile scegliere quattro caratteri ASCII stampabili per rappresentare i quattro colori. Se si sceglie ASCII colorato, è possibile scegliere quattro caratteri ASCII stampabili o solo un carattere diverso dallo spazio. Il buco deve essere rappresentato dal carattere spazio. Se uno dei tuoi personaggi è il personaggio spaziale, nessun triomino adiacente al buco o al bordo della scacchiera può essere di questo colore.

Se si sceglie ASCII colorato o output grafico, è possibile scegliere quattro colori tra # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF o gli equivalenti più vicini disponibili nel proprio ambiente. Se scegli l'output grafico, le tue primitive grafiche devono essere riempite di quadrati di almeno 32x32 pixel e separate da non più di due pixel di altro colore. Se quanto sopra supera la risoluzione dello schermo del tuo ambiente, il requisito di dimensione minima viene ridotto alla dimensione quadrata più grande che si adatta ancora allo schermo.

Puoi scegliere qualsiasi piastrellatura valida della scacchiera data. È possibile scegliere qualsiasi colore a quattro colori della piastrellatura scelta. La scelta di quattro colori deve essere la stessa per tutti gli output, ma non è necessario utilizzare tutti i colori in ogni output.

Esempi:

Possibile output per input = [0, 0] (angolo in alto a sinistra)

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

Un altro possibile output dello stesso programma (input = [0, 7]):

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

Un programma diverso può anche produrre, per l'immissione di "D1" (notare l'orientamento della scacchiera non standard ma consentito),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA

4
Se c'è input non è proprio la complessità di Kolmogorov
Jonathan Allan il

@JonathanAllan la descrizione del tag usa chi è quel pokemon come esempio di una domanda di complessità kolmogorov che accetta input. Sta a te decidere se comprimere un insieme di 64 soluzioni costanti o se vuoi implementare una procedura per affiancare la scacchiera e poi colorarla.
John Dvorak,


1
Tre colori non sono abbastanza?
Arnauld,

1
@Arnauld Lo permetterò. Lo modificherò.
John Dvorak,

Risposte:


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)

Provalo online!

Metodo

4×4

(t0t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15)

Ogni triomino è uno di:

triominoes

La configurazione iniziale della matrice è la seguente:

(3232132031021010)

Alteriamo i primi 2 colori proprio come su qualsiasi scacchiera, il che dà:

matrix0

I prossimi passi sono:

  1. t5t6t9t10
  2. Ruotiamo il triomino su cui si trova il foro (potrebbe essere lo stesso triomino del passaggio 1), in modo che non copra il foro.
  3. Riempiamo i fori con il terzo colore (tranne il foro "reale").

(3,0)

matrice1

E in tal caso, la matrice finale è:

(3132102031021010)

Commentate

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

Uscita grafica

Fare clic sull'immagine per impostare la posizione del foro.


Prova costruttiva che tre colori sono sempre sufficienti, molto belli!
John Dvorak,

6
Adoro l'output grafico cliccabile!
Kevin Cruijssen,

3

Carbone , 78 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Output usando #$%caratteri. Spiegazione:

NθNη

Inserisci le coordinate del quadrato vuoto.

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

Emette una stringa compressa. Contiene nuove righe, quindi per evitare di interrompere il flusso di questa spiegazione troverai la stringa alla fine della risposta.

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

Se una delle coordinate è maggiore di 3allora, ricorda quel fatto e sottrai la coordinata da 7.

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

Salta al più vicino %del quadrato in alto a sinistra di %se lo sovrascrive con un #o $come appropriato. (Ma questo verrà sovrascritto dallo spazio vuoto se fosse già in questo quadrato.)

Jθη Fζ‖Fε‖↓

Svuota il quadrato in corrispondenza delle coordinate ridotte e quindi rifletti l'output necessario per riportare il bianco nella posizione originale.

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

Ho provato a iniziare con il quadrato di %s al centro e uscendo dalle coordinate desiderate, ma ci sono voluti 90 byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.