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.
code-golf
combinatorics
Mão-E-Comida
fonte
fonte
x
x,y
você gera os primeiros2^(xy)
números e filtra aqueles que mascaram para 0 contra2^x - 1
ou(2^(xy+1) - 1)/(2^y - 1)
.Respostas:
GolfScript,
3432 caracteresAcontece 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 é:
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
1
e2
sã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 GolfScriptbase
nã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!
fonte
Mathematica 97
O espaço em branco não está incluído:
NB! = É um caractere único no Mathematica.
fonte
C # - 205
Versão legível:
fonte
Perl,
716765 charConverta int em binário, execute transliteração e adicione uma nova linha a cada dois caracteres. O
/^#/m
teste elimina dois padrões (20 e 21) que não apresentam um aumento na coluna mais à esquerda.Solução geral,
150106103100 charLeia
x
ey
na linha de comando args. Novas linhas são significativasItere mais de 0..2 xy como antes, convertendo cada int em binário, substituindo
-
e#
for0
e1
, e inserindo uma nova linha após cada$x
caractere./^#/m
testa 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.fonte
Pitão,
12011811395118Edit: 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
fonte
['#','-']
por'#-'
J,
3533 caracteresUsa 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.44
fornece uma lista dos números20..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).fonte
(0 2 3 ,. 1 4 5) { #: 44
poderia ser ajustado para trabalhar com uma lista de números em vez de um único número? Provavelmente rasparia mais alguns caracteres.Python -
121112em branco não está incluído
fonte
'_#',repeat=6
->*['_#']*6
b
já é uma tupla, então não há necessidade de convertê-lo :)