Escreva todos os caracteres possíveis em braille


13

Um quebra-cabeça interessante veio até mim olhando os botões do elevador esta manhã.

Você deve gerar uma lista de todos os padrões de Braille que se encaixam em uma grade 2x3. Use um hash #para indicar um solavanco e um hífen -para indicar uma área plana.

Amostra de saída esperada:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Regras:

  • Seu programa deve separar cada padrão por pelo menos um caractere ou linha.
  • Os padrões podem ser gerados em qualquer ordem.
  • Todos os padrões, independentemente do que o alfabeto Braille realmente usa, devem ser produzidos. O padrão completamente em branco é opcional.
  • Somente padrões de bump exclusivos devem ser gerados. Os seguintes padrões são considerados equivalentes, pois os solavancos estão em um mesmo arranjo. Nesses casos, use o padrão mais próximo do canto superior esquerdo (ou seja, a primeira opção neste exemplo).
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Pontos de bônus se você puder fazê-lo funcionar para qualquer grade de tamanho x por y . ( EDIT: dentro de limites razoáveis. Até 4x4 é suficiente para a prova de conceito.)

Lendo o artigo da wiki, parece que existem 45 padrões (incluindo o espaço em branco) que atendem às regras deste quebra-cabeça.


Não conta muito, mas é muito próximo. Para grades xx, yvocê gera os primeiros 2^(xy)números e filtra aqueles que mascaram para 0 contra 2^x - 1ou (2^(xy+1) - 1)/(2^y - 1).
22412 Peter Taylor

Respostas:


6

GolfScript, 34 32 caracteres

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

Acontece que não são soluções mais curtas do que simplesmente gerar todos os 64 padrões e filtrar os maus. De fato, mapeando adequadamente os bits para as posições da grade, é possível mapear todos os padrões válidos (não vazios) para um intervalo consecutivo de números, como esse programa faz.

Especificamente, o mapeamento que eu uso é:

5 4
3 1
2 0

onde os números indicam a posição do bit (começando pelo bit menos significativo 0) mapeado para essa posição na grade. Com esse mapeamento, as grades válidas correspondem aos números 20 a 63, inclusive.

Isso é quase o mesmo que o mapeamento óbvio obtida escrevendo o número de 6 bits em binário e adicionando quebras de linha entre cada segundo bit, exceto que os bits 1e 2são trocados - e, na verdade, isso é exatamente como meu programa calcula ele. (Eu também adiciono 64 aos números antes de convertê-los em binários e depois retiro o bit mais alto; isso é apenas para zerar os números em 6 bits, pois os GolfScript basenão retornariam zeros à esquerda).

Ps. Demonstração online aqui. (O servidor parece estar sobrecarregado recentemente; se você receber um tempo limite, tente novamente ou faça o download do intérprete e teste-o localmente.)

Editar: conseguiu salvar dois caracteres, evitando a criação e o descarte desnecessários de matrizes. Ufa!


2
Você se importa de adicionar alguns detalhes? Estou interessado em ver como você está definindo esse mapeamento.
ardnew 27/09/12

@ardnew: Feito, veja acima.
Ilmari Karonen

Eu acho que isso vai mudar muitas respostas das pessoas. :-)
Hand-E-Food

3

Mathematica 97

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

braille


O espaço em branco não está incluído:

Length[%]

44

NB! = É um caractere único no Mathematica.


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();}}}}

Versão legível:

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();
            }
        }
    }
}

3

Perl, 71 67 65 char

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

Converta int em binário, execute transliteração e adicione uma nova linha a cada dois caracteres. O /^#/mteste elimina dois padrões (20 e 21) que não apresentam um aumento na coluna mais à esquerda.

Solução geral, 150 106 103 100 char

Leia xe yna linha de comando args. Novas linhas são significativas

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

Itere mais de 0..2 xy como antes, convertendo cada int em binário, substituindo -e #for 0e 1, e inserindo uma nova linha após cada $xcaractere.

/^#/mtesta se há um aumento na coluna mais à esquerda e /^.*#/testa se há um aumento na linha superior. Somente os padrões que passam nos dois testes são impressos.


Como isso explica as combinações inválidas?
Scleaver 26/09/12

Porque os exclui ansa os padrões para 1..17, 20, e 21.
turba

2

Pitão, 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]

Edit: usou a sugestão de Winston Ewert e adicionou x por y grid solution

Edit: De alguma forma, perdi a última restrição sobre a exclusividade. Esse script gera todas as sequências possíveis, não apenas as 45.

Editar: faça backup de até 118, mas agora corrija


Substitua ['#','-']por'#-'
Winston Ewert

2

J, 35 33 caracteres

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

Usa a abordagem criada por Ilmari Karonen em sua solução Golfscript. No entanto, como o verbo J #:(antibase) armazena os bits (ou, digamos, no caso genérico) em uma lista, precisamos indexá-lo da esquerda em vez da direita (ou seja, o índice 0 é o bit mais à esquerda e mais alto).

A solução é bastante direta: 20+i.44fornece uma lista dos números 20..63, inclusive. #:pega a antibase-2 de cada elemento nesta lista e, assim, produz uma lista de padrões de bits para cada número nesse intervalo. {seleciona (basicamente reordena) os bits no padrão correto e, em seguida, {é usado novamente para usar os dígitos como índices na string '- #' para preparar a saída. Finalmente, organizamos cada entrada em um retângulo de 2 por 3 com $(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


Alguém sabe como algo como (0 2 3 ,. 1 4 5) { #: 44poderia ser ajustado para trabalhar com uma lista de números em vez de um único número? Provavelmente rasparia mais alguns caracteres.
FireFly

1

Python - 121 112

em branco não está incluído

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)

você pode aparar esse produto com '_#',repeat=6->*['_#']*6
booth por

@ boothby: obrigado. Além disso, bjá é uma tupla, então não há necessidade de convertê-lo :)
quasimodo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.