Snaking Number Challenge
Gostaria de saber quantos números serpenteantes existem entre 1 e 50.000?
Números serpentes, neste jogo, são números que podem ser digitados em um teclado numérico tradicional (formato abaixo) movendo uma tecla para cima, para baixo, para a esquerda ou para a direita.
7 8 9
4 5 6
1 2 3
0
Por exemplo, se você começar com o número 5, poderá selecionar 4, 6, 8 ou 2 como sua próxima jogada válida - no entanto, 7, 3, 9 e 1 estão fora dos limites, pois estão posicionados na diagonal em relação à tecla atual . Portanto, se você tiver 5 e 2, suas próximas opções de teclas viáveis serão 0, 1, 3 ou 5 novamente.
Neste exercício do Code Golf, você deve produzir uma lista de todos os números positivos de serpentina entre 1 e 50k, juntamente com uma contagem final de todos os números que atendem ao critério.
Regras
- Os números não podem começar com um zero.
- Os números devem ser inteiros positivos inteiros.
- Cada número consecutivo, lido da esquerda para a direita, deve "serpentear" ao redor do teclado numérico.
- A cobra não pode viajar na diagonal pelas teclas
- O número 0 pode ser acessado pelos números 1 e 2
- Os números não podem ser emparelhados (por exemplo: 22)
Exemplos de números de serpentes válidos:
12369
45201
1254
10102
1
12
987
Exemplos de números inválidos
1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159 - snake cannot travel diagonally
4556 - duplicate 5
De acordo com o Code Golfs normal, o objetivo é o menor número de bytes!
De acordo com as minhas regras e matemática, você deve ter 670 números válidos na lista e mais 670 em si como o último número.
Respostas:
K (ngn / k) ,
6057 bytesExperimente online!
!50000
lista de0
..49999
1+
adicione 1 a todos{
}#
filtrar com a função{
}
10\x
dígitos decimais do argumento(
)@
use como índices em ...!3 3
um par de listas:(0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)
2*
multiplique tudo por 20 1,'
anexar0
à primeira lista e1
à segunda+
transpor (par de listas -> lista de pares). isso nos dá as cordas de botão aproximadas.-':
subtrair de cada par o par anterior. usar0 0
como um elemento imaginário antes do primeiro.1_
largar o primeiro+
transporx*x:
quadrado (atribuirx
e multiplicar porx
). Aquix
está um par de listas - xs e ys+/
somar as duas listas (elemento por elemento)5&
min com 53!
mod 31=
lista booleana de onde é igual a 1*/
produto (booleano "e")(x;#x:
)
faça um par do resultado e o comprimento (#
) do resultadofonte
Geléia ,
2423 bytesUm programa completo que imprime uma lista de todos os resultados e, em seguida, o número de resultados.
Experimente online!
Quão?
fonte
1.
avalia a1.5
?Python 3 , 140 bytes
Experimente online!
Estou certo de que alguém será capaz de fazer isso com uma expressão em vez de uma string de pesquisa.
fonte
Python 2 , 101 bytes
Experimente online!
O número hexadecimal é decimal
10120214525632365878969854741
, que codifica todos os pares ordenados de dígitos que podem aparecer adjacentes um ao outro.fonte
JavaScript (V8) ,
112 106104 bytesGuardado 2 bytes graças a @NahuelFouilleul
Um programa completo.
Experimente online!
Ou 96 bytes, se pudermos emitir os números na ordem inversa:
Experimente online!
fonte
3
talvez porque36
já esteja na string6589632145201478
é um byte mais curtoStax ,
3735 bytesExecute e depure-o em staxlang.xyz!
Foi tão agradável e curto, até que não foi.
Descompactado (42 bytes) e explicação
2012365478963258741 codifica o teclado. Veja pares de dígitos adjacentes. Talvez se eu pudesse obter uma alternativa decentemente curta que fosse nas duas direções para cada par, eu poderia cortar os oito bytes de
{{om
.Sem esse 670 à direita, um filtro simples seria suficiente: em
f..!
vez de{..C_Qf%p
. Pode haver uma maneira melhor de lidar com essa irregularidade. Nos dois casos, esse comportamento do intervalo de filtro não é documentado.fonte
PHP , 145 bytes
Experimente online!
Para cada número de 1 a 50.000, verifica todos os dígitos desse número da esquerda para a direita. Se todos os dígitos estiverem na lista de dígitos válidos do dígito anterior, esse número será impresso. No final, imprime um 670 codificado permanentemente, uma vez que leva menos bytes do que realmente conta.
fonte
05AB1E , 23 bytes
Experimente online!
Resposta da geléia do porto de Jonathan Allan .
fonte
₄50*
ou4°5*
quando estava fazendo uma tentativa anteriormente. E, a princípio, fiquei confuso por que você tinha, e€OP
não apenasOP
, mas então percebi que os números de um dígito (sendo uma lista vazia depois daüα
) seriam em[] → 0 → 0
vez de[] → [] → 1
. :)4°5*
quando você pode5°;
? Eu gosto mais do ZAK. E sim, esse argumento de ponta para números de um dígito é uma dor.Perl 5 (
-M5.01
),96, 92 bytes-4 bytes graças a @Xcali
TIO
fonte
JavaScript (SpiderMonkey) ,
179173151129 bytesExperimente online!
-22 bytes graças a Arnauld -22 bytes graças a dana
explicação:
A @dana também forneceu uma solução de 123 bytes se pudermos imprimir 670 primeiro
fonte
Ruby , 99 bytes
Experimente online!
fonte
Stax ,
2826 bytesExecute e depure
Descompactado, não jogado e comentado, parece com isso.
Execute este
O molho secreto está na cadeia literal
"{<f:[/T8Z"
. Depois de juntar todos os pontos de código juntos, você obtém12360102589147845690
. Os pares ascendentes nesta cadeia são os movimentos válidos da cobra.fonte
15JJ
em vez de219J
funcionaria também, mas não acho que você possa obter qualquer byte a partir daí, a menos que haja uma constante de 1 byte15
.Haskell , 118 bytes
Experimente online!
Um primeiro passe; Eu não sou bom em compressão.
o
s=
não conta, já que não precisamos vincular o resultado.Código não destruído .
fonte
Carvão , 42 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Processe o intervalo inclusivo de
1
para50,000
converter em sequência.Filtre os que possuem pares de dígitos não contidos na sequência compactada
01478963202125458565236987410
.Saída da matriz restante e seu comprimento.
fonte
Japonês , 34 bytes
Tente
fonte
Perl 6 , 64 bytes
Experimente online!
Explicação
fonte
~>
ainda não tenha sido implementado; caso contrário, você poderá fazer isso apenas com operadores de string, com o campo de bits sendo uma stringPitão ,
686545 bytesExperimente online!
A inspiração para o processo de pesquisa revisado veio da resposta Stax de Khuldraeseth na'Barya , dê um eles!
Edit 2: Rewrote para salvar um monte de bytes, versão anterior:
Edit: Golfed 3 bytes usando pesquisas de string, versão anterior:
fonte