Escriba un programa o función que no tenga entrada pero imprima o devuelva una representación textual constante de un rectángulo formado por los 12 pentominoes distintos :
El rectángulo puede tener cualquier dimensión y estar en cualquier orientación, pero los 12 pentominoes deben usarse exactamente una vez, por lo que tendrá un área 60. Cada pentomino diferente debe estar compuesto de un carácter ASCII imprimible diferente (no es necesario usar el letras de arriba).
Por ejemplo, si elige generar esta solución de rectángulo pentomino 20 × 3:
La salida de su programa podría verse así:
00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-
Alternativamente, puede que le resulte más fácil jugar al golf con esta solución 6 × 10:
000111
203331
203431
22 444
2 46
57 666
57769!
58779!
58899!
5889!!
Cualquier solución rectangular servirá, su programa solo necesita imprimir una. (Una nueva línea final en la salida está bien).
Este excelente sitio web tiene muchas soluciones para varias dimensiones de rectángulo y probablemente valga la pena navegar por ellas para asegurarse de que su solución sea lo más breve posible. Este es el código de golf, gana la respuesta más corta en bytes.
fuente
Respuestas:
Pyth, 37 bytes
Demostración
Utiliza un enfoque muy sencillo: use bytes hexadecimales como números. Convertir a un número hexadecimal, base 256 codificar eso. Eso le da la cuerda mágica arriba. Para decodificar, use la función de decodificador base 256 de Pyth, convierta a hexadecimal, divida en 4 trozos y únase en líneas nuevas.
fuente
CJam (44 bytes)
Dado en formato xxd porque contiene caracteres de control (incluida una pestaña sin formato, que juega muy mal con MarkDown):
que decodifica algo a lo largo de las líneas de
Demostración en línea un poco descuidada que no contiene caracteres de control y, por lo tanto, juega muy bien con las funciones de biblioteca de decodificación de URI del navegador.
El principio básico es que, dado que ninguna pieza abarca más de 5 filas, podemos codificar un desplazamiento desde una función lineal del número de fila de forma compacta (en la base 5, de hecho, aunque no he intentado determinar si este sería siempre el caso )
fuente
Bash + utilidades comunes de Linux, 50
Para recrear esto desde la base64 codificada:
Dado que hay 12 pentominoes, sus colores se codifican fácilmente en hexbbles hexadecimales.
Salida:
fuente
J, 49 bytes
Puede elegir las letras de manera que los incrementos máximos entre letras verticalmente adyacentes sean 2. Usamos este hecho para codificar incrementos verticales en base3. Después de eso, creamos las sumas en ejecución y agregamos un desplazamiento para obtener los códigos ASCII de las letras.
Definitivamente golfable. (Todavía no he encontrado una manera de ingresar números de base36 de precisión extendida, pero base36 simple debería ahorrar solo 3 bytes).
Salida:
Pruébelo en línea aquí.
fuente
3#i.5
Que es0 0 0 1 1 1 ... 4 4 4
) puede funcionar pero probablemente no será más corto (al menos de la manera que lo intenté).Microscript II , 66 bytes
Comencemos con la respuesta simple.
Hurra impresión implícita.
fuente
Rubí
Rev 3, 55bytes
Como desarrollo adicional de la idea de Randomra, considere la tabla de resultados y diferencias a continuación. La tabla de diferencias se puede comprimir como antes y expandirse multiplicando por 65 = binario 1000001 y aplicando una máscara 11001100110011. Sin embargo, Ruby no funciona de manera predecible con caracteres de 8 bits (tiende a interpretarlos como Unicode).
Sorprendentemente, la última columna es completamente uniforme. Debido a esto, en compresión podemos realizar un desplazamiento de derechos sobre los datos. Esto garantiza que todos los códigos sean ASCII de 7 bits. En expansión, simplemente multiplicamos por 65 * 2 = 130 en lugar de 65.
La primera columna también es completamente uniforme. Por lo tanto, podemos agregar 1 a cada elemento (32 a cada byte) cuando sea necesario, para evitar cualquier carácter de control. El 1 no deseado se elimina utilizando la máscara 10001100110011 = 9011 en lugar de 11001100110011.
Aunque uso 15 bytes para la tabla, solo uso 6 bits de cada byte, que es un total de 90 bits. De hecho, solo hay 36 valores posibles para cada byte, que son 2.21E23 en total. Eso encajaría en 77 bits de entropía.
Rev 2, 58 bytes, usando el enfoque incremental de Randomra
Finalmente, algo más corto que la solución ingenua. Enfoque incremental de Randomra, con el método bytepacking de Rev 1.
Rev 1, 72 bytes, versión golfizada de rev 0
Se hicieron algunos cambios en la línea de base para acomodar un reordenamiento del código por razones de golf, pero aún así llegó más tiempo que la solución ingenua.
Los desplazamientos se codifican en cada carácter de la cadena mágica en formato base 4
BAC
, es decir, con los 1 que representan el símbolo de la derecha, los 16 que representan el símbolo del medio y el símbolo de la izquierda en la posición del 4. Para extraerlos, el código ASCII se multiplica por 65 (binario 1000001) para darBACBAC
, luego se suma con 819 (binario 1100110011) para dar.A.B.C
.Algunos de los códigos ASCII tienen el conjunto de 7 bits, es decir, son 64 más altos que el valor requerido, para evitar caracteres de control. Debido a que este bit es eliminado por la máscara 819, esto es intrascendente, excepto cuando el valor de
C
es 3, lo que provoca un arrastre. Esto debe corregirse solo en un lugar (en lugar deg
usarloc
).Rev 0, versión sin golf
Salida
Explicación
De la siguiente solución, resta la línea base, dando el desplazamiento que almaceno como datos. La línea base se regenera como un número hexadecimal en el código por
i/2*273
(273 decimal = 111 hexadecimal).fuente
3
en toda la tabla (justo cerca de la parte inferior), así que creo que al aumentar la línea de base en un poco más de 0.5 cada línea, es posible usar la base 3. Siéntase libre de probar eso. (Por razones de golf parece que voy a tener que cambiar ligeramente la línea de base, lo que me da más de 3, y desafortunadamente parece que va a ser 1 byte más que la solución ingenua en Ruby.)Foo, 66 bytes
fuente