Kegigihan multiplikasi

46

Kegigihan Multiplikasi

  1. Lipat gandakan semua angka dalam satu angka
  2. Ulangi sampai Anda memiliki satu digit tersisa

Seperti yang dijelaskan oleh Numberphile :

Contoh

  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

Omong-omong, ini adalah catatan saat ini: angka terkecil dengan jumlah langkah terbesar.

Golf

Sebuah program yang mengambil seluruh bilangan sebagai input dan kemudian menampilkan hasil dari setiap langkah, dimulai dengan input itu sendiri, hingga kita menekan satu digit. Untuk 277777788888899 output seharusnya

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

(Menghitung jumlah langkah dibiarkan sebagai latihan untuk pengguna).

Lebih banyak contoh

Dari A003001 :

25
10
0

Dari A003001 juga:

68889
27648
2688
768
336
54
20
0

Dari video Numberphile :

327
42
8

Jadi ada pertanyaan tentang Ketekunan Aditif , tetapi ini adalah Multiplicative Persistence. Selain itu, pertanyaan itu menanyakan jumlah langkah sebagai output, sementara saya tertarik melihat hasil antara.

SQB
sumber
Bonus: temukan catatan baru: angka terkecil dengan jumlah langkah terbesar. Peringatan: dugaan bahwa 11 adalah yang terbesar.
SQB
7
Anda mungkin harus memasukkan beberapa lagi test case yang tidak diakhiri dengan . 0
Arnauld
Datang untuk membuat posting ini, ternyata sudah ada, gg
cat
Apakah input satu digit valid?
dzaima
1
Dalam video Numberphile, Matt Parker menyatakan bahwa pencarian telah dilakukan hingga beberapa ratus digit.
HardScale

Jawaban:

7

Jelly , 4 byte

DP$Ƭ

Cobalah online!

Penjelasan

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

Sebagai bonus, inilah TIO yang akan menemukan angka dengan jumlah langkah terbesar untuk rentang angka tertentu. Ini berskala baik bahkan di TIO.

Nick Kennedy
sumber
15

TI-BASIC (TI-84), 30 32 31 byte

-1 byte terima kasih kepada @SolomonUcko!

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

Input di Ans.
Output ditampilkan sebagai permintaan tantangan. Trailing Ansdiperlukan untuk mencetak langkah terakhir.

Saya akui, saya tidak memikirkan formula ini sendiri, tetapi saya menemukannya sini dan memodifikasinya agar lebih sesuai dengan tantangan.

SUNTING: Setelah membaca ulang tantangan, saya menyadari bahwa program harus diakhiri jika produknya satu digit. Oleh karena itu, 2 byte ditambahkan ke akun untuk ini.

Contoh:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

Penjelasan:

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

Model Visual:
Ans dimulai sebagai 125673.
Model ini hanya mencakup logika di balik mengalikan digit; yang lainnya lebih mudah dipahami.

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)

Catatan:

TI-BASIC adalah bahasa tokenized. Jumlah karakter tidak sama dengan jumlah byte.

10^( aku s ini token satu byte .

Program ini tidak akan menyediakan urutan produk yang benar dengan bilangan bulat yang lebih besar dari 14 digit karena keterbatasan ketelitian desimal pada kalkulator TI.

Tau
sumber
Bisakah Anda menyimpan byte dengan pindah ke 10^(luar seq(dan menghilangkan tanda kurung tutup?
Solomon Ucko
Ya saya percaya begitu!
Tau
11

K (ngn / k) , 9 byte

{*/.'$x}\

Cobalah online!

{ }\ terus menerapkan fungsi dalam kurung kurawal sampai urutan bertemu

$x memformat argumen sebagai string (daftar karakter)

.' mengevaluasi masing-masing (dialek k lainnya membutuhkan titik dua, .:' )

*/ kali lipat, yaitu produk

ngn
sumber
8

R , 59 byte

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

Cobalah online!

Karena print invisiblymengembalikan inputnya, kita dapat menggunakan print(n)di dalam whileloop untuk mensimulasikan do-whileloop. Ini terinspirasi oleh salah satu tips saya untuk bermain golf di R .

Header membantu mencegah sejumlah besar dicetak dalam notasi ilmiah.

Giuseppe
sumber
8

05AB1E , 7 4 byte

Δ=SP

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Δ     # 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
Kevin Cruijssen
sumber
7

Python 2 ,  46  43 byte

-3 Terima kasih kepada xnor (perbandingan dirantai)

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

Cobalah online!

Jonathan Allan
sumber
Anda dapat melakukannya >di tempat and.
xnor
@ Terima kasih, mudah lupa itu akan berhasil.
Jonathan Allan
5

PowerShell , 54 byte

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

Cobalah online!


Metode berulang yang pertama kali menulis argumen input, kemudian mengubahnya menjadi string dan pipa itu menjadi array karakter. Array ini bergabung dengan tanda bintang tunggal, dan dieksekusi sebagai perintah dengan alias ekspresi panggil. Karena ini menulis angka Mulai ke angka terakhir lebih besar dari 0, (20, dalam skenario pengujian yang diberikan), saya menambahkan final $ake ujung ke output.

KGlasier
sumber
5

C # (Visual C # Interactive Compiler) , 79 74 68 byte

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

Saya mencoba untuk menjauh dari rekursi dalam C # karena berapa lama deklarasi metode, tetapi dalam hal ini menghemat dibandingkan dengan satu loop.

Cobalah online!

Perwujudan Ketidaktahuan
sumber
5

PHP , 63 byte

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

Versi berulang, panggilan dengan php -nFinput dari STDIN.

Cobalah online!

PHP ,72 71 byte

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

Cobalah online!

Versi rekursif, sebagai fungsi.

Input: 27777778888889999

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

Input: 23

23
6
640KB
sumber
5

Python 2 , 61 62 59 byte

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

Cobalah online!

-3 byte, terima kasih kepada Jonathan Allan

TFeld
sumber
Tidak bekerja untuk input yang tidak diakhiri dengan 0 pada iterasi terakhir mereka, misalnya 23
Perwujudan Ketidaktahuan
int.__mul__adalah tiga byte kurang darilambda a,b:a*b
Jonathan Allan
@Jonathan Allan Terima kasih! Saya tahu pasti ada sesuatu seperti itu
TFeld
Ubah f(reduce(int.__mul__,map(int,`n`)))ke f(eval('*'.join(`n`)))untuk menyimpan 13 byte.
mypetlion
@mypetlion ... Saya sudah melakukan itu di posting lain.
Jonathan Allan
5

perl 5 ( -n -M5.01), 32 30 25 byte

say$_=eval;s/\B/*/g&&redo

25 byte

30 byte

32 byte

Nahuel Fouilleul
sumber
Anda harus menyebutkan bahwa ini menggunakan-lpF//
Grimmy
1
@Grimy saya bisa menghemat 2 byte tanpa menggunakan -lpF//, memperbarui
Nahuel Fouilleul
5

MathGolf , 9 10 byte

h(ôo▒ε*h(→

Cobalah online!

Sekarang ia menangani input yang benar dengan satu digit. Tidak sempurna, tapi setidaknya itu benar.

Penjelasan

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)
maks
sumber
Output untuk input satu digit harus menjadi satu salinan nomor - diklarifikasi dalam komentar
dzaima
@dzaima saya akan memeriksanya, dan memperbarui jawabannya ketika sudah diselesaikan
maxb
5

Julia 0.7 , 36 33 byte

f(n)=n>9?[n;f(prod(digits(n)))]:n

Cobalah online!

Terima kasih kepada H.PWiz untuk -3 byte.

Kirill L.
sumber
Anda dapat menggunakan[n;f(prod(digits(n)))]
H.PWiz
4

JavaScript (ES6), 45 byte

Mengembalikan array bilangan bulat.

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

Cobalah online!

Arnauld
sumber
4

APL (NARS), 19 karakter, 38 byte

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

uji:

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

J , 16 byte

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

Cobalah online!

Galen Ivanov
sumber
4

Japt -R , 9 byte

Sangat tidak efisien - jangan coba - coba menjalankan test case pertama!

_ì ×}hN â

Cobalah

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

Brachylog , 7 byte

ẉ?Ḋ|ẹ×↰

Cobalah online!

Penjelasan

ẉ          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
Fatalisasi
sumber
Saya mencobanya sendiri. Lupa tentang Ḋ. Sisanya saya punya yang sama.
Kroppeb
3

JavaScript (Babel Node) , 46 byte

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

Cobalah online!


JavaScript (Babel Node) , 44 byte

Jika input dapat diambil sebagai String

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

Cobalah online!

Luis felipe De jesus Munoz
sumber
@Arnauld Ya, saya baru saja mengedit dan menambahkan kode yang salah. Saya masih mencari sesuatu menggunakan hanya string bukan array
Luis felipe De jesus Munoz
3

PowerShell , 64 59 byte

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

Cobalah online!

Metode berulang. Membawa input dan menyimpannya ke dalam $a, kemudian memasuki forlingkaran selama panjangnya $adua atau lebih (yaitu, lebih besar dari 9). Di dalam loop kita output $adan kemudian thitung ulang dengan mengubahnya oCharArra y, joining bersama-sama dengan *, dan kemudian iex(kependekan dari Invoke-Expressiondan mirip dengan eval). Setelah kita keluar dari loop, kita memiliki satu digit yang tersisa untuk dicetak, jadi kita menempatkan $ake dalam pipa lagi.

-5 byte berkat KGlasier.

AdmBorkBork
sumber
Anda bisa menggunakan perbandingan 9-lt$aalih-alih $a.length-1menghemat 5 byte. Dan jika Anda tidak menggunakan tali sepanjang waktu Anda bisa memotong sepotong yang layak. Lihat upaya PowerShell saya jika Anda mau!
KGlasier
3

Arang , 13 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

θ

Cetak input untuk pertama kalinya.

W⊖Lθ«

Ulangi sementara panjang input bukan 1.

≔IΠθθ

Ganti input dengan produk digitalnya menjadi string.

⸿θ

Cetak input pada baris baru.

Neil
sumber
3

Retina , 24 byte

.+~(\`

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

Cobalah online! Penjelasan:

.+~(\`

Cetak nilai saat ini pada barisnya sendiri di awal setiap loop sampai berhenti berubah dan jangan mencetak nilai yang tidak berubah dua kali. Mengevaluasi nilai saat ini di akhir setiap loop.

.
$&$*

Tambahkan *setelah setiap digit.

^
.+¶$$.(

Selesai mengubah input menjadi ekspresi yang mengevaluasi produk digital.

Sebagai catatan, Retina dapat melakukan ini dalam satu baris (25 byte):

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

C (gcc) , 58 byte

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

Cobalah online!

Pendekatan berulang ternyata lebih pendek 1 byte.

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 byte (rekursif)

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

Cobalah online!

Rekursi tampaknya lebih pendek dari iterasi untuk pencetakan dan langkah ...

attinat
sumber