Números de Confidente
Let x
Ser um número inteiro de uma base arbitrária, tal que D
é uma matriz de seus dígitos. x
é um número confidencial se, para todos os n
intervalos 1
e o comprimento de D
:
D[n+1] = D[n] + D[n-1] + ... + D[1] + n
Pegue, por exemplo, o número 349
na base 10. Se rotularmos os índices desse número, temos o seguinte.
Index Digit
----- -----
1 3
2 4
3 9
A partir do primeiro dígito, temos 1 + 3 = 4
, que produz o próximo dígito. Então, com o segundo dígito, temos o 3 + 4 + 2 = 9
que, novamente, gera o próximo dígito. Portanto, esse número é um número confidencial.
Dado um número inteiro com uma base entre 1 e 62, calcule todos os números de confidencial para essa base e produza uma lista deles, separados por novas linhas. Você pode assumir que há uma quantidade finita de números confidenciais para uma determinada base.
Para dígitos maiores que 9, use os caracteres alfa A-Z
e para dígitos maiores que Z
os caracteres alfa a-z
. Você não precisará se preocupar com dígitos além z
.
Eles não precisam ser impressos em nenhuma ordem específica.
Entrada de amostra:
16
Saída de amostra:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F
Isso é código de golfe, então o código mais curto vence. Boa sorte!
(Obrigado a Zach por ajudar na formatação e apontar alguns problemas.)
CD
não está na lista? Como todas as outras combinações em que o segundo dígito é um a mais que o primeiro dígito estão listadas, não entendo porCD
que não se qualifica.Respostas:
Pitão, 38 bytes
Experimente online: Demonstração
Explicação:
fonte
Python 2, 104 bytes
Isso usa a seguinte observação: em um número de confidente, o dígito
i
é seguido por2*i+1
, excetoi+1
pelo segundo dígito. Tentando todos os primeiros dígitos possíveis e adicionando mais dígitos até que fiquem grandes demais, podemos gerar todos os números de confidente.Calculamos o caractere correspondente ao número
i
comochr(48+i+(i>9)*7+i/36*6)
, que o altera para o número, letra maiúscula ou intervalo de letras maiúsculas para os intervalos0-9, 10-35, 36-61
.Então, aumentamos
i
viai+=i+1
com dois ajustes. Para fazer issoi+=1
depois do primeiro dígito, adicionamos ai
condição des
ter mais do que1
caracteres. Além disso, precisamos evitar que os números que começam com 0 sejam impressos e, ao mesmo tempo, permitam0
. Para fazer isso, fazemos um hack que causai=0
falha na condiçãoi<n
no próximo loop, adicionandon
a ele. Isso é feito substituindo1
porn**0**i
, que associa à direitan**(0**i)
, que é igual an**(i==0)
oun if i==0 else 1
.fonte
Python 3,
201200 bytesExplicação
O principal insight aqui é que, dada uma sequência
x
(como, digamos[1,2,5]
), você pode obter o próximo termo na sequência comsum(x)+len(x)
, o que fornece11
neste caso (B
). Verifique se é menorn
e, se for, adicione a sequência estendida à lista de todas essas sequências (propagadas por todos os dígitos únicos).É assim que mapeio itens de sequência para caracteres. Eles são
''.join
editados juntos e impressos, separados por novas linhas.fonte
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))
. Além disso, atualmente são 201 bytes; não 200.GS2, 44 bytes
Ele produz os números em uma ordem diferente, mas a descrição do problema não especifica, então eu vou em frente! Aqui está a saída para entrada de 16.
Aqui estão os equivalentes mnemônicos para os bytes:
fonte
CJam,
464240 bytesExperimente on-line no intérprete CJam .
Como funciona
No final 0 e algumas matrizes vazias são deixadas na pilha, para que o intérprete imprima
0
.fonte
boquiaberto, 111 bytes
Para cada dígito inicial de
1
parabase-1
ele calcula os próximos dígitos e, embora sejam inferiores à base, ainda temos um número de confidente. Calculando o próximo dígito durante a impressão. Finalmente imprime0
.fonte