Рівність у сумі цифр


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

Вхід також може бути індексованим, якщо це вам більше підходить.

Це , тому подання з найменшою кількістю байтів виграє!


Якщо його ще ніхто не помітив, у списку можуть відображатися лише числа, еквівалентні 0 або 1 (мод 9).
Ніл

@MamaFunRoll Гм ... ні. Вибачте. Числа з цифровими коренями 5 мають квадрати, цифровий корінь яких 7.
Ніл

@Neil owait nvm
Mama Fun Roll

Я написав присудок Brachylog, щоб визначити, чи є вхід терміном цієї послідовності, але я не зміг знайти знахідку-шаблону роботи котла, тому я просто залишу це у коментарі:^₂;?{ẹ+}ᵛ
Unrelated String

Відповіді:


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
Тут вам не потрібно, ½як це неявно
Емінья

1
-1: µNDn‚1öË. це як, SOале векторизується, що дозволяє нам уникнути дублювання коду.
Гриммі

@Grimy Ще раз спасибі Я також додав це як підказку до моєї публікації про невеликі поради. :)
Кевін Круїссен

3

Математика, 64 байти

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

Проста анонімна функція. Нульова індексація.


3

Піт, 15

e.fqsjZTsj^Z2TQ

1 байт завдяки DenkerAffe!

Спробуйте тут або запустіть тестовий набір .

Використовується 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

Математика, 63 60 61 59 байт

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

Зробивши це, інша відповідь вискочила, але я б'ю їх одним байтом, і я відправлю це до того, як один отримає гольф. Один індексований.


Помилка введення >2457. Просто збільшення вашої Rangeдопомоги не допоможе, тому A058369[n]/nщо, схоже, не сходиться.
murphy

Краще? filler +
CalculatorFeline

10^#буде коротше, ніж 2^#*9. Звичайно, це стає занадто повільним після того, як п більше, ніж приблизно 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

нAns
н

Хелперна функція генерує суму цифр значення у 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Æ‼Σ²Σ=§

Спробуйте в Інтернеті!

Пояснення

ú10н

♪            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 в останні місяці.
maxb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.