A maioria dos smartphones Android permite que o usuário use um padrão de furto para abrir o telefone:
Certos padrões são legítimos e outros são impossíveis. Dado um padrão de furto de entrada, retorne uma verdade ou falsidade indicando se o padrão de entrada fornecido é legal ou não.
Entrada
A grade é rotulada em linha 1 a 9:
1 2 3
4 5 6
7 8 9
A entrada é um número composto pelos nós visitados do primeiro ao último. Por exemplo, o padrão de furto acima é 12357.
A entrada pode ser um número decimal, sequência ou lista de números. Não conterá 0 porque não há nó 0.
Alteração: a indexação de 0 a 8 é permitida, pois muitos idiomas indexam de 0. Se você usar de 0 a 8, será necessário indicar como tal no início de sua resposta e ajustar os casos de teste de acordo.
Regras
Cada nó inicia como não visitado inicialmente e pode ser visitado apenas uma vez. Qualquer padrão que visite um nó mais de uma vez é falso.
Um padrão de verdade deve conter pelo menos um golpe, portanto, no mínimo 2 nós.
Não é possível pular um nó não visitado diretamente em linha com outro. Por exemplo, 13 é falso porque 2 não é visitado e está diretamente alinhado.
Só é possível pular um nó visitado. 42631 é um exemplo disso.
As linhas podem cruzar-se de outra maneira. Por exemplo, 1524 é verdade.
Suponha que as larguras dos nós sejam insignificantes e ignore questões práticas (espessura dos dedos, etc.). Portanto, 16 é verdade, embora possa ser um pouco mais difícil de alcançar na realidade.
Casos de teste
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
Isso é código-golfe , então o menor número de bytes vence.
fonte
Respostas:
JavaScript (ES6), 64 bytes
Recebe a entrada como uma matriz de números. Os valores de falsidade são 0 ou NaN . Os valores reais são números inteiros estritamente positivos.
Casos de teste
Mostrar snippet de código
Quão?
Preâmbulo
Dois dígitos são opostos na vertical, na horizontal ou na diagonal se:
OU ambos são pares e sua soma é 10 (figura 2)
Além disso, o algarismo de pé entre dois dígitos opostas n e p é igual a (n + p) / 2 .
Código fonte formatado
Acompanhar os dígitos anteriores
Os sinalizadores dos dígitos visitados são armazenados em índices negativos na matriz de entrada a , para que não colidam com seus elementos originais.
Se p estiver definido como -n :
Se o dígito atual n não foi selecionado anteriormente,
a[-n] ^= -n
definirá o sinalizador e deixará oevery()
loop continuar com a próxima iteração. Caso contrário, ele limpará a bandeira e forçará o loop a falhar imediatamente.Se p estiver definido como indefinido :
a[undefined] ^= undefined
resulta em 0 , o que também força o loop a falhar.Detectando dígitos opostos
A expressão a seguir é usada para testar se o dígito atual n e o dígito anterior -p são dígitos opostos, conforme definido no preâmbulo:
que é equivalente a:
Nota: Em JS, o resultado do módulo tem o mesmo sinal que o dividendo.
Pode ser interpretado como:
Portanto, essa expressão retornará 1 se e somente se n e -p forem dígitos opostos ou forem o mesmo dígito ímpar. Como um dígito não pode ser selecionado duas vezes, este último caso é resolvido corretamente.
Se essa expressão retornar 1 , testamos um [p / 2] (onde p agora é igual à soma negada dos dígitos) para saber se o 'dígito intermediário' foi visitado anteriormente. Caso contrário, testamos um [0] que é garantido como verdadeiro.
Sobre a primeira iteração
A primeira iteração é um caso especial, pois não existe um dígito anterior e queremos que ele seja incondicionalmente bem-sucedido.
Conseguimos isso inicializando p para 1 , porque para qualquer n em [1 .. 9] :
(1 * n) % 5
não pode ser negativo~(1 - n)
não pode ser igual a 9Resposta original, 90 bytes
Removido desta postagem para que não fique muito detalhado. Você pode vê-lo aqui .
fonte
!!a[1]&
pora[1]&&
, já que qualquer valor verdadeiro pode ser retornadoa[1]*
é ainda mais curto.)has a node directly in line
, eu não sabia que seria tão simples ...?a[-n]^=1:0
com&&a[-n]^=1
para-1, não pode testar (no celular)código de máquina x86 de 32 bits,
6260 bytesHexdump:
Ele recebe o comprimento da lista
ecx
e um ponteiro para o primeiro elemento emedx
e retorna o resultado emal
:Existem 8 linhas que contêm um nó no meio:
Agrupei-os de acordo com a diferença entre o número maior e o menor.
Em seguida, converti isso para uma tabela de pesquisa 2D indexada pela meia diferença e número menor:
Isso cria um bitmap "mágico" de 32 bits. Para indexá-lo, o código o empurra para a pilha. Em seguida, extrai um byte usando um índice e, a partir desse byte, extrai um bit usando o outro índice. Tudo isso usando uma instrução:
Se o bitmap indicar que existe um nó no meio, é fácil calcular - adicione metade da diferença ao número menor.
Fonte de montagem:
fonte
bt byte ptr [esp + eax], ebx
.cdq
vez dexor edx, edx
comoeax
é zero. Além disso, você pode dobrar odec eax
embt [esp + eax - 1], ebx
que é o mesmo comprimento, mas, em seguida, permite que você remova ainc ebx
tarde. Isso deve economizar dois bytes.Python 2 ,
14013111410499 bytes-2 bytes graças a Jonathan Frech
-5 bytes graças a Chas Brown
Experimente online!
Explicação:
Experimente online!
Apenas 8 pares de nós têm um nó entre eles. Um par de nós pode ser representado como um único número inteiro pela fórmula
2^a-2^b-1
. Este número pode ser reduzido por módulo repetido:(2**n+~2**l)%21%15%9==5
primeiro verifica se esse par está presente, depoisv-{l+n>>1}==v
testa se o nó intermediário, fornecido por(a+b)/2
, ainda não foi visitado eq
gera um NameError. Ao usar a comparação encadeada entre esses pares, a próxima comparação é executada apenas quando a anterior retornouTrue
.fonte
Gelatina ,
24 22 1918 bytes-2, já que não somos mais obrigados a lidar com uma lista vazia
-1, alternando de join,
j@
para concatenar;
(o item perdido não precisa ser encontrado no meio para o método empregado, estar no início do trio é bom. )-2 alternando de
P¬aSH
paraoSH
(OK para obter dois resultados, pois achatamos, metade1
é0.5
que é filtrado para fora de qualquer forma, e ter vários resultados iguais não tem efeito sobre o método utilizado qualquer um)-1 Graças ao Sr. Xcoder (0-indexado entrada é permitida)
Um link monádico que obtém uma lista de números inteiros em
[0,8]
e retorna um valor1
verdadeiro (0
) se for legal e um valor falsey ( ) se não.Experimente online!ou veja uma suíte de testes .
Quão?
Examina cada par adjacente de nós indexados 0 na lista de entrada. Se a divisão inteira por três dos dois diferir por 2, eles estarão nas linhas superior e inferior; se o módulo por três dos dois diferir por 2, eles estarão nas colunas da esquerda e da direita. A soma desses pares divididos por dois é o nó médio indexado a 0 de uma linha de três nós ou um valor não inteiro - portanto, esses valores são inseridos primeiro na frente do par indexado em 0 e, em seguida, qualquer nós falsos (como
0.5
ou3.5
) são removidos, a lista resultante de listas é achatada e desduplicada (para gerar entradas exclusivas preservadas por ordem) e finalmente comparada à entrada - para um furto legal, tudo isso acabará sendo proibido enquanto ilegal ones adicionam nós médios ausentes e / ou removem nós duplicados (observe que nenhuma caixa especial é necessária para uma lista de entrada de comprimento 1, pois não possui pares adjacentes):Método anterior
Geléia ,
3635 bytesExperimente online! ou veja uma suíte de testes .
Quão?
Semelhante ao acima, mas constrói todas as possibilidades de linha de três nós e executa a pesquisa (em vez de verificar o uso do divmod para testar e reduzir pela metade a soma do nó intermediário).
Primeiramente a construção da lista de linhas de três nós:
Agora a tomada de decisão:
fonte
Stax , 28 bytes
Executá-lo
Produz 0 para números inteiros falsos e positivos para verdadeiro. A representação ascii correspondente do mesmo programa é essa.
A idéia geral é calcular várias condições necessárias para os padrões de furto legal e multiplicá-los todos juntos.
fonte
Y
registro.v
e incluir1
como valor falso.2
e acima são verdadeiras.JavaScript, 112 bytes
Talvez alguma linguagem baseada em regex deva ser mais curta. Mas eu não sei.
Mostrar snippet de código
Graças a Neil, altere
)(?!
para|
salvar 3 bytes.fonte
144
.Retina 0.8.2 , 98 bytes
Influenciado pela resposta do tsh . Tentei "reformular" para que fosse o oposto, correspondendo a furtos inválidos e depois ao Anti-grepping.
Experimente online
fonte
Casca ,
2520 bytesLeva uma lista de números inteiros com indexação baseada em 0. Retorna 0 ou 1. Experimente online!
Explicação
Eu roubei algumas idéias da resposta de Jonathan Allan Jelly . A idéia é a mesma: insira um novo "nó médio" entre cada par adjacente, filtre aqueles que não são nós reais, remova duplicatas e compare com a lista original. Se a lista original contiver duplicatas, o resultado será falso. Se a lista ignorar um nó não visitado, ele estará presente na lista processada entre o par correspondente e o resultado será falso. Se a entrada for um singleton, a lista processada estará vazia e o resultado será falso. Caso contrário, é verdade.
fonte
C ++,
267256 bytesPara verificar se o padrão não pula um nó não visitado, ele faz várias coisas:
d
onded
está a diferença numérica entre o nó atual e o último nó.d
for ímpar, não há necessidade de verificar, ele não pode pular um nó.d
for igual a4
ou8
, o salto será entre nós1-9
ou3-7
, portanto, verifique o nó5
d
for 2 e o nó do meio ((last_node + current_node)/2
) for 2,5 ou 8, verifique o nó do meiod
for 6, mesmo verificar como antes, mas com4
,5
ou6
Os parâmetros são um
int[]
e é contagem de elementos. Retorna umint
que pode ser interpretado como umbool
tipofonte
!(d%2)
=>d%2<1
deve funcionar.int s[]
=>int*s
. Eu acho que vai dar certo.Perl, 135 bytes (134 +
-n
)Versão ligeiramente não destruída
Saídas via código de saída.
0
é verdade, qualquer outro valor é falso. Conforme meta consenso , a saída STDERR no caso de falha é ignorada.Provavelmente, há uma maneira mais rápida de verificar a regra "não é possível pular" do que simplesmente listar todas as possibilidades.
fonte
MATL ,
424139 bytesIsso produz
Aqui você pode ler por que essas saídas são respectivamente verdadeiras e falsas. Experimente online!
Ou verifique todos os casos de teste , com código de rodapé que inclua o teste padrão de veracidade / falsidade.
fonte
Stax ,
73726665 bytes CP43779 bytes quando descompactado,
Execute e depure online!
ou execute o teste em lote , onde
meX
há um cabeçalho para que o Stax possa processar a entrada de várias linhas.Implementação sem usar hash.Outputs num número estritamente positivo (na verdade, o número de testes com falha) para casos falsos e
0
para truthy queridos.Explicação
d
limpa a pilha de entrada. A entrada está na variávelx
qualquer maneira.4{cAs-5F
gera a primeira parte da lista de nós do meio.132396978714EE
codifica a segunda parte da lista de nós do meio.L3/
Coleta todos os elementos na pilha principal e se divide em partes, cada uma contendo 3 elementos, o resultado é um arraya
, que é apenas a matriz de todos os grupos de 3 nós inválidos.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Para cada lista de nós inválidos, execute as seguintes verificações. O resultado dos resultados da verificação éand
ed usando o**
. Como existem 8 listas de nós inválidos, o resultado desse código será uma matriz de 8 elementos. O finalE
envia a matriz para seus elementos individuais na pilha principal.xs:I
obtenha o índice dos elementos da lista de nós na matriz de entrada.Bc0<A*++
Se o índice de "nó do meio" (por exemplo,5
no conjunto de nós1,5,9
) for-1
(o que significa que não existe na matriz de entrada), altere o índice para9
.cEd:-1=
teste se os dois "nós terminais" (por exemplo,1,5
no conjunto de nós1,5,9
) são adjacentes na matriz de entrada.sccHs|M=
testar se o índice transformado do "nó do meio" é maior que o dos dois "nós terminais", o que inclui dois casos: o "nó do meio" está ausente ou o "nó do meio" vem depois dos dois "nós de terminal"s{U>m|A
testa se os dois índices dos "nós finais" não são negativos. (ou seja, ambos aparecem na entrada).Dois testes adicionais são realizados,
x%2<
testa se a matriz de entrada é um singleton.xu%x%=!
testa se os nós foram visitados duas vezes.Há 10 resultados de teste na pilha principal (um para cada lista de nós inválidos, mais dois testes adicionais).
L|+
coleta os 10 elementos e os adiciona.|a
também poderia ter sido usado, o que simplesmente verifica se existem elementos verdadeiros na matriz.Saída implícita.
fonte
Java,
375355 bytes-20 bytes graças a Zacharý
Esta é uma porta desta resposta e funciona com os mesmos princípios
fonte
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
deve trabalhar (ordem de operações)(d==2)
para apenasd==2
, eu negligenciei isso antes.d%2==0
=>d%2<1
Pitão , 33 bytes
Suíte de teste.
Usa indexação baseada em 0.
Explicação
Abordagem alternativa para 34 bytes :
fonte
Japonês , 35 bytes
Experimente online!
Ligeiramente não-destruído e como funciona
Transportou a ideia dessa solução Jelly , com alguma diferença na determinação de possíveis saltos:
/3
ou%3
.%3
e verifica se a diferença é 0 ou 2. Se a diferença for 0, as duas células estão alinhadas verticalmente e os não-saltos ainda compartilham a propriedade de(X+Y)%2 != 0
.fonte
Python 2 , 97 bytes
Com base na resposta dos ovs, mas 2 bytes mais curtos e menos enigmáticos. Apenas converte índices em coordenadas 2D e testa a paridade. Assume de 0 a 8 índices.
Experimente online!
fonte