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.


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.


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.


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



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.







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.



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

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


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

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)

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




4

APL (NARS), 19 karakter, 38 byte

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

uji:

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




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

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

Saya mencobanya sendiri. Lupa tentang Ḋ. Sisanya saya punya yang sama.
Kroppeb


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.


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.


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`.

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 ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.