Me llegó un acertijo interesante mirando los botones del ascensor esta mañana.
Debe generar una lista de todos los patrones de Braille que se ajusten a una cuadrícula de 2x3. Use un hash #
para denotar una protuberancia y un guión -
para denotar un área plana.
Muestra de salida esperada:
#-
--
--
##
--
--
#-
#-
--
(and so on...)
Reglas:
- Su programa debe separar cada patrón por al menos un carácter o línea.
- Los patrones pueden generarse en cualquier orden.
- Deben producirse todos los patrones, independientemente de lo que el alfabeto Braille realmente use. El patrón completamente en blanco es opcional.
- Solo se deben generar patrones de relieve únicos. Los siguientes patrones se consideran equitativos ya que las protuberancias están en una disposición idéntica. En estos casos, use el patrón más cercano a la esquina superior izquierda (es decir, la primera opción en este ejemplo).
#- -# -- --
#- -# #- -#
-- -- #- -#
Puntos de bonificación si puede hacer que funcione para cualquier cuadrícula de tamaño x por y . ( EDITAR: dentro de límites razonables. Hasta 4x4 es suficiente para probar el concepto).
Al leer el artículo wiki, parece que hay 45 patrones (incluido el espacio en blanco) que cumplen con las reglas de este rompecabezas.
code-golf
combinatorics
Hand-E-Food
fuente
fuente
x
xy
, genera los primeros2^(xy)
números y filtra los que se enmascaran a 0 contra2^x - 1
o(2^(xy+1) - 1)/(2^y - 1)
.Respuestas:
GolfScript,
3432 caracteresResulta que hay son soluciones más cortos que simplemente la generación de los 64 patrones y filtrando los malos. De hecho, al asignar adecuadamente los bits a las posiciones de la cuadrícula, es posible asignar todos los patrones válidos (no vacíos) a un rango consecutivo de números, como lo hace este programa.
Específicamente, el mapeo que uso es:
donde los números denotan la posición del bit (comenzando por el bit menos significativo
0
) asignado a esa posición en la cuadrícula. Con este mapeo, las cuadrículas válidas corresponden a los números 20 a 63 inclusive.Esto es casi lo mismo que la asignación obvia obtenida al escribir el número de 6 bits en binario y agregar saltos de línea entre cada segundo bit, excepto que los bits
1
y2
se intercambian, y de hecho, así es exactamente como lo calcula mi programa. (También agrego 64 a los números antes de convertirlos a binario, y luego quito el bit extra alto; eso es solo para poner a cero los números a 6 bits, ya que GolfScript'sbase
lo contrario no devolvería ningún cero a la izquierda).PD. Demostración en línea aquí. (El servidor parece estar sobrecargado últimamente; si se agota el tiempo de espera, intente nuevamente o descargue el intérprete y localmente).
Editar: se las arregló para guardar dos caracteres al evitar la creación y el volcado innecesarios de matrices. ¡Uf!
fuente
Mathematica 97
En blanco no está incluido:
¡NOTA! = Es un solo personaje en Mathematica.
fuente
C # - 205
Versión legible:
fuente
Perl,
716765 charConvierta int a binario, realice transliteración y agregue una nueva línea cada dos caracteres. La
/^#/m
prueba elimina dos patrones (20 y 21) que no tienen una protuberancia elevada en la columna más a la izquierda.Solución General,
150106103100 charLeer
x
yy
de la línea de comandos args. Las nuevas líneas son significativasItere más de 0..2 xy como antes, convirtiendo cada int en binario, sustituyendo
-
y#
por0
y1
, e insertando una nueva línea después de cada$x
carácter./^#/m
prueba que hay una protuberancia elevada en la columna de la izquierda y/^.*#/
prueba que hay una protuberancia elevada en la fila superior. Solo se imprimen los patrones que pasan ambas pruebas.fuente
Pitón,
12011811395118Editar: se utilizó la sugerencia de Winston Ewert y se agregó la solución de cuadrícula x por y
Editar: de alguna manera me perdí la última restricción sobre la unicidad. Este script genera todas las secuencias posibles, no solo las 45.
Editar: copia de seguridad hasta 118 pero ahora correcto
fuente
['#','-']
con'#-'
J,
3533 caracteresUtiliza el enfoque que Ilmari Karonen ideó en su solución Golfscript. Sin embargo, dado que el verbo J
#:
(antibase) almacena los bits (o, bueno, dígitos en el caso genérico) en una lista, necesitamos indexarlo desde la izquierda en lugar de hacia la derecha (es decir, el índice 0 es el bit más alto más a la izquierda).La solución es bastante sencilla:
20+i.44
da una lista de los números20..63
, inclusive.#:
toma la antibase-2 de cada elemento en esta lista y, por lo tanto, produce una lista de patrones de bits para cada número en ese rango.{
selecciona (básicamente reordena) los bits en el patrón correcto, y luego{
se usa nuevamente para usar los dígitos como índices en la cadena '- #' para preparar la salida. Finalmente, organizamos cada entrada en un rectángulo de 2 por 3 con$
(forma).fuente
(0 2 3 ,. 1 4 5) { #: 44
podría ajustar algo así para que funcione con una lista de números en lugar de un solo número? Probablemente afeitaría algunos caracteres más.Python -
121112el espacio en blanco no está incluido
fuente
'_#',repeat=6
->*['_#']*6
b
ya es una tupla, por lo que no es necesario convertirla :)