Складіть ціле число, щоб заощадити місце!


20

Божевільний математик володіє широкою колекцією чисел, а тому місце, яке йому залишилося, досить обмежене. Щоб зберегти деякі, він повинен скласти цілі числа, але, на жаль, він справді лінивий. Ваше завдання, якщо ви хочете допомогти йому, - створити функцію / програму, яка складе задане ціле число для нашого маніяка чисел.

Як скласти ціле число?

Якщо вона рівномірно ділиться на суму її цифр, розділіть її на суму її цифр. Якщо вона не відповідає цій вимозі, залиште її решту, поділену на суму її цифр. Повторюйте процес, поки результат не досягне 1. Складене ціле число - це кількість операцій, які вам довелося виконати. Візьмемо приклад (скажімо 1782):

  1. Отримати суму цифр: 1 + 7 + 8 + 2 = 18. 1782рівномірно ділиться на 18, тому наступне число є 1782 / 18 = 99.

  2. 99не націлена 9 + 9 = 18, тому ми беремо залишок: 99 % 18 = 9.

  3. 9очевидно ділиться на 9, тому ми ділимо його і отримуємо 1.

Результат полягає в 3тому, що для досягнення операції було потрібно 3 операції 1.

Правила та характеристики

  • Деякі цілі числа можуть мати суму цифр, рівну 1, наприклад, 10або 100. Вашій програмі не потрібно обробляти такі випадки. Це означає, що вам буде гарантовано, що ціле число, подане як вхідне, не має суми цифр, рівних 1, і жодна операція з заданим цілим числом не призведе до числа, сума цифр якого є 1(крім 1самого себе, який є " ціль "). Наприклад, ви ніколи не отримаєте 10або 20як вклад.

  • Вхідне число буде додатним цілим числом, ніж значення 1.

  • Застосовуються лазівки за замовчуванням .

  • Ви можете приймати введення та забезпечувати вихід будь-яким стандартним значенням .


Випробування

Вхід -> Вихід

2 -> 1
5 -> 1
9 -> 1
18 -> 2
72 -> 2
152790 -> 2
152 -> 3
666 -> 3
777 -> 3
2010 -> 3
898786854 -> 4

Ось програма, яка дозволяє візуалізувати процес та спробувати більше тестових випадків.


Це , тому найкоротший код на кожній мові (набраний у байтах) виграє!


Натхненний цим викликом , хоча спочатку це може здатися не пов'язаним.
Містер Xcoder

3
Це працюватиме як рішення зупинки, але в перспективі математик повинен дійсно розглянути можливість придбання одного з готелів Гільберта . Ви завжди можете знайти якусь невикористану кімнату в одному з таких.
Рей

Хоча 8987868546це правильний вклад, він порушить ваш тестовий інструмент, а також багато (якщо не всі) відповіді ...
Mischa

@MischaBehrend Ваш приклад не є коректним вводом. Я думаю, ти неправильно скопіював мій останній тестовий випадок. Дійсний вхід був 898786854(ні) 8987868546(ви додали в 6кінці)
містер Xcoder

nvm ... слід прочитати все перше правило ... залишаючи це тут, щоб ви знали, чому я вважав, що воно дійсне: це не помилка ... Я змінив його навмисно, щоб перевірити ці сценарії ... і прочитавши правила є коректним входом. Сума всіх цифр у 8987868546 не дорівнює 1 ( Правило 1 зустрічається ) і 8987868546є додатним цілим числом, більшим за 1 ( Правило 2 мет ).
Mischa

Відповіді:


6

05AB1E , 13 12 байт

[¼DSO‰0Kθ©#®

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

Пояснення

[               # start loop
 ¼              # increment counter
  D             # duplicate current value
   SO           # sum the digits in the copy
     ‰          # divmod the current value by its digit-sum
      0K        # remove 0 from the resulting list
        θ       # pop the last element
         ©      # store a copy in register
          #     # if the current value is 1, break
           ®    # push the copy from register
                # implicitly output counter

6

Python 2 , 63 57 байт

-1 дякую абсолютно нелюдяно
-1 дякую містеру Xcoder
-4 завдяки reffu

def f(n):a=sum(map(int,`n`));return n>1and-~f(n%a or n/a)

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




1
57 байтів Також мої вибачення за те, що спочатку я отримав цю власну відповідь. Це має більше сенсу як коментар
reffu

5

Haskell, 85 78 байт

f 1=0
f n|r<1=1+f(n`div`s)|1<2=1+f r where s=sum(read.pure<$>show n);r=n`rem`s

Збережено 7 байт завдяки Брюсу Форте.

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


Збережіть ще кілька байтів, використовуючи divModта відкинувши where: Спробуйте в Інтернеті!
Лайконі

@Laikoni Ого, це цілком поліпшення! Будь ласка, опублікуйте це як іншу відповідь; це досить відрізняється від мого. BTW: Я шукав хитрість, щоб позбутися цього where. Я буду використовувати це в майбутньому. :)
Крістіан Лупаску

sum[read[d]|d<-show n]зберігає байт
німі

5

JavaScript (ES6), 66 58 51 49 байт

Вводиться як ціле число. Повертає falseдля 0або 1і видає помилку переповнення , коли він стикається будь-яке число , чиї цифри додати до 1.

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

Перевірте це

o.innerText=(

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

)(i.value=898786854);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


1
Чи можете ви зберегти кілька байт шляхом підсумовування цифр за допомогою eval(array.join`+`)?
Джастін Марінер

Я міг би дійсно, @JustinMariner - ти ніндзя мені це зробив! Дякую :)
Shaggy

4

Лушпиння , 12 байт

←€1¡Ṡ§|÷%oΣd

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

Пояснення

←€1¡Ṡ§|÷%oΣd  Implicit input, e.g. n=1782
    Ṡ§|÷%oΣd  This part defines the transformation.
         oΣ   Sum of
           d  digits: s=18
    Ṡ   %     n mod s: 0
     §|       or (take this branch if last result was 0)
       ÷      n divided by s: 99
   ¡          Iterate the transformation: [1782,99,9,1,1,1,...
 €1           Index of 1 (1-based): 4
←             Decrement: 3
              Print implicitly.




2

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

(t=#;For[r=0,t>1,r++,If[(s=Mod[t,g=Tr@IntegerDigits@t])<1,t=t/g,t=s]];r)&

Можна ==0замінити <1?
Містер Xcoder

@ Mr.Xcoder так, звичайно! Я зробив версію для сортування ...
J42161217

2

PHP, 68 + 1 байт

одинарний вихід:

for($n=$argn;$n>1;$n=$n%($s=array_sum(str_split($n)))?:$n/$s)echo 1;

десятковий вихід, 73 + 1 байт:

for($n=$argn;$n>1;$i++)$n=$n%($s=array_sum(str_split($n)))?:$n/$s;echo$i;

Запустіть як трубу -nRабо спробуйте в Інтернеті .


Оператору Елвіса потрібна PHP 5.3 або новіша версія. Для старих PHP замініть ?:на ?$n%$s:(+5 байт).







1

Perl, 71 байт, 64 байт, 63 байт

-pl

$c=0;while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c};$_=$c

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

EDIT: збережено 7 байт, завдяки коментарю Xcali

-p

while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

EDIT: з 5.14 неруйнівної заміни s /// r

-pl

while($_>1){$s=eval s/\B/+/gr;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

Чи -plнатомість у верхній частині повинен бути прапор командного рядка?
Erik the Outgolfer

так, вони є
перл-

Вам слід порахувати -plпрапор відповідно до цієї публікації .
Erik the Outgolfer

Я порахував 69 байт +2 для варіантів pl, це правильно?
Nahuel Fouilleul

Ви можете трохи пограти в гольф. $cне потрібно ініціалізувати. Він розпочнеться з undefякого дорівнює 0. Точка з комою після закінчення часу може піти. Крім того, вам не потрібно -l. Не потрібно приймати кілька входів за один пробіг.
Xcali

1

Діалог APL, 36 байт

{x←+/⍎¨⍕⍵⋄1=⍵:00=x|⍵:1+∇⍵÷x1+∇x|⍵}

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

Як?

{
   x←+/⍎¨⍕⍵       x = digit sum
   1=⍵:0          if arg = 1: bye
   0=x|⍵:1+∇⍵÷x   if arg divisible by x: recurse with arg/x
   1+∇x|⍵         recurse with arg mod x
}

1

Гая , 13 байт

-@{:ΣZ¤∨)‡}°\

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

Пояснення

-              Push -1 (this will be the counter)
 @             Push input (the starting number)
  {:ΣZ¤∨)‡}°   Repeat this block until the results of 2 consecutive runs are the same:
   :            Copy the number
    Σ           Digital sum
     Z          Divmod number by digital sum
      ¤         Swap
       ∨        Logical or: left-most non-zero out of (number mod sum, number div sum)
        )‡      Increment the counter
            \  Delete the final 1, implicitly print the counter

1

Матлаб, 150 байт

function[d]=X(x) 
d=0;while ~strcmp(x,'1')z='sum(str2num(x(:)))';a=eval(['rem(',x,',',z,')']);y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));x=y;d=d+1;end

Вхідні дані повинні бути надані функції як рядок, наприклад X ('152').

Функція працює, роблячи циклічне збільшення та збільшення d. x=y;Лінія була необхідна , щоб уникнути помилки Matlab намагається прочитати і переписати значення змінної в той же час, по- видимому, який був для мене новим.

Безголівки:

function[d]=X(x) 
d=0;
while ~strcmp(x,'1')
    z='sum(str2num(x(:)))';
    a=eval(['rem(',x,',',z,')']);
    y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));
    x=y;
    d=d+1;
end


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