Azuleja el tablero de ajedrez con triominoes de cuatro colores.

12

Tarea:

Considere el problema: "dado un tablero de ajedrez que falta un cuadrado, córtelo en 21 L-triominoes". Existe una prueba constructiva bien conocida de que esto se puede hacer para cualquier tamaño de tablero de ajedrez cuadrado que sea una potencia de dos. Funciona dividiendo el tablero de ajedrez en un tablero de ajedrez más pequeño con el agujero y un gran triomino y luego observando que ese triomino se puede cortar en cuatro triominoes de forma recursiva.

En esta tarea, debe cortar un tablero de ajedrez de 8x8 en triominoes en forma de L y luego colorearlos con cuatro colores para que no haya dos triominoes adyacentes que tengan el mismo color.

Especificación:

Su entrada es la posición del agujero, dada como un par de enteros. Puede elegir cuál es el índice de columna y cuál es el índice de fila. Puede elegir si cada uno comienza en 0 o en 1 y lejos de qué esquina aumentan. Puede requerir A..H como la primera coordenada en lugar de 0..7 o 1..8. También puede aceptar ambas coordenadas agrupadas en un solo número entero 0..63 o 1..64 en orden lexicográfico (fila mayor o columna mayor, de izquierda a derecha o de derecha a izquierda, de arriba a abajo o de abajo a arriba). Puede escribir un programa completo o una función.

Puede generar el mosaico como ASCII, como ASCII coloreado o como primitivas gráficas. Si elige la salida ASCII, puede elegir cuatro caracteres ASCII imprimibles para representar los cuatro colores. Si elige ASCII de color, puede elegir cuatro caracteres ASCII imprimibles o solo un carácter que no sea el espacio. El hoyo debe estar representado por el carácter de espacio. Si uno de tus personajes es el personaje espacial, ningún triomino adyacente al hoyo o en el borde del tablero de ajedrez puede ser de este color.

Si elige color ASCII o salida gráfica, puede elegir cuatro colores entre # 000, # 00F, # 0F0, # 0FF, # F00, # F0F, # FF0, #FFF o sus equivalentes más cercanos disponibles en su entorno. Si elige la salida gráfica, sus primitivas gráficas deben rellenarse con cuadrados de al menos 32x32 píxeles de tamaño y estar separadas por no más de dos píxeles de otro color. Si lo anterior excede la resolución de pantalla de su entorno, el requisito de tamaño mínimo se reduce al tamaño cuadrado más grande que todavía cabe en la pantalla.

Puede elegir cualquier mosaico válido del tablero de ajedrez dado. Puede elegir cuatro colores del mosaico que elija. Su elección de cuatro colores debe ser la misma en todas las salidas, pero no es necesario que use todos los colores en cada salida.

Ejemplos:

Salida posible para entrada = [0, 0] (esquina superior izquierda)

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

Otra salida posible del mismo programa (input = [0, 7]):

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

También puede producir un programa diferente para la entrada de "D1" (tenga en cuenta la orientación no estándar pero permitida del tablero de ajedrez),

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA
John Dvorak
fuente
44
Si hay información no es realmente la complejidad de Kolmogorov
Jonathan Allan
@JonathanAllan, la descripción de la etiqueta utiliza quién es ese pokemon como ejemplo de una pregunta de complejidad kolmogorov que toma información. Depende de usted si desea comprimir un conjunto de 64 soluciones constantes o si desea implementar un procedimiento para enlosar el tablero de ajedrez y luego colorearlo.
John Dvorak
1
¿No son suficientes tres colores?
Arnauld
1
@Arnauld lo permitiré. Lo editaré
John Dvorak

Respuestas:

22

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

Toma la entrada como (x)(y), con y . Salidas como una cadena con 3 colores (marcados como , 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)

Pruébalo en línea!

Método

Trabajamos en una matriz de triominoes:4×4

(t0t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15)

Cada triomino es uno de:

triominoes

La configuración inicial de la matriz es la siguiente:

(3232132031021010)

Alternamos los primeros 2 colores como lo haríamos en cualquier tablero de ajedrez, lo que da:

matriz0

Los siguientes pasos son:

  1. De acuerdo con el cuadrante en el que se encuentra el orificio, rotamos uno de los 4 triominoes centrales ( , , o ) 180 °.t5t6t9t10
  2. Giramos el triomino en el que se encuentra el orificio (puede ser el mismo triomino que en el paso 1), para que no cubra el orificio.
  3. Rellenamos los agujeros con el 3er color (excepto el agujero 'real').

Por ejemplo, suponiendo que el agujero esté ubicado en , esto da:(3,0)

matriz1

Y en ese caso, la matriz final es:

(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

Salida gráfica

Haga clic en la imagen para establecer la posición del agujero.

Arnauld
fuente
Prueba constructiva de que tres colores son siempre suficientes, ¡muy bonito!
John Dvorak
66
Me encanta la salida gráfica en la que se puede hacer clic.
Kevin Cruijssen
3

Carbón , 78 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Salidas con #$%caracteres. Explicación:

NθNη

Ingrese las coordenadas del cuadrado en blanco.

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

Salida de una cadena comprimida. Contiene nuevas líneas, por lo que para evitar interrumpir el flujo de esta explicación, encontrará la cadena al final de la respuesta.

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

Si cualquiera de las coordenadas es mayor que 3entonces, recuerde ese hecho y reste la coordenada de 7.

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

Salte al %cuadrado de %s superior izquierdo más cercano y sobrescríbalo con a #o $según corresponda. (Pero esto se sobrescribirá con el espacio en blanco si ya estaba en este cuadrado).

Jθη Fζ‖Fε‖↓

Deje en blanco el cuadrado en las coordenadas reducidas y luego refleje la salida según sea necesario para colocar el blanco en la posición original.

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

Traté de comenzar con el cuadrado de %s en el centro y llegar a las coordenadas deseadas, pero eso tomó 90 bytes.

Neil
fuente