Vamos representar um tijolo de alvenaria padrão como [__]
(e ignorar o fato de que a parte superior está aberta). Quando esses tijolos são empilhados, todas as outras camadas são compensadas por meio tijolo, como é habitual na construção de tijolos:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
Assim, cada tijolo tem no máximo seis vizinhos e é impossível que dois tijolos se alinhem diretamente na vertical.
O ponto principal é que os arranjos desses tijolos não são argamassados , mas apenas mantidos juntos pela gravidade. Portanto, é importante que cada tijolo na estrutura seja estável, caso contrário, toda a estrutura é instável.
Existem três maneiras pelas quais um tijolo individual pode ser estável:
- Qualquer tijolo no chão (a linha mais baixa de tijolos) é estável.
Qualquer tijolo que tenha dois tijolos diretamente abaixo é estável:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Qualquer tijolo que tenha um tijolo acima e abaixo do mesmo lado é estável:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
A partir dessas regras, podemos ver, por exemplo, o arranjo
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
é instável porque o tijolo superior direito é instável, o que é suficiente.
Uma estrutura de tijolos é estável apenas se todos os seus tijolos forem estáveis.
Desafio
Sua tarefa é escrever uma função que receba uma sequência de estrutura de tijolo e retorne um valor verdadeiro, se a estrutura for estável, e um valor falso, se instável. ( definição de verdade / falsidade )
A sequência de entrada pode ser arbitrariamente grande, mas sempre será uma grade retangular de caracteres, com espaços preenchendo áreas sem tijolos. A largura da grade de caracteres será divisível por 4, mas a altura pode ser ímpar ou par.
A grade do tijolo sempre se estende acima e à direita da posição inferior esquerda do tijolo:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
Dependendo da estrutura, cada BRK?
um representa um tijolo ( [__]
) ou um espaço vazio (4 espaços).
Observe que as cavidades de meio tijolo são preenchidas com espaços para garantir que a grade de caracteres seja retangular.
Pontuação
O código mais curto em bytes vence.
Notas
- Se desejar, você pode usar em
.
vez do espaço como o caractere de espaço vazio. - A cadeia vazia é considerada estável.
- Se seu idioma não possui funções, você pode usar uma variável de string nomeada como entrada e atribuir o resultado a outra variável.
- Se o seu idioma não tiver strings, você poderá fazer o que parecer apropriado para a entrada.
Casos de teste
Vários casos de teste, separados por linhas vazias. Para maior clareza, .
é usado em vez de espaço para espaços vazios.
Estável:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Instável:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(você terá que empilhar mentalmente essas linhas umas sobre as outras. O ponto é que suas regras permitem estruturas cujo centro de gravidade está muito distante do ponto de contato com o solo. Deve ser possível apertá-las para evitar isso. , sem precisar de um motor de física, se você sentiu como ele).Respostas:
Código da máquina 80386, 98
O código:
O código varre a arte ASCII do fim ao começo, saltando 2 caracteres por vez. Isso faz o dobro das verificações necessárias (seria suficiente pular 4 caracteres), mas simplifica a lógica.
A verificação começa na penúltima linha de caracteres (não é necessário verificar a última linha). Em cada linha, ele inicia três caracteres da direita (não é necessário verificar muito à direita). Para cada personagem, ele verifica quatro caracteres ao redor:
Há várias condições lógicas para verificar:
É uma coincidência de sorte que todos os personagens de tijolos
[_]
tenham seu conjunto LSB; todos os outros personagens.\n
têm isso claro. Além disso, o conjunto de instruções 80386 tem estes acessível "alta" e "baixa" registros (ah
,al
, etc.), que ajuda paralelizar as verificações um pouco. Portanto, toda a verificação equivale a um pouco obscuro.Comecei a partir do seguinte código C:
Traduzi o código para a linguagem assembly (geralmente é individual), incluindo uma implementação de
strchr
estrlen
. O seguinte código-fonte é traduzido pelo MS Visual Studio para o código de máquina na parte superior da minha postagem.fonte
MATLAB - 119 bytes
Minificado:
Expandido:
Uso da amostra:
Detalhes
A rotina anexa uma linha
.
ao topo da matriz de entrada e depois converte em uma matriz numérica adicionando 3 aos códigos de caracteres ASCII. Dada essa conversão, uma convolução 2D com o kernelproduz uma matriz com
0
em locais onde o padrão de caracteresestá presente,
*
representando "qualquer caractere". Devido à construção do kernel, este é o único padrão de caractere válido que produzirá a0
.Uma convolução idêntica é realizada com a versão invertida esquerda-direita do kernel para detectar
Uma entrada é estável se i ) estiver vazia ou ii ) nenhum zeros aparecer em qualquer convolução.
Duas frustrações são
A convolução padrão do MATLAB passa pelas bordas da matriz do operando, produzindo
0
s errados nos cantos opostos para ambas as convoluções, exigindo que,'valid'
(8 bytes) sejam adicionados paraconv2
chamar para limitar a saída à área em que a convolução é válida.Manipular o caso de cadeia vazia adiciona 12 bytes.
fonte
JavaScript (E6) 131
261Teste no console do FireFox / FireBug
Saída
Ungolfed
fonte
[...a]
faz, se você não se importa que eu pergunte? Eu sei que o ES6 permite...arg
como o último argumento de uma função capturar variáveis, mas nunca o vi usado dessa maneira.{:}
no MATLAB. Isso vai ser muito útil. Obrigado. :)Python 279
Eu acho que sou muito ruim em desafios de código de golfe e talvez eu use as linguagens erradas para isso: D Mas eu amo código que pode ser facilmente lido :) Btw Gostaria de ver um código python que use menos bytes!
Exemplos possíveis:
fonte
_
e[
<>
, você usaria!=
.!=
é tge maneira preferidaJavaScript 2 (ES6) - 148
151bytesEspera uma sequência de linhas de tijolos separadas por nova linha (nota: se pudéssemos usar um caractere separador diferente como "|" para separar linhas, isso poderia tornar 1 byte mais curto).
Teste no console do Firefox com:
fonte
Python, 209
Testes:
Saída:
fonte