Escreva um programa que utilize uma única linha que você possa assumir que conterá apenas os caracteres /\_‾
. (Isso é barra invertida e traseira, sublinhado e overline . Você pode usá-lo ~
no lugar de overline, se necessário, pois o overline não é conveniente ASCII.)
Por exemplo, uma entrada possível é:
__/‾‾\/\_/‾
Seu programa precisa gerar um valor verdadeiro ou falso, dependendo de a borda esquerda da string estar "conectada", por assim dizer, à borda direita da string através das linhas dos caracteres. Portanto, se o kerning fosse um pouco menor, haveria uma linha preta sólida (embora retorcida) todo o caminho da borda esquerda para a direita, como um pedaço ininterrupto de barbante ou barbante.
A saída para o exemplo acima seria verdadeira porque as bordas estão conectadas:
Para ser claro sobre as conexões:
/
conecta no canto inferior esquerdo e superior direito\
conecta no canto superior esquerdo e no canto inferior direito_
conecta no canto inferior esquerdo e inferior direito‾
(ou~
) se conecta no canto superior esquerdo e no canto superior direito
Além disso:
Não importa se as arestas da string começaram na parte superior ou inferior, é importante que elas se conectem horizontalmente por todo o comprimento da string.
Você pode assumir que a sequência de entrada não está vazia e, é claro, apenas uma linha.
Aqui estão mais alguns exemplos seguidos por 1 (verdade) se eles estiverem conectados ou 0 (falso) se não:
__/‾‾\/\_/‾
1
_
1
\
1
/
1
‾
1
___
1
\/
1
/\/
1
/\/\
1
‾‾‾
1
\\
0
‾‾
1
_‾
0
‾_
0
\_____/
1
\/\\/\\___
0
\/\__/‾‾\
1
______/\_____
1
‾‾‾‾‾‾\\_____
0
‾‾‾‾‾‾\______
1
_____/‾‾‾‾‾
1
\___/‾‾‾\___/‾‾‾
1
\_/_\_
0
\_/\_
1
/\/\/\/\/\/\/\/\/\/\/\/
1
____________________
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾/
0
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\
1
/\‾/\‾___/\_\/__\/\‾‾
0
O código mais curto é o vencedor.
fonte
Respostas:
Geléia , 9 bytes
-1 byte graças a @EriktheOutgolfer
Espere em0 0 1
~
vez de‾
. Retorna ou 1 .Experimente online! , Conjunto de testes Truthy , conjunto de testes Falsas
Usando esta fórmula (mas semelhante à versão de 11 bytes abaixo):
A transição é válida sen for ímpar ou inválida se n for par.
Comentado
Geléia ,
14 1211 bytesSuporta (e espera) o0 0 ou 1 .
‾
caractere na sequência de entrada. RetornaExperimente online! , Conjunto de testes Truthy , conjunto de testes Falsas
Quão?
Dados dois caracteres consecutivos dos códigos ASCIIx e y , queremos uma função que verifique se eles formam uma transição válida.
Precisamos de uma operação não comutativa, porque o resultado pode mudar quando os caracteres são revertidos. Por exemplo,
_/
é válido, mas/_
não é.Usando exponenciação, uma possível fórmula 1 é:
A transição é válida se ou inválida se .n ≤ 1 n > 1
1. Encontrado com uma pesquisa de força bruta no Node.js (usando BigInts)
Comentado
fonte
⁽"O
é o mesmo que9580
.Ruby -n , 30 bytes
Experimente online!
Reduz todas as sequências de quebra de cadeia para dois casos usando classes de caracteres Regex.
fonte
~
vez de‾
. Não tenho certeza se isso é importante para esse desafio, já que a contagem de caracteres é a mesma./
s mesmo estando entre colchetes?JavaScript (ES6), 45 bytes
O caminho ingênuo.
Experimente online!
fonte
s=>!/[~\/][\/_]|[_\\][\\~]/.test(s)
. Ele verifica se\/
ou~
termina em\/
ou_
. E então, verifica se\\
ou_
termina em\\
ou~
.R ,
89 87 8178 bytes-2 bytes graças a @ Giuseppe
-6 bytes graças a @Nick Kennedy
-3 bytes substituindo
1:length(y)
porseq(a=y)
, ondea
é a abreviação dealong.with
usos
\ / _ ~
. Provavelmente isso não é tão curto quanto uma solução baseada em regex, mas imaginei fazer algo um pouco diferente para todos os outros.Os caracteres menores que 93 alternam o estado de cima para baixo (ou vice-versa) e, como tal, se comportam como
-1
enquanto os outros não fazem nada e se comportam como1
, cumprod rastreia o estado com relação ao início. Os números pares estão em um estado norte (representado por-1
), os números ímpares estão em um estado inativo (1
). Se a sequência não for quebrada, o estado rastreado multiplicado pela posição cima / baixo não deve mudar, sempre será a condição inicial (-1
ou1
)Experimente online
fonte
()
voltay%%2
para salvar 2 bytes, já que os operadores especiais%(any)%
têm uma alta prioridade.!
Python , 46 bytes
Experimente online!
Confirma que cada par adjacente de caracteres se conecta, verificando se eles aparecem consecutivamente23= 8
__/~~\/\_
. Essa sequência pode ser vista como uma sequência De_Bruijn nos triplos das posições alta / baixa.Tentei outros métodos menos monótonos para verificar pares de caracteres, mas eles eram todos mais longos que codificavam todos os pares legais como esse.
fonte
C (gcc) , 93 bytes
Experimente online!
fonte
w,o,r;k
.Chip
-z
, 17 bytesExperimente online! (O TIO inclui
-v
para facilitar a compreensão da saída.)Espera o
_/~\
conjunto. Retorna\x00
(falsy) ou\x01
(truthy).A estratégia para minha resposta usa as seguintes informações:
A
: Esta posição de bit ocorre1
quando o lado esquerdo do símbolo está baixo e0
quando está altoF
: Esta posição de bit ocorre0
quando o lado direito do símbolo está baixo e1
quando está altoC
: Esta posição de bit ocorre com sempre seja1
Usando essas informações, basta verificar se o
F
de cada caractere corresponde aonot A
do próximo. Umxor
portão é uma maneira conveniente de conseguir isso.O código a seguir faz isso, mas fornece saída para cada emparelhamento (mais um extra
1
no início) (7 bytes):Queremos interromper na primeira falha e também imprimir se paramos dentro da string ou no terminador nulo (também adicionamos
-z
para nos dar um terminador nulo). Podemos usarnot C
para indicar onde paramos, e isso nos dá este programa (13 bytes):Mas ainda temos "zeros à esquerda" (por exemplo,
\_/\
dá00 00 00 00 01
), então isso é transformado na resposta dada no topo.fonte
05AB1E ,
29149 bytesPorto de @Arnauld resposta Jelly 's , por isso, certifique-se de upvote-lo bem!
Entrada com
‾
.Experimente online ou verifique todos os casos de teste .
Resposta original de 29 bytes :
Insira com em
~
vez de‾
.Soou mais curto na minha cabeça ..
Vai tentar jogar golfe daqui.Experimente online ou verifique todos os casos de teste .
Explicação: "
Veja esta minha dica do 05AB1E (seções Como aceitar números inteiros grandes? E Como comprimir listas inteiras? ) Para entender por que
•6_üê{↕
é1781179816800959
,ƵΔ
é180
e•6_üê{↕ƵΔв
é[52,66,69,100,103,131,179]
.Explicação adicional:
["/_", 52]
["\~", 66]
["_~", 69]
["//", 100]
["\\", 100]
["_\", 103]
["~_", 131]
["~/", 179]
__
~~
//
\\
0
100
~
e_
na sequência de entrada, antes de calcular e verificar as diferenças de pares.fonte
Python 3 ,
797063 bytesEconomizou 16 bytes graças a Arnauld e Jo King, obrigado!
Experimente online!
Python 3 ,
6760 bytes com ~ em vez de ‾Experimente online!
fonte
Python 3, 126 bytes
fonte
Haskell , 70 bytes
Essa variante usa em
~
vez de overlines. Ele pega todos os oito pares válidos e verifica se a sequência contém apenas aqueles:Experimente online!
Ungolfed:
fonte
Perl 6 , 32 bytes
Experimente online!
Uma solução regex que simplesmente verifica se a sequência não contém sequências inválidas.
Explicação:
fonte
R , 43 caracteres, 47 bytes
É o mesmo regex que as outras respostas usam, mas adaptado para R.
Experimente online!
E xkcd obrigatório .
fonte
~
no lugar de‾
para chegar a 43 bytes, 43 caracteres.Quarto (gforth) ,
10098 bytesExperimente online!
Explicação
Percorra a sequência e determine se cada caractere começa na mesma posição (superior ou inferior) que a anterior antes de terminar. Subtraia 1 de um contador se não corresponderem. No final, se o contador mudou, a sequência não é uma sequência.
A posição final é alta se char for
/
(47) ou~
(126). Caso contrário, está baixoA posição inicial é alta se char for
\
(92) ou~
(126). Caso contrário, está baixoCódigo Explicação
fonte
Python 3 ,
80bytesEu realmente não faço muitos campos de código python, mas achei que poderia tentar
Experimente online!
Python 3.8 (pré-lançamento) , 71 bytes
Eu queria experimentar a nova
:=
atribuição de expressãoExperimente online!
fonte
Geléia ,
13 1211 bytesUm link monádico que aceita uma lista de caracteres usa o
~
lugar da‾
opçãoExperimente online! Ou veja uma suíte de testes (... onde eu reordenei para colocar as 8 falsey no final)
Essa fórmula foi encontrada mexendo à mão: p (como as que estão abaixo)
Para este, eu também todos os 16 pares de ordinais de caracteres tratados como exponenciação e procuramos um módulo grande que caiba em três bytes, seguido por um módulo de um byte (1,2,3,4,5,6,7,8 9,10,16,256) que particionaram os 16 de modo que todos os resultados aceitáveis fossem 1 ou 0 ("insignificantes"), pois sei que
Ị
é mais curto do que<5
na minha solução anterior, que procurava todos os resultados aceitáveis inferiores a todos inaceitáveis.Os possíveis personagens vizinhos e suas avaliações internas:
Anterior @ 12:
Experimente online!
Anterior @ 13:
Experimente online!
fonte
Ị
estava testandoabs(x)<1
e nãoabs(x)≤1
. Isso oferece mais algumas oportunidades. :) (Estou preso em 11 bytes também por enquanto.)Ị
é útil com muita frequência.perl 5,
2625 bytesusando
;
como delimitador, o delimitador final pode ser removidoTIO
26 bytes
fonte
Excel, 150 bytes
Remove quaisquer pares inválidos e, em seguida, retorna
true
se isso resultar na string original.fonte
Haskell, 42 bytes
essa solução usa
~
e a função a ser chamada é h (ou seja,h string
fornece a resposta)A solução usa uma função g que, dada uma lista, retorna todas as tuplas de valores adjacentes na lista.
Em seguida, usamos g para gerar a lista de vizinhos permitidos (in
g"__/~~\\/\\_"
) e também a lista de todos os pares vizinhos na lista de entrada. Em seguida, verificamos que cada par vizinho é um par permitido.fonte
C (gcc) ,
4136 bytesExperimente online!
-5 eliminado
&1
partindo de uma idéia de Peter Cordes ; operadores alterados (precedência) para remover parêntesesUsos
~
. Verifica o primeiro e o sexto bits das representações binárias dos dois primeiros caracteres:e atravessa a string recursivamente.
(*_ / 32) & 1
é verdadeiro apenas para caracteres que terminam altos, enquanto*_ & 1
é válido apenas para caracteres que começam baixos.(x&1) ^ (y&1) == (x+y)&1
. XOR é adicionar sem transportar, e transportar não perturba o bit mais baixo. O valor1
vem dof(_)
valor de retorno, se o restante da string for pegajoso.fonte
c&32
É válido para caracteres que terminam altos, enquantoc&1
é válido apenas para caracteres que começam baixos.)*_ ^ *++_
é um comportamento indefinido:^
não é um ponto de sequência, portanto não há um relacionamento sequencial antes para garantir que eles tenham caracteres diferentes. É claro que também falta umreturn
, portanto, ele só funciona com o localgcc -O0
onde o corpo da função é uma expressão-declaração.&1
duas vezes é redundante.(x^y)&1 == (x&1) ^ (y&1)
. Mas, dada a precedência do operador C em que&
tem prioridade mais alta que^
(diferentemente dos operadores aritméticos em que + e - têm a mesma prioridade), precisamos adicionar()
2 bytes para remover&1
2 bytes, porque(x&1) ^ y
não é equivalente. Mas talvez o uso de parênteses abra oportunidades para outras economias. Felizmente, não é um problema para uma versão em código de máquina x86, onde a manipulação de bits é muito compacta ...Bash, 30 bytes
A entrada é STDIN. O código de saída é 1 se válido, 0 se inválido.
fonte
SNOBOL4 (CSNOBOL4) , 58 bytes
Experimente online!
Não produz nada para verdade e um número inteiro positivo (indicando a posição da primeira quebra na cadeia) para falsidade.
fonte
Carvão ,
3218 bytesExperimente online! Link é a versão detalhada do código. Explicação:
fonte
código de máquina x86, 13 bytes.
(Ou 11 bytes sem manipular cadeias de caracteres simples trivialmente.)
Usa a verificação de posição de bit da resposta C de @ attinat
O mesmo código de máquina funciona nos modos de 16, 32 e 64 bits. A fonte é NASM para o modo de 64 bits.
É possível chamar de C como
unsigned char string_connected(int dummy_rdi, const char *s, int dummy_rdx, size_t transitions);
na convenção de chamada do System V x86-64. Nãobool
porque o caso transitions = 0 retorne um código ASCII, não 1.RCX = len = strlen(s) - 1
. ou seja, o número de limites de caracteres = transições para verificar a cadeia de comprimento explícito.Para
transitions > 0
, retorna 0 (incompatibilidade) ou 1 (conectado) e deixa ZF definido de acordo. Paratransitions == 0
, retorna o byte único da sequência (que é diferente de zero e, portanto, também é verdade). Se não fosse nesse caso especial, poderíamos descartar o JRCXZ de saída antecipada. Ele está dentro do loop apenas porque AL não é zero lá.A lógica da posição do bit é baseada na observação de que o bit 0 do código ASCII indica a altura inicial e o bit 5 indica a altura final.
Arnês de teste (modificado a partir do link TIO da attinat, cuidado com o ponto de sequência C UB nessa função de referência C). Experimente online! . Esta função está correta para todos os 30 casos. (Incluindo os casos de caractere único em que o valor de retorno não corresponde: ambos são verdadeiros com valores diferentes de zero nesse caso.)
fonte
Excel, 79 bytes
Célula
A1
como entradafonte
Dardo , 94 bytes
Experimente online!
fonte
C ++,
132110 bytes-22 bytes graças ao ASCII-only
Usa uma máscara de bits para saber se o início e o fim estão ativos ou inativos
fonte
Retina , 26 bytes
Experimente online!
Usa em
~
vez de‾
, porque isso facilitou a digitação.fonte
Regex, 34 bytes
Não consegui encontrar regras sobre o uso do Regex como idioma. Entre em contato se precisar ajustar isso.
Experimente aqui: https://regex101.com/r/s9kyPm/1/tests
fonte
‾
para~
APL + WIN, 58 bytes
m ← 2 2⊤ '_ / \ ~' ←s ←, ⎕⋄ (1 + ⍴s) = + / ((↑ m [0;]), m [1;]) = m [0;], ¯ 1 ↑ m [1;]
Solicita a entrada da string, origem do índice 0 e usa ~ para o caractere superior
Experimente online! Cortesia de Dyalog Classic
fonte