Равенство в сумме цифр


23

Введение

Давайте возьмем номер 180. Это интересное число, потому что сумма цифр этого числа равна:

1 + 8 + 0 = 9

И в квадрате версия этого числа, или:

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

Это оба 9 . Сумма цифр исходного номера и квадрата числа совпадают. Конечно, это также можно найти в OEIS: A058369 .

задача

Учитывая неотрицательное целое число n, выводим nе положительное число с этим условием.

Контрольные примеры (с нулевым индексом )

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

Вход также может быть проиндексирован на 1, если вам это подходит.

Это , поэтому выигрывает представление с наименьшим количеством байтов!


Если его еще никто не заметил, в списке могут появиться только цифры, эквивалентные 0 или 1 (мод 9).
Нил

@MamaFunRoll Хм ... нет. Сожалею. Числа с цифровыми корнями из 5 имеют квадраты, цифровой корень которых равен 7.
Нил

@Neil owait nvm
Мама Fun Roll

Я написал предикат Brachylog, чтобы определить, является ли ввод термином этой последовательности, но не смог заставить работать шаблон find-nth, поэтому я просто оставлю его в комментарии:^₂;?{ẹ+}ᵛ
Несвязанная строка

Ответы:


5

Желе, 13 байт

,²DS€=/
1dz#Ṫ

Ввод 1-индексирован. Попробуйте онлайн!

Как это работает

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 байта

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

Пример использования: ([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 байта

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

Я потратил 30 минут, пытаясь заставить это работать, пока не понял, что выводил неправильную переменную: |

Это с нулевым индексом.


1
Я чувствую, что превращение этого в рекурсивную функцию значительно сократило бы это ...
Mama Fun Roll


4

05AB1E , 10 9 8 байтов

µNÐn‚1öË

1-индексироваться.

-1 байт благодаря @Emigna за счет удаления неявного ½(увеличивается counter_variableпосле каждой итерации) в конце
-1 байт благодаря @Grimy, удаляющему дубликаты SOс помощью‚1ö

Попробуйте онлайн.

Объяснение:

µ         # 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
Вам не нужно ½здесь, как это неявно
Emigna

1
-1: µNDn‚1öË. это как, SOно векторизация, что позволяет нам избежать дублирования кода.
Grimmy

@ Грими Спасибо еще раз. Я также добавил это в качестве подсказки к моей небольшой заметке. :)
Кевин Круйссен

3

Mathematica, 64 байта

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

Простая анонимная функция. Zero-индексироваться.


3

Пиф, 15

e.fqsjZTsj^Z2TQ

1 байт благодаря DenkerAffe!

Попробуйте здесь или запустите Test Suite .

Использует опцию с 1 индексом.

Наивная реализация с использованием .fкоторой получает первые nчисла, соответствующие заданному условию.


Вы можете сохранить один байт, удалив, hесли вы используете 1-индексирование, которое явно разрешено.
Денкер

@DenkerAffe О, спасибо, я должен прочитать более внимательно: P
FryAmTheEggman

2

MATL , 24 23 байта

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

Использует ввод на основе 1.

Попробуйте онлайн!

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
очень приятно, что наконец-то MATL попал в список удаленных компиляторов!
Abr001am

1

Юлия, 79 66 байт

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

Это рекурсивная функция, которая принимает целое число и возвращает целое число. Используется индексирование на основе 1.

Мы храним несколько вещей в качестве аргументов функции:

  • n : Вход
  • x : Счетчик, сколько чисел с этим условием мы нашли
  • i : Номер для проверки состояния
  • s : Функция для вычисления суммы цифр своего ввода

Хотя xэто меньше, чем ввод, мы рекурсивно, увеличивая, xесли iсоответствует условию, и увеличивая i. Однажды x == nмы вернемся i, но мы должны вычесть 1, потому что он будет увеличен слишком много раз.


1

Выпуклый 0.2, 36 35 байт

Convex - это новый язык, который я разрабатываю и который основан на CJam и Golfscript. Интерпретатор и IDE можно найти здесь . Ввод - это целое число в аргументах командной строки. Индексы основаны на одном. Использует кодировку CP-1252 .

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

1

Mathematica, 63 60 61 59 байт

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

While making this the other answer popped up but I'm beating them by a single byte and I'm posting this before that one gets golfed. One indexed.


Fails for input >2457. Simply increasing your Range won't help, because A058369[n]/n doesn't seem to converge.
murphy

Better? filler+
CalculatorFeline

10^#будет короче 2^#*9. Конечно, он становится слишком медленным после того, как n больше, чем примерно 6 ...
feersum

Почему бы и нет 9^#? Fil
CalculatorFeline

У вас есть доказательство того, что f (n) <= 9 ^ n? (10 очевидно, потому что 10 ^ n всегда решение).
feersum

1

Сетчатка, 103 байта

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

x

Определенно гольф.

Использует новую функцию Retina% для возведения в квадрат (следовательно, пока не работает с онлайн-версией).


1

Mathcad, 70 50 байтов

Mathcad не имеет встроенных функций для преобразования числа в цифровую строку, поэтому пользовательская функция d (a) выполняет эту работу. Затем программа перебирает положительные целые числа, проверяя равенство сумм, пока не наберет n чисел в векторе v. Программа вычисляется с помощью оператора =, который отображает вектор результата. ( Обратите внимание, что вся программа выглядит точно так, как показано ниже на листе Mathcad )

Обновленная программа: предполагает инициализацию по умолчанию для нуля и использует тот факт, что Mathcad возвращает значение последнего оцененного оператора в программе.
Использует порядок вычисления выражений для приращения переменной a при первом суммировании (и затем становится доступным для использования в сумме квадратов)

введите описание изображения здесь

Оригинальная программа: возвращает вектор всех чисел до n.

введите описание изображения здесь



0

Java 8, 113 байт

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;}

0 индексированные

Объяснение:

Попробуйте онлайн.

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 байта

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

Ввод Nв Ans.
Выход 1-индексированный Nй член в последовательности.

Вспомогательная функция генерирует сумму цифр значения в Ans.

Примеры:

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

Объяснение:

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

Примечание: TI-BASIC - это токенизированный язык. Количество символов не равно количеству байтов.


0

J , 62 байта

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

Попробуйте онлайн!

1 проиндексировано. J снова не справляется с поставленными задачами из-за чрезмерной механики поддержки.


0

APL (NARS), 49 символов, 98 байтов

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

1-индексированный, тест:

  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 байт

♪╒gÆ‼Σ²Σ=§

Попробуйте онлайн!

объяснение

Чтобы сделать это пригодным для использования, я решил представить версию, которая рассчитывает каждое число с этим свойством ниже 1000 и выбирает правильный элемент из этого списка. Чтобы иметь решение, которое будет работать для любого входного размера, первый байт можно заменить на ú(нажмите 10 ** TOS). Поскольку n: й член в последовательности всегда меньше10Nскрипт всегда будет успешным. Тем не менее, это накладывает практический предел на очень низкие расчеты.

♪            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

Может быть, я должен просто создать чат для MathGolf ... В любом случае, у меня есть вопрос: есть ли встроенные функции для замены, разбиения на и тому подобное для строк? Я чувствую, что сжатие может сохранить здесь байты, но я не уверен, что встроенные функции существуют для этого.
Кевин Круйссен

Есть закрытый чат MathGolf. Я пытался сохранить его живым, но в последнее время я был завален работой, и это продолжало закрываться. Я не хочу беспокоить моды каждый раз. Чтобы ответить на ваш вопрос, MathGolf на самом деле не предназначался для обработки строковых операций, но я реализовал функциональность для обработки строк для решения некоторых основных задач. Как вы заметили, желать еще много. Если я добавлю что-нибудь, это, вероятно, будет чем-то похожим на то, что есть у 05AB1E, но у меня не было свободного времени для разработки MathGolf в последние месяцы.
максимум
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.