Codegolf — Мультипликативная Настойчивость

  • Автор темы Meat
  • Обновлено
  • 23, Oct 2024
  • #1

Мультипликативная устойчивость

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

Как объяснил числофил:

Пример

  1. 277777788888899 → 2x7x7x7x7x7x7x8x8x8x8x8x8x8x9x9 = 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 вывод должен быть

 
 
 
 327
42
8
 

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

Больше примеров

От А003001:

68889 27648 2688 768 336 54 20 0

Также из A003001:

25 10 0

Из числофил видео:

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

Итак, произошло вопрос об аддитивной стойкости, но это мультипликативная персистентность. Кроме того, этот вопрос требует указать количество шагов в качестве выходных данных, а мне интересно увидеть промежуточные результаты.

#код-гольф #математика #арифметика #повторное преобразование

Meat


Рег
19 Jan, 2007

Тем
68

Постов
184

Баллов
534
  • 26, Oct 2024
  • #2

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

-1 байт спасибо @SolomonUcko!

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

Ввод введён ^ .+¶$$.( .
Вывод отображается в виде запросов на вызов. Замыкающий * is needed to print the last step.

Признаюсь, я не сам придумал эту формулу, скорее я ее нашел здесь и изменил его, чтобы он лучше соответствовал задаче.

РЕДАКТИРОВАТЬ: Перечитав задачу, я понял, что программа должна завершить работу, если произведение окажется однозначным. Следовательно, 2 байта должны были быть добавлены для учета этого.

Пример:

. $&$*

Объяснение:

.+~(\`

Визуальная модель:
.+~(\` . $&$* ^ .+¶$$.( starts off as ⸿θ .
Эта модель охватывает только логику умножения цифр; все остальное проще понять.

≔IΠθθ

Примечания:

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

W⊖Lθ« is этот однобайтовый токен.

Эта программа не обеспечивает правильную последовательность продуктов с целыми числами длиной более 14 цифр из-за ограничений десятичной точности калькуляторов TI.

 

Toporkovvanya


Рег
21 Mar, 2020

Тем
69

Постов
197

Баллов
572
  • 26, Oct 2024
  • #3

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

θ

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

θW⊖Lθ«≔IΠθθ⸿θ $a продолжайте применять функцию в фигурных скобках, пока последовательность не сойдётся

eval format the argument as a string (list of characters)

Invoke-Expression evaluate each (other dialects of k require a colon, iex )

* times over, i.e. product

 

Tolia80


Рег
02 Jan, 2011

Тем
74

Постов
197

Баллов
607
  • 26, Oct 2024
  • #4

Р, 59 57 байт

join

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

С y t возвращает свои входные данные, мы можем использовать $a inside the 9 цикл для имитации $a loop. This is inspired by one of my советы по игре в гольф в R.

Заголовок помогает предотвратить печать больших чисел в экспоненциальной записи.

 

Kiba


Рег
15 Dec, 2005

Тем
90

Постов
208

Баллов
688
  • 26, Oct 2024
  • #5

Желе, 4 байта

for

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

Объяснение

$a

В качестве бонуса вот ТИО который найдет числа с наибольшим количеством шагов для заданного диапазона чисел цифр. Он хорошо масштабируется даже на TIO.

 

Godzilla_13


Рег
16 Jan, 2007

Тем
71

Постов
200

Баллов
555
  • 26, Oct 2024
  • #7

05AB1E, 7 4 байты

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

Попробуйте онлайн или проверить все тестовые случаи.

Объяснение:

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

Язык Wolfram (Математика), 47 байт

ẉ 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

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

 

Bsapro20


Рег
10 Apr, 2020

Тем
75

Постов
180

Баллов
565
  • 26, Oct 2024
  • #9

Питон 2, 46 43 байта

-3 благодаря xnor (цепное сравнение)

_ì ×}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

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

 

Alex1712


Рег
25 Nov, 2009

Тем
90

Постов
198

Баллов
708
  • 26, Oct 2024
  • #13

PowerShell, 54 байта

f n=n:[x|n>9,x<-f$product$read.pure<$>show n]

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


Итерационный метод, который сначала записывает входной аргумент, затем преобразует его в строку и передает в массив символов. Этот массив объединяется одной звездочкой и выполняется как команда с псевдонимом выражения вызова. Поскольку это записывает начальный номер до последнего числа, большего 0 (20 в данном тестовом сценарии), я добавляю последнее число. f←{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵} f 23 23 6 f 27648 27648 2688 768 336 54 20 0 to the end to output.

 

Valeransk


Рег
27 Mar, 2006

Тем
73

Постов
185

Баллов
640
  • 26, Oct 2024
  • #15

Tamarapuchkov


Рег
07 Apr, 2020

Тем
78

Постов
197

Баллов
597
  • 26, Oct 2024
  • #16

PHP, 63 байта

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)

Итеративная версия, вызов с h(ôo▒ε*h(→ input from say$_=eval;s/\B/*/g&&redo .

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

PHP, 72 71 байт

-M5.01

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

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

Вход: 277777788888899

-n

Вход: 23

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

Дж, 16 байт

([:*/,.&.":)^:a:

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

 

ChrisJunta


Рег
24 Jun, 2009

Тем
68

Постов
196

Баллов
536
  • 26, Oct 2024
  • #18

перл 5 ( 277777788888899 4996238671872 438939648 4478976 338688 27648 2688 768 336 54 20 0 function h($n){echo"$n ",($n=array_product(str_split($n)))>9?h($n):$n;} ), 32 30 25 байт

STDIN

25 байт

30 байт

32 байта

 

Kamma


Рег
01 Sep, 2011

Тем
78

Постов
196

Баллов
636
  • 26, Oct 2024
  • #19

МатематикаГольф, 9 10 байт

php -nF

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

Теперь он правильно обрабатывает однозначные входные данные. Не идеально, но по крайней мере правильно.

Объяснение

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

JavaScript (ES6), 45 байт

Возвращает массив целых чисел.

void f(int a){Print(a);if(a>9)f((a+"").Aggregate(1,(j,k)=>k%48*j));}

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

 

Морячек


Рег
27 Aug, 2005

Тем
82

Постов
170

Баллов
600
  • 26, Oct 2024
  • #20

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

filter f{$_ if($_-gt9){("$_"|% t*y)-join'*'|iex|f}}

тест:

$a ||answer||

Хаскель, 45 байт

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

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

 

Sventovit


Рег
28 Mar, 2007

Тем
61

Постов
197

Баллов
552
  • 26, Oct 2024
  • #22

Япт f(n)=n>9?[n;f(prod(digits(n)))]:n , 9 байт

Ужасно неэффективно - даже не пытаться для запуска первого тестового примера!

0Print@#+#>9&&#0@@Times@@@RealDigits@#&

Попробуйте это

def f(n):print n;n>9>f(eval('*'.join(`n`))) ||answer||

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

{$_,{[*] .comb}…10>*}

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

Объяснение

Most@FixedPointList[Times@@IntegerDigits@#&,#]& ||answer||

JavaScript (Вавилонский узел), 46 байт

Δ # Loop until the number no longer changes: = # Print the number with trailing newline (without popping the number itself) # (which will be the implicit input in the first iteration) SP # Convert the number to a list of digits, and calculate its product

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


JavaScript (Вавилонский узел), 44 байта

Если ввод может быть принят как строка

Δ=SP

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

 

Perforator1981


Рег
23 Jun, 2009

Тем
66

Постов
191

Баллов
541
  • 26, Oct 2024
  • #23

PowerShell, 64 59 байт

∪{×/⍎¨⍕⍵}⍡≡

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

Итерационный метод. Принимает входные данные и сохраняет их в D | convert to decimal digits P | take the product $ | previous two links as a monad Ƭ | loop until no change, collecting all intermediate results , then enters a DP$Ƭ цикл до тех пор, пока длина do-while is two or more (i.e., it's bigger than while ). Внутри цикла мы выводим print(n) and then recalculate it by converting it invisibly оЧарАрра print , n=scan();while(print(n)>9)n=prod(n%/^(0:log10(n))%) делая это вместе с */ , and then .:' (сокращение от .' and similar to $x ). Как только мы выйдем из цикла, у нас останется одна цифра для печати, поэтому мы помещаем }\ onto the pipeline again.

-5 байт благодаря KGlasier.

 

Budulay82


Рег
08 Apr, 2011

Тем
73

Постов
192

Баллов
567
  • 26, Oct 2024
  • #24

Древесный уголь, 13 байт

{

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

{*/.'$x}\

Распечатайте входные данные в первый раз.

10^(

Повторяйте, пока длина ввода не равна 1.

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)

Замените ввод его цифровым произведением, преобразованным в строку.

125673

Распечатайте введенные данные в новой строке.

 

Y3t1y3


Рег
23 Mar, 2014

Тем
76

Постов
163

Баллов
553
  • 26, Oct 2024
  • #25

сетчатка, 24 байта

Ans

Попробуйте онлайн! Объяснение:

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

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

24456756 24456756 prgmCDGF8 24456756 201600 0 11112 11112 prgmCDGF8 11112 2

Добавить Ans after each digit.

Ans

Завершите преобразование входных данных в выражение, результатом которого будет цифровой продукт.

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

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

B3andk2


Рег
03 May, 2011

Тем
63

Постов
206

Баллов
561
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно