Igualdade na soma dos dígitos


23

Introdução

Vamos pegar o número 180. Este é um número interessante porque a soma dos dígitos desse número é igual a:

1 + 8 + 0 = 9

E a versão quadrada desse número, ou:

180² = 32400 > 3 + 2 + 4 + 0 + 0 = 9

Estes são ambos 9 . A soma dos dígitos do número original e o número ao quadrado são os mesmos. Obviamente, isso também é encontrado em OEIS: A058369 .

Tarefa

Dado um número inteiro não negativo n, imprima o número positivon th com esta condição.

Casos de teste ( indexado a zero )

Input > Output

0 > 1
1 > 9
2 > 10
3 > 18
4 > 19
5 > 45
6 > 46
7 > 55
8 > 90
9 > 99
10 > 100
11 > 145
12 > 180
13 > 189
14 > 190
15 > 198
16 > 199
17 > 289
18 > 351
19 > 361

A entrada também pode ser indexada em 1, se for melhor para você.

Isso é , então a submissão com a menor quantidade de bytes ganha!


Caso ninguém o tenha visto ainda, apenas números equivalentes a 0 ou 1 (mod 9) podem aparecer na lista.
305 Neil

@MamaFunRoll Um ... não. Desculpe. Números com raízes digitais de 5 têm quadrados cuja raiz digital é 7.
Neil

@Neil owait nvm
Mama Fun Roll

Eu escrevi um predicado Brachylog para determinar se a entrada é ou não um termo dessa sequência, mas não consegui colocar o clichê find-enth em funcionamento, então deixarei em um comentário:^₂;?{ẹ+}ᵛ
String não relacionada

Respostas:


5

Gelatina, 13 bytes

,²DS€=/
1dz#Ṫ

A entrada é indexada em 1. Experimente online!

Como funciona

1dz#Ṫ    Main link. Argument: n (index)

1        Set the return value to 1.
   #     Execute ... until ... matches have been found.
 Ç         the helper link
  ³        n
    Ṫ    Extract the last match.


,²DS€=/  Helper link. Argument: k (integer)

,²       Pair k with k².
  D      Convert each to decimal.
   S€    Compute the sum of each list of base 10 digits.
     =/  Reduce by equality.

4

Haskell, 54 bytes

s=sum.map(read.pure).show
([x|x<-[1..],s x==s(x^2)]!!)

Exemplo de uso: ([x|x<-[1..],s x==s(x^2)]!!) 17-> 289.

s calculates the digit sum:

                    show     -- turn number into a string
     map(read.pure)          -- turn every character (the digits) in to a
                             -- one element string and convert back to integer
sum                          -- sum those integers

main function:

[x|x<-[1..]            ]     -- make a list of all x starting from 1
           ,s x==s(x^2)      -- where s x == s (x^2)
                        !!   -- pick nth element from that list

4

JavaScript (ES6), 76 73 72 bytes

n=>eval("for(q=s=>eval([...s+''].join`+`),i=1;q(i)!=q(i*i)||n--;i++);i")

Passei 30 minutos tentando fazer isso funcionar até que percebi que estava produzindo a variável errada: |

Isso é zero-indexado.


1
Eu me sinto como transformar isso em uma função recursiva iria encurtar este um monte ...
Mama Fun rolo


4

05AB1E , 10 9 8 bytes

µNÐn‚1öË

1 indexado.

-1 byte graças ao @Emigna removendo o implícito ½(aumento counter_variableapós cada iteração) no final
-1 byte graças ao @Grimy removendo o duplicado SOusando‚1ö

Experimente online.

Explicação:

µ         # Loop while the counter_variable is not equal to the (implicit) input yet:
 NÐ       #  Push the 0-based loop index three times
   n      #  Take the square of this index
          #   i.e. 180 → 32400
         #  Pair it with the index
          #   i.e. 180 and 32400 → [180,32400]
     1ö   #  Convert both numbers from base-1 to base-10, which basically sums the digits
          #   i.e. [180,32400] → [9,9]
       Ë  #  Check if both sums are equal
          #   i.e. [9,9] → 1 (truthy)
          #  (if they are: implicitly increase the counter_variable by 1)
          # (after the loop: implicitly print the top of the stack, which is the remaining
          #  copy of the index from the triplicate we've used)

2
Você não precisa ½aqui como é implícita
Emigna

1
-1: µNDn‚1öË. é como SOvectorizes, o que nos permite evitar a duplicação de código.
Grimmy

@ Grimy Obrigado novamente. Também adicionei isso como uma dica ao meu post de dicas pequenas. :)
Kevin Cruijssen

3

Mathematica, 64 bytes

a=Tr@*IntegerDigits;Nest[NestWhile[#+1&,#+1,a@#!=a[#^2]&]&,1,#]&

Função anônima simples. Indexado a zero.


3

Pitão, 15

e.fqsjZTsj^Z2TQ

1 byte graças a DenkerAffe!

Experimente aqui ou execute um Conjunto de Testes .

Usa a opção 1 indexada.

Implementação ingênua usando o .fqual obtém os primeiros nnúmeros que correspondem à condição especificada.


Você pode salvar um byte removendo hse usar a indexação 1 explicitamente permitida.
314 Denker

@DenkerAffe Oh, obrigado, devo ler mais de perto: P
FryAmTheEggman

2

MATL , 24 23 bytes

x`@2:^"@V!Us]=?@]NG<]1$

Usa entrada baseada em 1.

Experimente online!

x        % take inpout and delete it (gets copied into clipboard G)
`        %   do...while
  @      %   push loop iteration index: candidate number, n
  2:^    %   array [n n^2]
  "      %   for each element of that array 
    @    %     push that element 
    V!U  %     get its digits (to string, transpose, to number)
    Xs   %     compute their sum
  ]      %   end for each
  =      %   are the two sums equal?
  ?      %   if so
    @    %     the candidate number is valid: push it
  ]      %   end if
  NG<    %   is number of elements in stack less than input?
]        % if so, proceed with next iteration. End do...while. 
1$       % specify 1 input for implicit display: only top of stack

1
É muito bom que o MATL finalmente esteja listado entre os compiladores distantes!
Abr001am 12/03

1

Julia, 79 66 bytes

f(n,x=0,i=1,s=c->sum(digits(c)))=x<n?f(n,x+(s(i)==s(i^2)),i+1):i-1

Esta é uma função recursiva que aceita um número inteiro e retorna um número inteiro. Ele usa a indexação baseada em 1.

Armazenamos algumas coisas como argumentos de função:

  • n : A entrada
  • x : Um contador para quantos números com essa condição encontramos
  • i : Um número para verificar a condição
  • s : Uma função para calcular a soma dos dígitos de sua entrada

Embora xseja menor que a entrada, recuamos, incrementando xse iatender à condição e incrementando i. Uma vez x == n, retornamos i, mas precisamos subtrair 1 porque ele será incrementado muitas vezes.


1

0,2 convexo, 36 35 bytes

Convexo é uma nova linguagem que estou desenvolvendo que é fortemente baseada em CJam e Golfscript. O intérprete e o IDE podem ser encontrados aqui . A entrada é um número inteiro nos argumentos da linha de comandos. Os índices são baseados em um. Usa a codificação CP-1252 .

1\{\__2#¶{s:~:+}%:={\(\)\}{)\}?}h;(

1

Mathematica, 63 60 61 59 bytes

Select[Range[9^#],Equal@@Tr/@IntegerDigits/@{#,#^2}&][[#]]&

Ao fazer isso, a outra resposta apareceu, mas estou vencendo-os por um único byte e postando isso antes que um seja jogado. Um indexado.


Falha na entrada >2457. Simplesmente aumentar o seu Rangenão ajudará, porque A058369[n]/nnão parece convergir.
murphy

Melhor? enchimento +
CalculatorFeline

10^#seria mais curto que 2^#*9. Claro que se torna muito lento depois de n é maior do que cerca de 6 ...
feersum

Por que não 9^#? Fil
CalculatorFeline

Você tem uma prova de que f (n) <= 9 ^ n? (10 é óbvio porque 10 ^ n é sempre uma solução).
feersum

1

Retina, 103 bytes

\d+
$*1 x
{`x+
$.0$*x¶$.0$*a¶$.0$*b
%`b
$_
a+|b+
$.0
\d
$*
+`1¶1
¶
1(.*)¶¶$|¶[^d]+
$1x
}`^ ?x

x

Definitivamente jogável.

Usa o novo recurso Retina% para quadratura (portanto, ainda não funciona com a versão online).


1

Mathcad, 70 50 bytes

O Mathcad não possui funções integradas para converter um número em sua sequência de dígitos, portanto, a função de usuário d (a) faz esse trabalho. Um programa itera através dos números inteiros positivos, testando a igualdade de somas, até acumular n números no vetor v. O programa é avaliado usando o operador =, que exibe o vetor de resultado. ( Observe que o programa inteiro aparece exatamente como exibido abaixo na planilha do Mathcad )

Programa atualizado: assume a inicialização padrão de a a zero e faz uso do fato de que o Mathcad retorna o valor da última instrução avaliada em um programa.
Utiliza a ordem de avaliação das expressões para incrementar a variável a no primeiro somatório (e que está disponível para uso na soma do quadrado)

insira a descrição da imagem aqui

Programa original: retorna um vetor de todos os números até n.

insira a descrição da imagem aqui



0

Java 8, 113 bytes

n->{int r=0;for(;n>=0;)if((++r+"").chars().map(c->c-48).sum()==(r*r+"").chars().map(c->c-48).sum())n--;return r;}

Indexado a 0

Explicação:

Experimente online.

n->{           // Method with integer as both parameter and return-type
  int r=0;     //  Result-integer, starting at 0
  for(;n>=0;)  //  Loop as long as `n` is zero or positive
    if((++r    //   Increase `r` by 1 first
       +"").chars().map(c->c-48).sum()
               //   And if the sum of its digits
       ==(r*r+"").chars().map(c->c-48).sum())
               //   equals the sum of the digit of its square
      n--;     //    Decrease `n` by 1
  return r;}   //  Return the result


0

TI-BASIC 66 62 bytes

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A
sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans

Entrada é nno Ans.
A saída é o 1-indexado nth termo na sequência.

A função auxiliar gera a soma dos dígitos do valor em Ans.

Exemplos:

3:prgmCDGF1E
             10
5:prgmCDGF1E
             19
8:prgmCDGF1E
             55
10:prgmCDGF1E
             99

Explicação:

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A ;prgmCDGF1E

Ans→N            ;store the input in N
While X<N        ;loop until the Nth term has been reached
IS>(A,A:         ;add 1 to A
                 ; (Increment A and skip the next statement if A>A)
A                ;leave A in Ans
prgmA            ;call the helper program below
Ans→B            ;store the result of the helper program in B
A²               ;square A and leave the result in Ans
prgmA            ;call the helper program below
                 ; (result is in Ans)
If B=Ans         ;if the two results are equal
IS>(X,N          ;add 1 to X
                 ; (Increment X and skip the next statement if X>N)
End
A                ;leave A in Ans
                 ;implicit print of Ans

sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans   ;prgmA

                      seq(⁻X-1,X,0,log(Ans    ;generate a list...
                                              ; using X as the variable,
                                              ; starting at 0,
                                              ; ending at the log of Ans,
                                              ; and evaluating "⁻X-1" for each element
                                              ; (implicit increment of 1)
                   ₁₀^(                       ;raise 10 to the power of each element
                Ans                           ;multiply each element by the input
          fPart(                              ;remove the integer part from each element
        10                                    ;multiply each element by 10
    int(                                      ;round each element to the nearest integer
sum(                                          ;then sum the resulting list

Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.


0

J , 62 bytes

[:{:({.@](>:@[,],[#~(=&(1#."."0@":)*:)@[)}.@])^:(#@]<1+[)^:_&1

Experimente online!

1 indexado. J, mais uma vez, não estou tendo bom desempenho nessas "enésimas" tarefas, devido à excessiva mecânica de digitação de livros.


0

APL (NARS), 49 caracteres, 98 bytes

r←h w;c
c←r←0
→2×⍳∼=/+/¨(⍎¨⍕)¨r,r×r+←1⋄→2×⍳w>c+←1

Indexado 1, teste:

  h¨⍳20
1 9 10 18 19 45 46 55 90 99 100 145 180 189 190 198 199 289 351 361 

0

MathGolf , 10 bytes

♪╒gÆ‼Σ²Σ=§

Experimente online!

Explicação

Para tornar isso utilizável, escolhi apresentar uma versão que calcula todos os números com essa propriedade abaixo de 1000 e busca o item correto dessa lista. Para ter uma solução que funcione para qualquer tamanho de entrada, o primeiro byte pode ser substituído por ú(pressione 10 ** TOS). Como o n: ésimo termo na sequência é sempre menor que10n, o script sempre teria sucesso. No entanto, isso coloca um limite prático no cálculo, que é muito baixo.

♪            push 1000
 ╒           range(1,n+1)
  gÆ         filter list using the next 5 operators
    ‼        apply next two commands to TOS
     Σ       sum(list), digit sum(int)
      ²      pop a : push(a*a) (square)
       Σ     sum(list), digit sum(int) (pushes the digit sum of the square)
        =    pop(a, b), push(a==b) (compares the two)
         §   get from array (returns the <input>th item from the filtered list

Talvez eu deva apenas criar um bate-papo para o MathGolf. De qualquer forma, eu tenho uma pergunta: existem componentes para substituir, dividir por e assim por diante? Tenho a sensação de que a compactação pode salvar bytes aqui, mas não tenho certeza se os componentes internos existem para realizá-lo.
Kevin Cruijssen 11/06

Há um bate-papo fechado do MathGolf. Tentei mantê-lo vivo, mas ultimamente tenho me inundado de trabalho, e ele ficava ficando fechado. Eu não quero incomodar os mods toda vez. Para responder à sua pergunta, o MathGolf não foi realmente criado para lidar com operações de cadeia de caracteres, mas eu implementei a funcionalidade de manipulação de cadeia para lidar com alguns desafios básicos. Como você notou, ainda há muito a desejar. Se eu adicionar algo, provavelmente será algo parecido com o 05AB1E, mas eu realmente não tenho tempo livre para o desenvolvimento do MathGolf nos últimos meses.
maxb 12/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.