Ladrilhar o tabuleiro de xadrez com tri-dominó de quatro cores

12

Tarefa:

Considere o problema: "dado um tabuleiro de xadrez com um quadrado faltando, corte-o em 21 L-triominos". Existe uma prova construtiva bem conhecida de que isso pode ser feito para qualquer tamanho quadrado de tabuleiro de xadrez com potência de dois. Ele funciona dividindo o tabuleiro de xadrez em um tabuleiro de xadrez menor com o buraco e um grande triomino e, em seguida, observando que esse triomino pode ser cortado recursivamente em quatro triominos.

Nesta tarefa, você deve cortar um tabuleiro de xadrez 8x8 em tri-dominó em forma de L e depois colori-lo com quatro cores, de modo que dois tri-dominó adjacentes tenham a mesma cor.

Especificação:

Sua entrada é a posição do furo, fornecida como um par de números inteiros. Você pode escolher qual é o índice da coluna e qual é o índice da linha. Você pode escolher se cada um começa em 0 ou em 1 e longe de qual canto eles aumentam. Você pode solicitar A..H como a primeira coordenada em vez de 0..7 ou 1..8. Você também pode aceitar as duas coordenadas agrupadas em um único número inteiro 0..63 ou 1..64 em ordem lexicográfica (linha principal ou coluna principal, da esquerda para a direita ou da direita para a esquerda, de cima para baixo ou de baixo para cima). Você pode escrever um programa completo ou uma função.

Você pode imprimir a lado a lado como ASCII, como ASCII colorido ou como primitivas gráficas. Se você escolher a saída ASCII, poderá escolher quatro caracteres ASCII imprimíveis para representar as quatro cores. Se você escolher ASCII colorido, poderá escolher quatro caracteres ASCII imprimíveis ou apenas um caractere que não seja o espaço. O furo deve ser representado pelo caractere de espaço. Se um dos seus personagens for o personagem do espaço, nenhum triomino adjacente ao buraco ou na borda do tabuleiro pode ser dessa cor.

Se você escolher saída ASCII colorida ou gráfica, poderá escolher quatro cores dentre # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF ou seus equivalentes mais próximos disponíveis em seu ambiente. Se você escolher saída gráfica, suas primitivas gráficas deverão ter quadrados preenchidos com tamanho mínimo de 32 x 32 pixels e separados por não mais de dois pixels de outra cor. Se o exposto acima exceder a resolução de tela do seu ambiente, o requisito de tamanho mínimo será reduzido para o maior tamanho quadrado que ainda cabe na tela.

Você pode escolher qualquer peça válida do tabuleiro de xadrez fornecido. Você pode escolher qualquer quatro cores do ladrilho que escolher. Sua escolha de quatro cores deve ser a mesma em todas as saídas, mas você não precisa usar todas as cores em todas as saídas.

Exemplos:

Possível saída para entrada = [0, 0] (canto superior esquerdo)

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

Outra saída possível do mesmo programa (entrada = [0, 7]):

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

Um programa diferente também pode produzir, para a entrada de "D1" (observe a orientação não padrão, mas permitida do tabuleiro de xadrez),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA
John Dvorak
fonte
4
Se não houver entrada não é realmente Complexidade de Kolmogorov
Jonathan Allan
@JonathanAllan, a descrição da tag usa quem é esse pokemon como exemplo de uma questão de complexidade kolmogorov que recebe entrada. Depende de você se você deseja compactar um conjunto de 64 soluções constantes ou se deseja implementar um procedimento para ladrilhar o tabuleiro de xadrez e depois colori-lo.
John Dvorak
1
Três cores não são suficientes?
Arnauld
1
@ Arnauld eu vou permitir isso. Eu vou editar.
John Dvorak

Respostas:

22

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

Recebe a entrada como (x)(y), com e . Saída como uma sequência de caracteres com 3 cores (marcadas como , e ).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)

Experimente online!

Método

Trabalhamos em uma matriz de triominoes:4×4

(t0t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15)

Cada triomino é um dos seguintes:

triominoes

A configuração inicial da matriz é a seguinte:

(3232132031021010)

Alternamos as duas primeiras cores, como em qualquer tabuleiro de xadrez, o que fornece:

matrix0

Os próximos passos são:

  1. De acordo com o quadrante em que o buraco está localizado, rotacionamos um dos quatro triângulos centrais ( , , ou ) em 180 °.t5t6t9t10
  2. Giramos o triomino no qual o orifício está localizado (pode ser o mesmo triomino do passo 1), para que não cubra o orifício.
  3. Enchemos os buracos com a 3ª cor (exceto o buraco 'real').

Por exemplo, supondo que o furo esteja localizado em , isso fornece:(3,0)

matrix1

E, nesse caso, a matriz final é:

(3132102031021010)

Comentado

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

Saída gráfica

Clique na imagem para definir a posição do furo.

Arnauld
fonte
Prova construtiva de que três cores são sempre suficientes, muito agradáveis!
John Dvorak
6
Adoro a saída gráfica clicável!
Kevin Cruijssen 6/08/19
3

Carvão , 78 bytes

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

Experimente online! Link é a versão detalhada do código. Saídas usando #$%caracteres. Explicação:

NθNη

Insira as coordenadas do quadrado em branco.

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

Saída uma sequência compactada. Ele contém novas linhas. Assim, para evitar interromper o fluxo dessa explicação, você encontrará a sequência no final da resposta.

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

Se qualquer uma das coordenadas for maior que 3, lembre-se desse fato e subtraia a coordenada de 7.

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

Pule para o %quadrado mais próximo de se no lado esquerdo superior %e substitua-o por um #ou $conforme apropriado. (Mas isso será substituído pelo espaço em branco se já estiver neste quadrado.)

Jθη Fζ‖Fε‖↓

Apague o quadrado nas coordenadas reduzidas e depois reflita a saída conforme necessário para colocar o espaço em branco na posição original.

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

Tentei começar com o quadrado de %s no centro e trabalhar até as coordenadas desejadas, mas isso levou 90 bytes.

Neil
fonte