Мультиплікативна наполегливість


46

Мультиплікативна стійкість

  1. Помножте всі цифри на число
  2. Повторюйте, поки у вас не залишиться одна цифра

Як пояснив Numberphile :

Приклад

  1. 277777788888899 → 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9 = 4996238671872
  2. 4996238671872 → 4x9x9x6x2x3x8x6x7x1x8x7x2 = 438939648
  3. 438939648 → 4x3x8x9x3x9x6x4x8 = 4478976
  4. 4478976 → 4x4x7x8x9x7x6 = 338688
  5. 338688 → 3x3x8x6x8x8 = 27648
  6. 27648 → 2x7x6x4x8 = 2688
  7. 2688 → 2x6x8x8 = 768
  8. 768 → 7x6x8 = 336
  9. 336 → 3x3x6 = 54
  10. 54 → 5x4 = 20
  11. 20 → 2x0 = 0

Це поточний запис, до речі: найменше число з найбільшою кількістю кроків.

Гольф

Програма, яка приймає будь-яке ціле число як вхідне, а потім виводить результат кожного кроку, починаючи з самого введення, доки ми не потрапимо на одну цифру. Для 277777788888899 вихід повинен бути

277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0

(Підрахунок кількості кроків залишається користувачеві вправою).

Більше прикладів

Від A003001 :

25
10
0

Також від A003001:

68889
27648
2688
768
336
54
20
0

З відео Numberphile :

327
42
8

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


Бонус: знайдіть новий запис: найменше число з найбільшою кількістю кроків. Застереження: гадає, що 11 є найбільшою можливою.
SQB

7
Напевно, слід включити ще кілька тестових випадків, які не закінчуються . 0
Арнольд

Прийшов зробити цю публікацію, знайшов її вже існуючою, gg
кіт

чи дійсний однозначний вхід?
dzaima

1
У відео "Numberphile" Метт Паркер заявляє, що проводилися обшуки на кілька сотень цифр.
HardScale

Відповіді:


7

Желе , 4 байти

DP$Ƭ

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

Пояснення

D    | convert to decimal digits
 P   | take the product
  $  | previous two links as a monad
   Ƭ | loop until no change, collecting all intermediate results

Як бонус, ось ТІО, який знайде числа з найбільшою кількістю кроків для заданого діапазону чисел цифр. Він добре масштабується навіть у TIO.


15

TI-BASIC (TI-84), 30 32 31 байт

-1 байт завдяки @SolomonUcko!

While Ans>9:Disp Ans:prod(int(10fPart(Ans10^(seq(-X-1,X,0,log(Ans:End:Ans

Введення в Ans.
Вихід відображається як запит на виклик. Послідовник Ansпотрібен для друку останнього кроку.

Я визнаю, що я не думаю , що ця формула сам, а я знайшов його тут і змінити його , щоб краще відповідати викликом.

EDIT: Перечитавши виклик, я зрозумів, що програма повинна припинитися, якщо продукт має одну цифру. Отже, для обліку цього потрібно було додати 2 байти .

Приклад:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

Пояснення:

While Ans>9               ;loop until the product is one digit
Disp Ans                  ;display the current product
prod(                     ;get the product of...
 int(                     ; the integer part of...
  10fPart(                ; ten times the fractional part of...
  Ans                     ; each element in the following list times the
                          ;  current product
  10^(                    ; multiplied by the list generated by using each
                          ;  element of the following list as an exponent
                          ;  for 10^n
   seq(-X-1),X,0,log(Ans  ; generate a list of exponents from -1 to -L where
                          ;  L = the length of the current product
End
Ans                       ;leave the final product in "Ans" and implicitly
                          ; print it

Візуальна модель:
Ans починається як 125673.
Ця модель охоплює лише логіку множення цифр; все інше зрозуміти простіше.

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,5.0992
   {-1 -2 -3 -4 -5 -6}
10^(...
   {.1 .01 .001 1E-4 1E-5 1E-6}
Ans...
   {12567.3 1256.73 125.673 12.5673 1.25673 .125673}
fPart(...
   {.3 .73 .673 .5673 .25673 .125673}
10...
   {3 7.3 6.73 5.673 2.5673 1.25673}
int(...
   {3 7 6 5 2 1}
   (the digits of the number, reversed)
prod(...
   1260
   (process is repeated again)

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,3.1004
   {-1 -2 -3 -4}
10^(...
   {.1 .01 .001 1E-4}
Ans...
   {126 12.6 1.26 .126}
fPart(...
   {0 .6 .26 .126}
10...
   {0 6 2.6 1.26}
int(...
   {0 6 2 1}
prod(...
   0
   (product is less than 10.  loop ends)

Примітки:

TI-BASIC - токенізована мова. Кількість символів не дорівнює кількості байтів.

10^(це цей один байт маркера .

Ця програма не забезпечить правильну послідовність продуктів із цілими числами, що перевищують 14 цифр, через обмеження десяткової точності на калькуляторах TI.


Чи можете ви зберегти байт, рухаючись 10^(назовні seq(та опускаючи дужки, що закриваються?
Соломон Учко

Так, я так вірю!
Тау

11

К (нг / к) , 9 байт

{*/.'$x}\

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

{ }\ продовжуйте застосовувати функцію у фігурних дужках, поки послідовність не сходиться

$x форматувати аргумент у вигляді рядка (список символів)

.'оцінювати кожен (інші діалекти k вимагають двокрапки, .:')

*/ разів більше, тобто продукт



8

R , 59 байт

n=scan();while(print(n)>9)n=prod(n%/%10^(nchar(n):1-1)%%10)

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

Оскільки print invisiblyповертає свій вхід, ми можемо використовувати print(n)всередині whileциклу для імітації do-whileциклу. Це натхненне одним з моїх порад для гри в гольф в R .

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







5

PowerShell , 54 байти

for($a=$args;$a-gt9){$a;$a=("$a"|% t*y)-join"*"|iex}$a

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


Ітеративний метод, який спочатку записує вхідний аргумент, потім перетворює його в рядок і передає в масив символів. До цього масиву приєднується одна зірочка і виконується як команда з псевдонімом виразу виклику. Оскільки це пише стартовий номер до останнього числа, що перевищує 0, (20, у даному тестовому сценарії), я додаю остаточне $aдо кінця для виведення.



5

PHP , 63 байти

<?=$n=$argn;while($n>9)echo"
",$n=array_product(str_split($n));

Ітеративна версія, дзвінок із php -nFвходом від STDIN.

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

PHP ,72 71 байт

function h($n){echo"$n
",($n=array_product(str_split($n)))>9?h($n):$n;}

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

Рекурсивна версія, як функція.

Вхід: 277777788888899

277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0

Вхід: 23

23
6

5

Python 2 , 61 62 59 байт

def f(n):print n;n>9and f(reduce(int.__mul__,map(int,`n`)))

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

-3 байти, завдяки Джонатану Аллану


Не працює для входів, які не закінчуються 0 на їх останній ітерації, наприклад 23
Втілення невігластва

int.__mul__на три байти менше, ніжlambda a,b:a*b
Джонатан Аллан

@JonathanAllan Дякую! Я знав, що повинно бути щось подібне
TFeld

Змініть, f(reduce(int.__mul__,map(int,`n`)))щоб f(eval('*'.join(`n`)))зберегти 13 байт.
mypetlion

@mypetlion ... Я вже це робив в іншому дописі.
Джонатан Аллан


5

MathGolf , 9 10 байт

h(ôo▒ε*h(→

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

Тепер він правильно обробляє входи, які є одноцифровими. Не ідеально, але принаймні правильно.

Пояснення

h(            check length of input number and decrease by 1
  ö       →   while true with pop using the next 6 operators
   p          print with newline
    ▒         split to list of chars/digits
     ε*       reduce list by multiplication
       h(     length of TOS without popping, subtracted by 1 (exits when len(TOS) == 1)

Вихід для однозначного введення повинен бути однією копією числа - уточнено в коментарях
dzaima

@dzaima Я перегляну це питання і
оновлю




4

APL (NARS), 19 символів, 38 байт

{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}

тест:

   f←{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}
   f 23     
23
6
   f 27648     
27648
2688
768
336
54
20
0




4

Japt -R , 9 байт

Жахливо неефективно - навіть не намагайтеся запустити перший тестовий випадок!

_ì ×}hN â

Спробуй це

_ì ×}hN â     :Implicit input of integer U
      N       :Starting with the array of inputs (i.e., [U])
     h        :Do the following U times, pushing the result to N each time
_             :Take the last element in N and pass it through the following function
 ì            :  Convert to digit array
   ×          :  Reduce by multiplication
    }         :End function
        â     :Deduplicate N
              :Implicitly join with newlines and output

3

Брахілог , 7 байт

ẉ?Ḋ|ẹ×↰

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

Пояснення

ẉ          Write the input followed by a linebreak
 ?Ḋ        If the input is a single digit, then it's over
   |       Otherwise
    ẹ      Split the input into a list of digits
     ×     Multiply them together
      ↰    Recursive call with the result of the multiplication as input

Я сам спробував це спробувати. Забув про Ḋ. У решті у мене було те саме.
Кроппеб

3

JavaScript (Babel Node) , 46 байт

f=a=>a>9?[a,...f(eval([...a+''].join`*`))]:[a]

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


JavaScript (Babel Node) , 44 байти

Якщо введення можна сприймати як String

f=a=>a>9?[a,...f(''+eval([...a].join`*`))]:a

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


@Arnauld Так, я щойно відредагував і додав неправильний код. Я все ще шукаю щось, використовуючи лише рядки замість масивів
Luis felipe De jesus Munoz

3

PowerShell , 64 59 байт

for($a="$args";9-lt$a){$a;$a="$(($a|% t*y)-join'*'|iex)"}$a

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

Ітеративний метод. Здійснює вхід і зберігає його $a, а потім вводить forцикл до тих пір, поки довжина $aстановить дві або більше (тобто, це більше, ніж 9). Всередині циклу ми виводимо, $aа потім перераховуємо його, перетворюючи його toCharArra y, використовуючи joinїї разом *, а потім iex(короткий для Invoke-Expressionта подібний до eval). Коли ми вийшли з циклу, у нас залишилася одна цифра для друку, тому ми знову розміщуємо $aна конвеєрі.

-5 байт завдяки KGlasier.


Ви можете використовувати порівняння 9-lt$aзамість того, $a.length-1щоб зберегти 5 байт. І якби ти весь час не переходив на рядок, ти можеш відрізати гідний шматок. Перевірте мою спробу перешкод, якщо хочете!
KGlasier

3

Вугілля деревне , 13 байт

θW⊖Lθ«≔IΠθθ⸿θ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

θ

Друкуйте вхід вперше.

W⊖Lθ«

Повторіть, поки довжина вводу не дорівнює 1.

≔IΠθθ

Замініть вхід цифровим продуктом, переданим на рядок.

⸿θ

Роздрукуйте вхід на новому рядку.


3

Сітківка , 24 байти

.+~(\`

.
$&$*
^
.+¶$$.(

Спробуйте в Інтернеті! Пояснення:

.+~(\`

Надрукуйте поточне значення в його власному рядку на початку кожного циклу, поки він не перестане змінюватися, і не друкуйте незмінене значення двічі. Оцініть поточне значення в кінці кожного циклу.

.
$&$*

Додайте знак *після кожної цифри.

^
.+¶$$.(

Завершіть перетворення введення на вираз, що оцінює цифровий продукт.

Тільки для запису, Retina може зробити це в одному рядку (25 байт):

.+"¶"<~[".+¶$.("|'*]'*L`.

3

C (gcc) , 58 байт

f(n,t){for(;n=printf("%d\n",t=n)>2;)for(;n*=t%10,t/=10;);}

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

Ітеративний підхід виявляється на 1 байт коротшим.

f(n,t){
    for(;n=printf("%d\n",t=n)   //print and update current number
            >2;)                //until only one digit is printed
        for(;n*=t%10,t/=10;);   //n*= product of digits of t (step)
}

C (gcc) , 61 59 байт (рекурсивна)

f(n){printf("%d\n",n)>2&&f(p(n));}p(n){n=n?n%10*p(n/10):1;}

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

Здається, рекурсія є коротшою за ітерацію для друку та кроку ...

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