Recentemente, houve alguns desafios ASCII para cobras de estimação (por exemplo, aqui )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Esse desafio é pegar uma cobra de estimação horizontal gerada aleatoriamente (altura de cinco linhas, comprimento de 30) e verificar se:
- Cada coluna possui apenas um
0
- Cada
0
um deles é "conectado" ao0
antes e depois (espaçado verticalmente apenas por 0 ou 1 linha)
O resultado final pode ser true
ou 1
se a cobra é válida false
ou 0
se a cobra é inválida
Editar - Esclarecimento
Suponha a entrada:
- É uma string
- Contém apenas '', '0' e '\ n'
- Tem exatamente 30 caracteres cada linha
- Tem exatamente 5 linhas
Ou seja, verifique se a cobra está conectada e se não há caracteres perdidos. Não há necessidade de validar a "tela" em que a cobra está impressa.
code-golf
ascii-art
decision-problem
Espelho318
fonte
fonte
truthy/falsey
e nãotrue/false
?Respostas:
JavaScript (ES2018),
6254 bytesEntrada é uma única sequência:
Sinalizador
s
significa que um ponto corresponde a qualquer coisa (incluindo '\ n'). Este recurso actualmente suportados pelo Chrome 63+, 50+ Opera, Safari 11.1+, com base em compat-mesa . Você pode testar esta função com estes navegadores suportados. Você receberá uma exceção ao carregar a página se o seu navegador não suportar esse recurso.Como funciona:
0
:/( .{30}){4} /
0
s em uma coluna:/0.{30}(.{31})*0/
0
não conecte-se a seus vizinhos:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Mesclar todos esses regex, e você finalmente terá este.
Mostrar snippet de código
Graças a Martin Ender, observe que um único
!
operador pode economizar 8 bytes.fonte
SnakeEx , 51 bytes
Esse é obviamente o idioma certo para a tarefa. : ^ D
Corresponde a entrada inteira se for uma cobra válida; falha em corresponder se não estiver. Experimente aqui!
Explicação
SnakeEx é uma linguagem de correspondência de padrões 2D . Um programa consiste em uma lista de definições para "cobras", que rastreiam os caracteres correspondentes de entrada, mudam de direção e geram outras cobras. Em nosso programa, definimos duas cobras,
s
ec
.Vamos começar
c
porque é mais simples. Sua definição é0 *$
, que deve ser bastante legível se você souber regex: match0
, seguido por zero ou mais espaços, seguido pela borda da grade. O principal problema aqui: essa correspondência pode prosseguir em qualquer direção. Vamos usar parac
cima e para baixo da cobra, para verificar se não há0
s extras em cada coluna.Agora para a cobra principal
s
,. Ele assume a forma(...)%{30}
, que significa "combinar o conteúdo dos parênteses 30 vezes" - uma vez para cada um0
na cobra. Por enquanto, tudo bem. O que se passa dentro dos parênteses?Isso gera uma nova
c
cobra, virou à esquerda 90 graus. A direção é relativa às
direção da cobra, então a nova cobra se move em direção ao topo da grade (a cobra principal está se movendo em direção à direita). Ac
cobra verifica se a célula da grade atual é uma0
e se todas as células acima dela são um espaço. Se falhar, a correspondência inteira falhará. Se for bem-sucedido, continuamos comque faz a mesma coisa, apenas virou à direita (na parte inferior da grade).
Observe que esses spawns não afetam a posição do ponteiro da partida na cobra principal. Eles são um pouco parecidos com lookaheads no regex. (Talvez aqui possamos chamá-los de "lookbesides"?). Depois de verificar se estamos apontando para ae
0
o restante da coluna contém apenas espaços, precisamos realmente corresponder a0
:Agora, o ponteiro da partida está no caractere à direita do
0
. Precisamos verificar três opções diferentes: a cobra inclina-se para baixo, a cobra inclina-se para cima ou a cobra segue em linha reta. Para isso, podemos usar uma expressão OR:Dentro da nossa sala de cirurgia, temos três possibilidades:
Vire à direita, combine um espaço e vire novamente à esquerda (ângulos de cobra para baixo).
Vire à esquerda, combine um espaço e vire à direita novamente (a cobra está inclinada para cima).
Corresponder zero ou um sublinhado. Como não há sublinhados na entrada, sempre será uma correspondência vazia (a cobra vai direto).
Depois de corresponder a uma das três opções acima, o ponteiro de correspondência deve estar apontando para o
0
na próxima coluna, pronto para corresponder à expressão entre parênteses novamente.fonte
CJam ,
3534 bytesExperimente online! Entrada é uma matriz retangular de matrizes de caracteres. Assume que a entrada contém apenas
e
0
.Explicação:
fonte
05AB1E , 18 bytes
Experimente online!
Explicação
fonte
Casca , 12 bytes
Dependendo dos esclarecimentos da regra, pode ser de 11 bytes ou 13 bytes .
Experimente online!
Entrada é uma lista de linhas contendo apenas espaços e 0s; se uma única sequência for necessária, anteceda
¶
o programa para dividir em linhas. O link TIO já faz isso para maior clareza. A saída é 0 ou 1; se algum valor falso e verdadeiro estiver correto, ele±
poderá ser removido.Explicação
A idéia é usar
×≈
para garantir que (a) todas as colunas contenham precisamente um 0 e (b) suas posições diferam em no máximo uma. Como exemplo, considere a entrada de 8 colunasPrimeiro,
mηfT
transforma-o na lista de listas de índicesEntão
Ẋ×≈
dáCada um
1
corresponde a um par de índices que diferem no máximo 1 e cada um0
corresponde a um par que não. Cada resultado é igual a[1]
precisamente quando ambas as listas têm um índice e os índices diferem em no máximo 1.fonte
Python 2 , 71 bytes
Experimente online!
Recebe a entrada como uma sequência multilinha. Caso de testes do Bubbler .
A primeira coluna é extraída como
s[::31]
e a segunda comos[1::31]
e são verificadas quanto à validade. Recorremos ems
remover o primeiro caractere, fazendo com que pares sucessivos de colunas sejam verificados.A verificação de duas colunas usa o encadeamento de comparação do Python para
in
combinar várias verificações:'0'in s[::31]
verifica se a primeira coluna possui pelo menos um0
s[::31]in' %s '%s[1::31]
verifica se a primeira coluna é uma subcadeia da segunda coluna entre dois espaços, o que garante a posição do0
deslocamento tenha mudado no máximo um espaço' %s '%s[1::31]in'%6s'%0*2
verifica se a segunda coluna contém no máximo uma0
.O final
*f(s[1:])
também força o caso recursivo a ser verdadeiro.fonte
C (gcc) ,
246245232215212 bytesExperimente online!
Achei que eu levaria meu idioma favorito para isso (embora, como eu possa ver em muitas outras entradas menores, provavelmente esteja longe de ser ideal para esse tipo de desafio) e C, o que eu poderia gerenciar. A abordagem do programa para o problema é relativamente direta, apenas com muitos bytes de bytes; pega a cobra no stdin e dá seu resultado no valor de retorno de main (assim, o código de saída;
conforme solicitado no problema 0 indica uma cobra inválida e 1 válida, mesmo que para um código de saída estranhocomo é típico para os códigos de saída 0 é uma cobra válida e 1 é uma cobra inválida). Com as macros expandidas e alguns espaços em branco, parece mais com o seguinte:As linhas de entrada são lidas na primeira linha do buffer, as próximas cinco são para rastrear quais locais devem (zerar: devem) ter zeros na linha após cada atual e a última é para rastrear se um zero já foi lido em uma determinada coluna, em qualquer linha. O programa processa cada linha por vez.
Não é nada robusto (
gets()
é apenas o começo) e a entrada deve conter todos os espaços relevantes (sem espaços em branco à esquerda, por exemplo), e o gcc envia avisos e notas sobre a funcionalidade stdlib deixada implicitamente declarada e assim por diante, mas C la vie.Ele também assume que a cabeça da cobra não precisa estar na linha central e que uma cobra válida deve ter pelo menos um zero em cada linha (ou seja, nenhuma linha de todos os espaços nas 5 linhas de entrada). Se o último não for um requisito, pode ser um pouco mais curto - tudo a ver com
k
el
no programa pode ser reduzido ou substituído por menos bytes de código nesse caso.Agradecimentos a user202729 por aprox. 26 bytes salvos.
fonte
#define F
e)
para -1 byte.\n
(10),<space>
(32) e0
(48), é possível verificar==48
com>47
(-1 byte). / Você pode remover o={0}
quando inicializarb
se a variável for global. Da mesma forma, tornek
global ei
umint
parâmetro (sem tipo -> ) demain
(no lugar doargc
qual é1
).i
comoargc
é um gênio). Os primeiros rascunhos disso tinham mais de 400 bytes; demorei o suficiente apenas para arrastá-lo para meus objetivos pessoais de 300 e 256, para que possa haver mais maneiras de reduzi-lo que eu perdi.k
,j
el
todos os globais para economizar em terint
declarações separadas , depois percebi que os padrões me permitiriam deixar de lado o tipo completamente. Obrigado novamente!MATL ,
1817 bytesA entrada é uma matriz de caracteres 2D. Qualquer caractere não espacial pode ser usado para a cobra.
Experimente online!
Explicação
fonte
un30=
para verificar se todos os índices da coluna são diferentes e nenhuma das 30 colunas está vazia. Talvez eu possa testar isso mais diretamente, mas não vejo comoDeslizamento , 28 bytes
Teste aqui.
fonte
Geléia , 19 bytes
Experimente online!
-2 bytes graças ao Sr. Xcoder
Explicação
Entrada é como uma lista de strings
fonte
Geléia , (14? *) 13 bytes
Um link monádico que obtém uma lista de cinco cadeias *, cada uma com comprimento 30 que consiste em espaços e quaisquer outros caracteres (por exemplo,
0
s) e retorna um número inteiro (1 se uma cobra como definida, 0 caso contrário)* Se a entrada precisar ser uma única sequência (lista de caracteres), adicione um
Ỵ
para dividir a sequência nos feeds de linha.Experimente online!
Quão?
fonte
Stax , 20 bytes CP437
24 bytes quando descompactado,
Execute e depure online!
Pode não ser o melhor jogador de golfe, mas acho que o método é novo e interessante.
Explicação
fonte
J ,
38, 3730 bytes-8 bytes graças ao FrownyFrog
Experimente online!
fonte
[:(-:*)2-/\
, verifique se todas as diferenças são -1, 0 ou 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Gelatina , 16 bytes
Experimente online!
Supõe que a sequência de entrada sempre contenha apenas espaços e zeros. Recebe a entrada como uma lista de seqüências de caracteres (cada uma representando uma linha) e gera 1 se for verdade, 0 caso contrário.
Explicação
fonte
Python 2 , 141 bytes
Experimente online!
Entrada é uma grade de caracteres.
fonte
Python 2 e Python 3 ,
122120119 bytesExperimente online!
O formato de entrada é uma sequência de comprimento 154 (5 x 30 caracteres, 4 novas linhas):
Se a cabeça não precisar ser a linha central
O requisito de cabeça de linha central estava no desafio original, mas descobri que não é o caso aqui (pelo menos, não é mencionado explicitamente).
Python 2 e Python 3 ,
124123 bytesExperimente online!
Editar:
==
) em desigualdades para cada código.all()
truque sem sentido no Py3, então fundiu as duas versões.fonte
Excel (VBA), 68 bytes
Usando Janela Imediata,
Cell[A6]
como saída.fonte
Caracóis , 18 bytes
Experimente online!
fonte
Grime ,
302623 bytesObrigado ao Zgarb por salvar 7 bytes e apontar um erro.
Experimente online!
fonte
Ruby , 93 bytes
Experimente online!
fonte
JavaScript (Node.js) ,
128126 bytesEditado após o esclarecimento da entrada, informando que a entrada é "uma sequência".
Experimente online!
fonte
Python 3 ,
197185 bytesNo prompt de comando do
verify.py<snake.txt
ou no bash docat snake.txt | python verify.py
. Ondesnake.txt
está um arquivo que contém uma cobra para verificar.Se a cobra estiver correta, nada será produzido. Se não estiver correto, o Python gerará um erro de índice.
fonte