Implemente essa relação de recorrência como uma função ou programa que insere e gera um número inteiro não negativo:
F (0) = 0
F (N) = o menor número inteiro maior que F (N-1), de modo que a soma e / ou produto de seus dígitos da base 10 seja N
N é a entrada do seu programa e F (N) é a sua saída.
Para ficar claro, a soma dos dígitos em um número como 913 é 9 + 1 + 3 = 13. O produto é 9 × 1 × 3 = 27. Para números de um dígito, a soma e o produto são o mesmo número. Os números que contêm um 0, obviamente, têm o produto 0.
Os resultados através de F (70) são:
N F(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 19
11 29
12 34
13 49
14 59
15 69
16 79
17 89
18 92
19 199
20 225
21 317
22 499
23 599
24 614
25 799
26 899
27 913
28 1147
29 2999
30 3125
31 4999
32 5999
33 6999
34 7999
35 8999
36 9114
37 19999
38 29999
39 39999
40 41125
41 59999
42 61117
43 79999
44 89999
45 91115
46 199999
47 299999
48 311128
49 499999
50 511125
51 699999
52 799999
53 899999
54 911116
55 1999999
56 2111147
57 3999999
58 4999999
59 5999999
60 6111125
61 7999999
62 8999999
63 9111117
64 11111188
65 29999999
66 39999999
67 49999999
68 59999999
69 69999999
70 71111125
O código mais curto em bytes vence. Parabéns se você puder mostrar que seu código tira proveito de alguma eficiência.
Respostas:
05AB1E ,
2012 bytesEconomizou 8 bytes graças a Osable !
Usa a codificação CP-1252 . Experimente online!
fonte
µNSDOsP‚¾>å½
. Parece funcionar para números escolhidos aleatoriamente.Mathematica, 71 bytes, 68 caracteres
Por apenas mais 4 bytes, aqui está uma versão que armazena os valores de
±n
:Com a última versão, antes de avaliar
±n
,PlusMinus
terá dois valores baixos:Agora, se avaliarmos
±20
:Isso acelera drasticamente os cálculos futuros, já que o Mathematica não calcula mais os valores entre
0
e20
recursivamente. O tempo economizado é mais dramático à medida quen
aumenta:fonte
C #,
155159135 bytesSuper ineficiente, leva muito tempo para apenasN>=14
. Vou tentar obter uma solução mais eficiente, mas mais longa.Ok, muito melhor agora, mas com 4 bytes a mais. Oh, bem, eu posso fazer
N<=50
muito rapidamente agora. Obrigado @milk por salvar 24 bytes!fonte
for(;;)
e foreach porforeach(var c in++i+"")
. -22 bytes para substituirint.Parse(c+"")
comc-48
.Pitão -
1817 bytesUm byte salvo graças ao @Jakube!
Usa reduzir para fazer a coisa recursiva.
Conjunto de Teste .
fonte
sM*FBjT;
também gera a soma e o dígito do dígito e é 1 byte mais curto.R,
124bytes 112Falha em N = 45 porque R insiste em escrever 10.000 como 1e + 05, o que não é apreciado por
as.numeric()
, isso é corrigível usandoas.integer()
o custo de 12 bytes:Como linguagem de programação estatística, R tem maneiras irritantemente prolixo de dividir números em um vetor de dígitos. Especialmente porque tudo precisa ser convertido de volta de seqüências para valores numéricos explicitamente.
12 bytes salvos graças ao billywob.
fonte
as.double(el(strsplit(c(x,""),"")))
para dividir um número inteiro em um vetor de seus dígitos. No entanto, você ainda seas.integer()
sprintf()
para formatar o número inteiro em uma string sem zeros à direita diretamente:as.double(el(strsplit(sprintf("%1.f",x),"")))
e pular o uso deas.integer()
x=x+1
e isso é garantido para ser avaliado uma vez, porque no início oy=F(N-1)
que definitivamente não é igual aN
.JavaScript (ES6)
1091071059189 Bytesfonte
JavaScript (ES6), 84
86Editar: 2 bytes salvos thx @Arnauld
Nota de teste acima de 50, ele usará muito de sua CPU, clique em 'Ocultar resultados' para parar antes que seja tarde demais
fonte
for(v=n&&f(n-1),p=s=n+1;s&&p-1;)[...++v+''].map(d=>(p/=d,s-=d),p=s=n);v
deveria salvar 2 bytes. Suspeito que possa ser encurtado um pouco mais, mas não consegui descobrir até agora.p /= d
produza um resultado exato quandod
na verdade é um divisor dep
. A menos que eu esteja enganado, isso é verdade para qualquer umd <= p <= Number.MAX_SAFE_INTEGER
. Iremos receber erros de arredondamento de ponto flutuante quandop % d != 0
, mas isso deve ser seguro.eval`1+1`
) (aqui está o porquê codegolf.stackexchange.com/a/52204/21348 : ler o primeiro comentário)Mathematica, 67 bytes
Função, nomeada
a
. Pega um número como entrada e retorna um número como saída. Inspirado na solução anterior do Mathematica, mas usa um mecanismo de loop diferente.fonte
C, 240 bytes
Tentando explorar algumas propriedades matemáticas da sequência.
fonte
PowerShell v3 +, 114 bytes
Solução iterativa, sem uma maneira fácil de transformar um número na soma / produto de seus dígitos, por isso é um pouco mais do que as respostas do JavaScript.
Pega entrada
$n
, define$i
para uma matriz com just0
(esta é a coleção deF()
e define$l
igual a1
(esta é a mais recenteF
). Em seguida, fazemos um loop ascendente de1
para$n
, cada iteração executando umfor
loop.O
for
condicional do loop pega o$l
número do atest, em uma string"$l"
, depois o projeta como umachar
matriz e armazena esse array na variável temp$b
. Nós, então,-join
esses dígitos juntos+
e o canalizamosiex
(abreviadoInvoke-Expression
e semelhante aeval
). Além disso, também fazemos o mesmo com*
. Esses dois números são encapsulados em parênteses e tratados como o argumento do array para o-notin
operador em relação ao número atual$_
do loop externo (ou seja, ofor
loop é executado desde que+
e*
seja diferente de$_
). O corpo dofor
loop apenas aumenta$l++
.Quando saímos desse
for
loop interno , adicionamos nosso$l
on como um novo elemento de$i
. Depois de concluirmos completamente o loop de intervalo, colocamos apenas$i[$n]
no pipeline e a saída é implícita.Nota: fica muito lento para executar acima
20
, simplesmente por causa da estrutura do loop. Por exemplo,N=40
leva cerca de dois minutos na minha máquina e eu nem me incomodei em testarN>50
.fonte
Pyke, 17 bytes
Experimente aqui!
Ou 13 bytes não competitivos
first_n
agora coloca a quantidade de itens já encontrados mais um,i
se usado.Experimente aqui!
fonte
Python 2 , 77 bytes
Experimente online!
fonte
Maravilha , 49 bytes
Ftw de correspondência de padrão! Uso:
Mais legível:
Isso é basicamente apenas uma implementação palavra por palavra das especificações.
fonte
BASH, 107 bytes
com dobra + colar + bc
fonte
Befunge, 101 bytes
Experimente online! Mas observe que as coisas ficarão muito lentas quando você chegar aos quarenta. Se você deseja testar toda a gama, você realmente precisa usar um compilador Befunge.
Explicação
fonte
PHP , 110 bytes
Experimente online!
fonte