Carrelage de l'échiquier avec des triominos quatre couleurs

12

Tâche:

Considérez le problème: "étant donné un échiquier avec un carré manquant, coupez-le en 21 L-triominos". Il existe une preuve constructive bien connue que cela peut être fait pour n'importe quelle taille d'échiquier carré qui est une puissance de deux. Il fonctionne en divisant l'échiquier en un échiquier plus petit avec le trou dedans et un gros triomino, puis en observant que ce triomino peut être découpé récursivement en quatre triominos.

Dans cette tâche, vous devez couper un échiquier 8x8 en triominos en forme de L, puis les colorier en quatre couleurs de sorte qu'il n'y ait pas deux triominos adjacents de la même couleur.

Spécification:

Votre entrée est la position du trou, donnée sous la forme d'une paire d'entiers. Vous pouvez choisir lequel est l'index de colonne et lequel est l'index de ligne. Vous pouvez choisir si chacun commence à 0 ou à 1 et à partir de quel coin ils augmentent. Vous pouvez exiger A..H comme première coordonnée au lieu de 0..7 ou 1..8. Vous pouvez également accepter les deux coordonnées regroupées dans un seul entier 0..63 ou 1..64 dans l'ordre lexicographique (ligne principale ou colonne principale, de gauche à droite ou de droite à gauche, de haut en bas ou de bas en haut). Vous pouvez écrire un programme complet ou une fonction.

Vous pouvez sortir le pavage en ASCII, en ASCII coloré ou en primitives graphiques. Si vous choisissez la sortie ASCII, vous pouvez choisir quatre caractères ASCII imprimables pour représenter les quatre couleurs. Si vous choisissez l'ASCII coloré, vous pouvez choisir quatre caractères ASCII imprimables ou un seul caractère autre que l'espace. Le trou doit être représenté par le caractère espace. Si l'un de vos personnages est le personnage de l'espace, aucun triomino adjacent au trou ou au bord de l'échiquier ne peut être de cette couleur.

Si vous choisissez une sortie ASCII colorée ou graphique, vous pouvez choisir quatre couleurs parmi # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF ou leurs équivalents les plus proches disponibles dans votre environnement. Si vous choisissez une sortie graphique, vos primitives graphiques doivent être remplies de carrés d'au moins 32 x 32 pixels et séparés par pas plus de deux pixels d'une autre couleur. Si ce qui précède dépasse la résolution d'écran de votre environnement, la taille minimale requise est assouplie à la plus grande taille carrée qui tient toujours sur l'écran.

Vous pouvez choisir n'importe quel pavage valide de l'échiquier donné. Vous pouvez choisir n'importe quelle quadrichromie du carrelage que vous choisissez. Votre choix de quatre couleurs doit être le même pour toutes les sorties, mais vous n'êtes pas obligé d'utiliser chaque couleur dans chaque sortie.

Exemples:

Sortie possible pour l'entrée = [0, 0] (coin supérieur gauche)

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

Une autre sortie possible du même programme (entrée = [0, 7]):

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

Un programme différent peut également produire, pour l'entrée de "D1" (notez l'orientation d'échiquier non standard mais autorisée),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA
John Dvorak
la source
4
S'il y a une contribution, ce n'est pas vraiment la complexité de Kolmogorov
Jonathan Allan
@JonathanAllan, la description de la balise utilise qui est ce pokemon comme exemple d'une question de complexité kolmogorov qui prend une entrée. C'est à vous de décider si vous souhaitez compresser un ensemble de 64 solutions constantes ou si vous souhaitez implémenter une procédure pour carreler l'échiquier, puis le colorier.
John Dvorak
1
Trois couleurs ne suffisent-elles pas?
Arnauld
1
@Arnauld Je vais permettre cela. Je vais éditer.
John Dvorak

Réponses:

22

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

(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)

Essayez-le en ligne!

Méthode

4×4

(t0t1t2t3t4t5t6t7t8t9tdixt11t12t13t14t15)

Chaque triomino est l'un des:

triominos

La configuration initiale de la matrice est la suivante:

(3232132031021010)

Nous alternons les 2 premières couleurs comme nous le ferions sur n'importe quel échiquier, ce qui donne:

matrice0

Les prochaines étapes sont les suivantes:

  1. t5t6t9tdix
  2. Nous faisons tourner le triomino sur lequel le trou est situé (il peut s'agir du même triomino qu'à l'étape # 1), afin qu'il ne recouvre pas le trou.
  3. Nous remplissons les trous avec la 3ème couleur (sauf le «vrai» trou).

Par exemple, en supposant que le trou est situé à (3,0)

matrice1

Et dans ce cas, la matrice finale est:

(3132102031021010)

Commenté

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

Sortie graphique

Cliquez sur l'image pour définir la position du trou.

Arnauld
la source
Preuve constructive que trois couleurs sont toujours suffisantes, très sympa!
John Dvorak
6
J'adore la sortie graphique cliquable!
Kevin Cruijssen
3

charbon , 78 octets

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

Essayez-le en ligne!Le lien est vers la version détaillée du code. Sorties utilisant des #$%caractères. Explication:

NθNη

Saisissez les coordonnées du carré vide.

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

Génère une chaîne compressée. Il contient des sauts de ligne afin d'éviter de rompre le flux de cette explication, vous trouverez la chaîne à la fin de la réponse.

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

Si l'une des coordonnées est supérieure à 3 souvenez-vous de ce fait et soustrayez la coordonnée de 7.

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

Aller au plus proche %du carré supérieur gauche de %s et l'écraser avec un #ou$ selon le cas. (Mais cela sera écrasé par le blanc s'il était déjà dans ce carré.)

Jθη Fζ‖Fε‖↓

Videz le carré aux coordonnées réduites, puis réfléchissez la sortie si nécessaire pour ramener le blanc à sa position d'origine.

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

J'ai essayé de commencer par le carré de %s au centre et de travailler vers les coordonnées souhaitées, mais cela a pris 90 octets.

Neil
la source