Inspirado por Gerar números amigáveis do teclado .
fundo
Muitos botões numéricos têm o seguinte layout:
789
456
123
0
Definimos a vizinhança de um número como o conjunto de células ortogonalmente adjacentes a ela no teclado numérico mostrado, incluindo a si próprio. Por exemplo, o bairro 2 é {1,5,3,0,2}
e o bairro 0 é {1,2,0}
. Há uma lista da vizinhança de cada número abaixo, acima dos casos de teste.
Definimos um número amigável do numpad como um número inteiro positivo, onde, quando escrito em decimal sem zeros à esquerda, cada dígito, exceto o primeiro, fica na vizinhança do dígito anterior.
Por exemplo,
- 7856 é um número amigável para numpad porque 8 está no bairro de 7, 5 no bairro vizinho de 8 e 6 no bairro de 5.
- 1201 é um número amigável para numpad porque 2 está no bairro de 1, 0 está no bairro de 2 e 1 está no bairro de 0.
- 82 não é um número amigável para numpad porque 2 não está na vizinhança de 8.
- 802 não é um número compatível com o teclado numérico, porque 0 não fica na faixa de 8 (as vizinhanças não ficam por aí).
Sequência OEIS relacionada . Observe que essa sequência relacionada é distinta porque conta 0como adjacente a em 7vez de 1e 2.
Desafio
Dado um número inteiro positivo n
, retorne o n
-ésimo ou o primeiro n
número amigável do teclado numérico, onde o primeiro é 1. Você pode usar a indexação baseada em 0, onde o número amigável do teclado numérico 0 seria 1.
Bairros
A vizinhança de cada dígito está listada aqui:
0:{0,1,2}
1:{0,1,2,4}
2:{0,1,2,3,5}
3:{2,3,6}
4:{1,4,5,7}
5:{2,4,5,6,8}
6:{3,5,6,9}
7:{4,7,8}
8:{5,7,8,9}
9:{6,8,9}
Casos de teste / sequência
Estes são os primeiros 100 termos
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 20, 21, 22, 23, 25, 32, 33, 36, 41, 44, 45, 47, 52, 54, 55, 56, 58, 63, 65, 66, 69, 74, 77, 78, 85, 87, 88, 89, 96, 98, 99, 100, 101, 102, 110, 111, 112, 114, 120, 121, 122, 123, 125, 141, 144, 145, 147, 200, 201, 202, 210, 211, 212, 214, 220, 221, 222, 223, 225, 232, 233, 236, 252, 254, 255, 256, 258, 320, 321, 322, 323, 325, 332, 333, 336, 363, 365, 366, 369, 410, 411, 412, 414, 441, 444, 445, 447]
fonte
Respostas:
JavaScript (ES6),
104938988 bytesRetorna o termo n-ésimo da sequência, indexada em 1.
Demo
Mostrar snippet de código
fonte
k=(n,a=1)=>n?k(n-([...(x=a+[]).slice(0,-1)].reduce((a,c)=>a*!!~"012 0124 01235 236 1457 24568 3569 478 5789 689".split` `[c].indexOf(x[i++]),i=1)),a+1):a-1
talvez algo não ajuda, o meu teste é provavelmente demasiado longoPerl 5 , 123 + 1 (-p) = 124 bytes
Experimente online!
fonte
Geléia ,
2724 bytesRetorna os N primeiros termos da sequência.
Experimente online!
Esta é uma porta da minha resposta JS .
fonte
05AB1E ,
2423 bytesExperimente online!
Retorna o enésimo número na sequência.
Explicações:
A idéia principal é que, além da
0
chave, qualquer dígito decrementado e convertido na base 3 tenha as seguintes propriedades:É claro que precisamos de uma
if
declaração para lidar com a0
tecla numpad.fonte
MATL ,
2927 bytesProduz os primeiros
n
números compatíveis com o teclado.Experimente online!
Explicação
Cada dígito de
1
a9
é codificado como um número complexo que representa sua posição no teclado numérico, usando em uma grade da etapa 2, onde a parte real representa a posição vertical e a parte imaginária representa a posição horizontal. Então1
é0+0j
,2
é0+2j
,3
é0+4j
,4
é2+0j
, ...,9
é4+4j
.O dígito
0
é codificado como0+1j
, ou seja, como se fosse colocado exatamente entre1
e2
.Para cada número amigável-numpad candidato, um "decimal" conversão de base é aplicado usando o acima números complexos em vez dos dígitos
0
,1
, ...,9
. Isso fornece uma matriz, da qual as diferenças consecutivas absolutas são calculadas. O número do candidato é compatível com numpad se e somente se todas as diferenças absolutas forem no máximo2
(isto é, a etapa da grade). Se for esse o caso, o número é deixado na pilha.O código usa um loop
do
...while
, que é encerrado quando a quantidade de números na pilha é igual à entradan
.Uma grade de unidades teria sido uma escolha mais natural. Dígitos
1
,2
e0
, então, correspondem a0+0j
,1+0j
e0.5+0j
respecrively. Mas é mais golfista usar uma grade do passo 2, porque multiplicar por2
(funçãoE
) e pressionar0+1j
(funçãoJ
) é um byte menor que pressionar0+0.5j
(J2/
ou.5j
)fonte
Geléia , 26 bytes
Experimente online!
-2 bytes graças a caird coinheringaahing
-2 bytes graças a Erik the Outgolfer
Explicação
fonte
[]
por 2 bytesPython 2 , 134 bytes
Experimente online!
fonte
f
e usá-lo uma vez , você pode incorporá-lo e salvar dois bytes .Mathematica,
249234202 bytesExperimente online!
agradece user202729 por compactar dados (-32 bytes)
Meus resultados:
fonte
IntegerDigits
:,IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}
e useFreeQ
,Tr
use emDo
vez deFor
, use notação infix paraAppendTo
e use emDo
vez deWhile
repetirTr[1^s]
vezes, também elimine a variávelp
. Além disso, você não provou que o algoritmo está correto, ou seja, o número resultante é sempre menor que seu índice ao quadrado, o que é necessário para validar uma resposta.PHP, 124 + 1 bytes
Execute como pipe
-nR
ou experimente online .fonte
Java 8,
192190 bytesRetorna o número (indexado 1)
n
na sequência.Isso foi surpreendentemente mais difícil do que eu pensava .. Provavelmente apenas tendo alguns peidos cerebrais esta tarde ..
Explicação:
Experimente aqui.
fonte