Escribe todos los posibles caracteres Braille

13

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.

Hand-E-Food
fuente
No está contando del todo, pero está muy cerca. Para las cuadrículas xx y, genera los primeros 2^(xy)números y filtra los que se enmascaran a 0 contra 2^x - 1o (2^(xy+1) - 1)/(2^y - 1).
Peter Taylor

Respuestas:

6

GolfScript, 34 32 caracteres

44,{84+2base(;{'-#'=}/@\n.}%2/n*

Resulta 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:

5 4
3 1
2 0

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 1y 2se 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!

Ilmari Karonen
fuente
2
¿Te importa agregar algunos detalles? Me interesa ver cómo está definiendo esta asignación.
ardnew
@ardnew: Hecho, ver arriba.
Ilmari Karonen
Creo que esto va a cambiar las respuestas de muchas personas. :-)
Hand-E-Food
3

Mathematica 97

Grid /@ Cases[(#~Partition~2 & /@ Tuples[{"#", "-"}, 6]), x_ /; 
         x[[All, 1]] != {"-", "-", "-"} && x[[1]] != {"-", "-"}]

braille


En blanco no está incluido:

Length[%]

44

¡NOTA! = Es un solo personaje en Mathematica.

DavidC
fuente
3

C # - 205

class C{static void Main(){var s="---##-##";Action<int,int>W=(i,m)=>{Console.WriteLine(s.Substring((i>>m&3)*2,2));};for(int i=0;i<64;++i){if((i&3)>0&&(i&42)>0){W(i,0);W(i,2);W(i,4);Console.WriteLine();}}}}

Versión legible:

class C
{
    static void Main()
    {
        var s = "---##-##"; // all two-bit combinations
        // a function to write one two-bit pattern (one line of a Braille character)
        Action<int,int> W = (i,m) => { Console.WriteLine(s.Substring(((i >> m) & 3) * 2, 2)); };
        // for all possible 6-bit combinations (all possible Braille characters)
        for(int i = 0; i < 64; ++i)
        {
            // filter out forbidden (non-unique) characters
            if ((i & 3) > 0 && (i & 42) > 0)
            {
                // write three rows of the Braille character and an empty line
                W(i,0);
                W(i,2);
                W(i,4);
                Console.WriteLine();
            }
        }
    }
}
Mormegil
fuente
3

Perl, 71 67 65 char

y/10/#-/,s/../$&
/g,/^#/m&&print
for map{sprintf"%06b
",$_}18..63

Convierta int a binario, realice transliteración y agregue una nueva línea cada dos caracteres. La /^#/mprueba elimina dos patrones (20 y 21) que no tienen una protuberancia elevada en la columna más a la izquierda.

Solución General, 150 106 103 100 char

Leer xy yde la línea de comandos args. Las nuevas líneas son significativas

y/01/-#/,s/.{$x}/$&
/g,/^#/m*/^.*#/&&print
for map{sprintf"%0*b
",$x*$y,$_-1}1..1<<($y=pop)*($x=pop)

Itere más de 0..2 xy como antes, convirtiendo cada int en binario, sustituyendo -y #por 0y 1, e insertando una nueva línea después de cada $xcarácter.

/^#/mprueba 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.

multitud
fuente
¿Cómo explica esto las combinaciones no válidas?
Scleaver
Debido a que el ciclo excluye los patrones para 1..17, 20 y 21.
mob
2

Pitón, 120 118 113 95 118

for j in range(256):
    if j/4&48and j/4&42:print''.join('_#'[int(c)]for c in bin(j/4)[2:].rjust(6,'0'))[j%4*2:j%4*2+2]

Editar: 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

Scleaver
fuente
Reemplazar ['#','-']con'#-'
Winston Ewert
2

J, 35 33 caracteres

3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44

Utiliza 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.44da una lista de los números 20..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).


3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44      N.B. use A. (anagram) to generate the right permutation

3 2$"1'-#'{~0 1 2 4 3 5{"1#:20+i.44

Luciérnaga
fuente
¿Alguien sabe cómo se (0 2 3 ,. 1 4 5) { #: 44podrí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.
FireFly
1

Python - 121 112

el espacio en blanco no está incluido

from itertools import*
print'\n'.join('%s%s\n'*3%b for(b,n)in zip(product(*['_#']*6),range(64))if n&48and n&42)
cuasimodo
fuente
puede recortar ese producto con '_#',repeat=6->*['_#']*6
stand
@ Boothby: gracias. Además, bya es una tupla, por lo que no es necesario convertirla :)
Quasimodo