Vamos criar um sistema de números em que o maior dígito no enésimo valor colocado (contando da direita para a esquerda) de um comprimento de número m é sempre igual a m - n + 1. Para dar um exemplo, o maior número de 5 dígitos expressável neste sistema está escrito 12345. Além do número de dígitos disponíveis para uso em um local específico estar restrito, todo o restante incremento é padrão. Ou seja, quando um dígito ultrapassa seu limite, adicionamos um ao próximo dígito.
Aqui está como a contagem seria representada neste sistema:
1; 10; 11; 12; 100; 101; 102; 103; 110; 111; 112; 113; 120; 121; 122; 123; 1000; 1001 ...
Sua tarefa é escrever uma função que pega um número base 10 padrão e o converte no meu sistema de numeração.
Código mais curto é preferível. Bonne Chance!
** Se você precisar de dígitos após 9 (você deve), poderá optar por usar letras ou retornar um número de 2 dígitos como elemento de uma lista.
Casos de teste
10 -> 111
20 -> 1003
30 -> 1023
50 -> 1123
100 -> 10035
23116 -> 1234567
21977356 -> 123456789A
O último caso pode ser incrivelmente lento para executar, dependendo de como você implementou. Você não precisa executá-lo se demorar muito ou usar muita memória. No entanto, observe que existem maneiras de executá-lo rapidamente e usando pouca memória.
fonte
100 -> 10035
mais do que100 -> 10033
você pode verificar?Respostas:
Mathematica, 64 bytes
Função sem nome, usando um argumento inteiro positivo e retornando uma lista de números inteiros.
Join[{{1}},Array[Range,#-1,3]-1]
retorna a lista aninhada{ {1}, {0,1,2}, {0,1,2,3}, ..., {0,1,...,#} }
. Em seguida,Tuples
retorna o conjunto (classificado) de todas as tuplas cujo primeiro elemento está{1}
, cujo segundo elemento está{0,1,2}
, e assim por diante; esses são os#
números de dígitos neste sistema de numeração.Join@@Array[...,#]
retorna uma matriz de todos os números neste sistema de numeração com no máximo#
dígitos ePart[...,#]
extrai o#
th tal número.Isso é irremediavelmente lento! Ele funciona bem para a entrada de até 9. Para entradas maiores, teste-a substituindo a extremidade
,#],#]&
por,Ceiling[0.9Log[#]]],#]&
; isso coloca um limite mais realista no número de dígitos necessários para ir longe o suficiente no sistema de numeração para encontrar o que queremos.fonte
Mathematica, 93 bytes
Função pura com o primeiro argumento
#
. Se um número inteiro não negativo for fornecido, ele exibirá a lista correta de dígitos (até lida0
corretamente!).Explicação
Nest[f,expr,n]
fornece o resultado da aplicaçãof
deexpr
n
tempos. Nesse caso,expr
é a lista{0}
en
é o número inteiro de entrada#
. A funçãof
é complicada:fonte
y___,z_:0
para aumentar o comprimento da lista!Perl 6 , 38 bytes
Pega um número inteiro positivo e gera uma lista de números inteiros que representam os dígitos.
Explicação:
fonte
Pitão - 14 bytes
Simplesmente retorna o
nth
valor que se encaixa no "padrão de valor menor que o local".Conjunto de Teste .
fonte
2018967
, onde o último dígito é igual a 10?Haskell, 65 bytes
i
aumenta os números no sistema numérico com os dígitos na ordem inversa.iterate
cria a lista infinita de todos esses números começando com zero, o qual é representado por[]
. Tudo o que resta fazer é pegar (!!
) o número exigido ereverse
ele.A última linha é uma função, não uma definição de função, portanto, não pode aparecer como está em um arquivo de código-fonte. Em vez disso, coloque apenas as outras linhas no código-fonte e use a última linha no intérprete (ou vincule a função a um nome, acrescentando
f=
a última linha).Exemplo de uso:
(8 bytes podem ser salvos se houver
[5,3,0,0,1]
uma representação permitida do resultado.)fonte
Haskell, 49 bytes
A primeira linha é uma definição auxiliar e a segunda é avaliada como uma função. Ele pega um número inteiro e retorna uma lista de números inteiros. Experimente online!
Explicação
Eu defino
x
como a lista infinita de representações mencionadas no texto do desafio; a função principal apenas diminui seu argumento e indexa emx
. A primeira linha funciona assim:Você vê que isso
x
é definido em termos de si mesmo, mas Haskell é preguiçoso, então isso não é um problema.fonte