Um dos brinquedos favoritos do meu filho é um conjunto como este . Na verdade, é um dos meus brinquedos favoritos - eu brinquei com ele e me deu algumas idéias de desafio para o PPCG. Aqui está um:
Escreva um programa ou função que use um desenho de linha ASCII como entrada e decida se ele deve ou não ser dobrado em um cubo.
Entrada
A entrada consistirá em exatamente um hexomino construído a partir de quadrados como este:
+-+
| |
+-+
Por exemplo, um heximino de entrada válido é:
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+
Saída
- Um valor verdadeiro se o hexomino puder ser dobrado em um cubo ou
- Um valor falsey caso contrário.
Para economizar um pouco de trabalho, a wikipedia possui ótimos gráficos de:
- Todos os 35 hexominoes:
- Todos os 11 hexominoes que se dobram em cubos:
Notas
- Os hexominoes de entrada podem ter rotação ou reflexão, não apenas os mostrados nas imagens acima
- Os hexominoes de entrada podem ter espaços à esquerda, mas serão alinhados corretamente em relação a si mesmos
- Os hexominoes de entrada podem ter espaço à direita no final das linhas e novas linhas à direita no final da entrada
code-golf
ascii-art
kolmogorov-complexity
geometry
Trauma Digital
fonte
fonte
Respostas:
PMA / Caracóis , 130
ou mais "legível",
De maneira incomum, surgiu um problema que pode ser tratado pela quantidade limitada de recursos implementados até o momento. O
!(z\ )
padrão determina que a posição atual está no espaço no meio de um quadrado usando uma afirmação negativa de que existe um espaço em alguma direção "octilinear". A idéia geral é verificar um padrão que coloque um quadrado em cada um dos 5 locais necessários em relação ao quadrado em que a partida começa. Além disso, ele precisa verificar se não está em um bloco de quadrados 2x2. Antes que o programa funcionasse, tive que corrigir um erro com a análise de parênteses.Se o hexomino não mapear um cubo,
0
será impresso. Caso isso aconteça, algum número inteiro positivo é impresso (número de correspondências).Eu adaptei este gerador polyomino para criar todos os casos de teste possíveis:
fonte
Ruby,
173 148144143 bytesÚltima alteração:
/2
no lado direito ou<
substituído por*2
no lado esquerdo. Permite a eliminação de um conjunto de()
Explicação
O código está dividido em duas partes: uma função principal sem nome que faz a análise e uma função auxiliar sem nome atribuída à variável
h
que faz a verificação.A função principal varre o bytewise pela string, adicionando as coordenadas xey
i,j
de todos os+
símbolos encontrados emx[]
ey[]
. Em seguida, chamah
duas vezes. A primeira vez que assume que o hexomino é horizontal (x[]
contém os comprimentos ey[]
as larguras) e a segunda vez que assume que é vertical.A função
h
pega as coordenadas longitudinais na matrizb
e as coordenadas longitudinais na matrizc
. Calcula o comprimento (em quadrados) da expressão(b.max.b.min)/2
. Se for menor ou igual a 3, o hexomino deve ser avaliado na outra direção parah
retornarfalse
.A inspeção dos hexominos mostrará que, se o comprimento for 4, os hexominos que se dobrarão em um cubo não terão mais que 2 quadrados (3
+
símbolos) na primeira e na última linha . A maioria dos quadrados está concentrada na linha do meio, que se tornará o equador do cubo. Essa condição acaba sendo necessária e suficiente para um hexomino de comprimento 4 que se dobra em um cubo.Existe apenas um hexomino de comprimento 5 que se dobrará em um cubo. Possui 3 quadrados (4
+
símbolos) na primeira e na última linha. Todos os outros hexominos de comprimento 5 têm 5 ou mais+
símbolos na primeira ou na última linha.Existe apenas um hexomino de comprimento 6. Ele possui 7
+
símbolos em cada linha.Juntando tudo isso, é suficiente verificar se o comprimento do hexomino é maior que 3 e o número de
+
símbolos na primeira e na última linha (o que for maior) é menor que o comprimento.Ungolfed in program program
fonte
JavaScript (ES6), 443
431Editar correção de bug, problema durante a análise de entrada, removendo colunas em branco
Isso é muito longo e ainda mais, pois a análise de entrada é uma grande parte da tarefa.
O que faço é verificar se a entrada fornecida é um dos 11 hexominos dobráveis.
Cada hexomino dobrável pode ser mapeado para algum bitmap 5x5 (até 8 diferentes, com simetria e rotações). Tomando os bitmaps como número de 25 bits, eu encontrei os valores mínimos para os 11 hexominos anotados, usando o código a seguir (com formato de entrada muito simples)
Isso dá
[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]
Portanto, dada a string de entrada, tenho que fazer o mesmo para encontrar o bitmap mínimo e retornar true se esse número estiver presente na minha lista de pré-cálculos.
Execute o snippet para testar no Firefox
Mostrar snippet de código
fonte
,\nt=t
desde o final da segunda linha / o início da terceira linha?