Çarpıcı kalıcılık


46

Çarpımsal Kalıcılık

  1. Sayıdaki tüm sayıları çarp
  2. Tek bir rakamı bulana kadar tekrarla

Numberphile tarafından açıklandığı gibi :

Örnek

  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

Bu, şu anki sicil rekorudur: en büyük adımlı en küçük sayı.

Golf

Herhangi bir sayıyı girdi olarak alan ve ardından her bir basamağın sonucunu, girişin kendisinden başlayarak, tek bir basamağa ulaşana kadar çıkarır. 277777788888899 için çıktı olması gerekir

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

(Adım sayısını saymak kullanıcıya alıştırma olarak bırakılmıştır).

Daha fazla örnek

Gönderen A003001 :

25
10
0

A003001'den itibaren:

68889
27648
2688
768
336
54
20
0

Gönderen Numberphile videosu:

327
42
8

Demek Katkıda Kalıcılık hakkında bir soru var , ama bu Çarpıcı Kalıcılık. Ayrıca, bu soru, ara sonuçları görmekle ilgilenirken, çıktı olarak atılacak adımların sayısını soruyor.


Bonus: yeni bir rekor bul: en fazla sayıda adım olan en küçük sayı. Uyarım: Varsayım 11 mümkün olan en büyük olduğunu var.
SQB

7
Muhtemelen ile bitmeyen birkaç test vakası daha eklemelisiniz . 0
Arnauld

Bu gönderiyi yapmak için geldim, zaten mevcut buldu, gg
cat

tek basamaklı geçerli giriş nedir?
dzaima

1
Numberphile videosunda Matt Parker, birkaç yüz haneye kadar arama yapıldığını belirtti.
HardScale

Yanıtlar:


7

Jöle , 4 bayt

DP$Ƭ

Çevrimiçi deneyin!

açıklama

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

Bonus olarak, işte belirli bir sayı aralığı için en büyük adım sayısını içeren sayıları bulan bir TIO . TIO'da bile iyi ölçeklenir.


15

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

@SolomonUcko! İle -1 bayt teşekkürler!

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

Giriş girildi Ans.
Çıktı, talepler olarak gösterilir. AnsSon adımı yazdırmak için iz gerekir.

Kabul edeceğim, bu formülü kendim düşünmedim, daha ziyade burada buldum ve mücadeleye daha iyi uyacak şekilde değiştirdim.

EDIT: Bu zorluğu tekrar okuduktan sonra, ürünün bir basamak olması durumunda programın sonlandırılması gerektiğini anladım. Bu nedenle, hesaba 2 bayt eklenecek.

Örnek:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

Açıklama:

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

Görsel Model: olarak
Ans başlar 125673.
Bu model sadece rakamları çarparak arkasındaki mantığı kapsar; her şey anlamak daha kolaydır.

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)

Notlar:

TI-BASIC belirtilmiş bir dildir. Karakter sayısı bayt sayısına eşit değil .

10^(olan bu bir baytlık belirteci .

Bu program, TI hesaplayıcılarında ondalık hassasiyetin sınırlandırılmasından dolayı, 14 basamaktan daha uzun tamsayılara sahip doğru ürün dizisini sağlamayacaktır.


10^(Dışarıya doğru hareket seq(ederek ve parantez kapatma parantezini kaldırarak bir bayt kaydedebilir misiniz ?
Solomon Ucko

Evet, buna inanıyorum!
Tau

11

K (ngn / k) , 9 bayt

{*/.'$x}\

Çevrimiçi deneyin!

{ }\ Sıra yakınlaşıncaya kadar işlevi kıvrımlı parantez içinde uygulamaya devam et

$x argümanı bir dize olarak biçimlendirin (karakter listesi)

.'her birini değerlendirin (k'nın diğer lehçeleri kolon gerektirir .:')

*/ çarpı, yani ürün



8

R , 59 bayt

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

Çevrimiçi deneyin!

print invisiblyGirdiyi döndürdüğünden beri , bir döngüyü simüle etmek için döngü print(n)içinde kullanabiliriz . Bu R golf oynamak için benim ipuçlarımdan biri ilham alıyor .whiledo-while

Başlık, çok sayıda sayının bilimsel gösterimde yazdırılmasını önler.







5

PowerShell , 54 bayt

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

Çevrimiçi deneyin!


Önce girdi argümanını yazan, sonra onu bir dizgeye dönüştüren ve bir karakter dizisine dönüştüren yinelemeli yöntem. Bu diziye tek bir yıldız işareti eklenir ve invoke ifadesinin diğer adıyla bir komut olarak yürütülür. Bu, Başlangıç ​​numarasını 0'dan büyük son sayıya kadar yazdığından (20, verilen test senaryosunda) $açıktıya sonuna bir son eklerim .



5

PHP , 63 bayt

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

Yinelemeli sürüm, php -nFgiriş ile arayın STDIN.

Çevrimiçi deneyin!

PHP ,72 71 bayt

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

Çevrimiçi deneyin!

Fonksiyon olarak özyinelemeli versiyonu.

Giriş: 277777788888899

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

Giriş: 23

23
6

5

Python 2 , 61 62 59 bayt

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

Çevrimiçi deneyin!

Jonathan Allan sayesinde -3 bayt


Son yinelemelerinde 0 ile bitmeyen girişler için işe yaramaz, örneğin 23
Ignorance

int.__mul__daha az üç bayttırlambda a,b:a*b
Jonathan Allan

@JonathanAllan Teşekkürler! Böyle bir şey olması gerektiğini biliyordum
TFeld

13 bayt kaydetmek f(reduce(int.__mul__,map(int,`n`)))için değiştirin f(eval('*'.join(`n`))).
Mypetlion,

@ mypetlion ... Bunu zaten başka bir yayında yaptım.
Jonathan Allan,


5

MathGolf , 9 10 bayt

h(ôo▒ε*h(→

Çevrimiçi deneyin!

Şimdi tek basamaklı girişleri doğru şekilde işler. Mükemmel değil, ama en azından doğru.

açıklama

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)

Tek basamaklı bir girişin çıktısı, sayının bir kopyası olmalıdır - yorumlarda açıklanmıştır
dzaima

@dzaima Ben çözüldü zaman içine bakmak ve cevap güncellenecektir
maxb




4

APL (NARS), 19 karakter, 38 bayt

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

Ölçek:

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




4

Japt -R , 9 bayt

Korkunç verimsiz - hatta yok deneyin ilk test durumda çalıştırmak için!

_ì ×}hN â

Dene

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

ẉ?Ḋ|ẹ×↰

Çevrimiçi deneyin!

açıklama

ẉ          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

Kendim denedim. About hakkında unuttum. Gerisi bende aynıydı.
Kroppeb


3

PowerShell , 64 59 bayt

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

Çevrimiçi deneyin!

Yinelemeli yöntem Girdiyi alır ve içine depolar $a, sonra foruzunluğu $aiki veya daha fazla olduğu sürece bir döngüye girer (yani, büyüktür 9). Döngü çıkışa içinde $ave daha sonra o dönüştürerek yeniden hesaplamak toCharArra y, joinile birlikte ing *sonra ve iex(kısa Invoke-Expressionve benzer eval). Döngü dışına çıktığımızda, yazdırılacak tek bir rakam kaldı, bu yüzden $atekrar boru hattına yerleştirdik.

KGlasier sayesinde -5 bayt.


5 bayt kaydetmek 9-lt$ayerine karşılaştırmayı kullanabilirsiniz $a.length-1. Ve eğer tüm zamana dayanarak tel çekmediysen, düzgün bir yığın kesebilirsin. İsterseniz powhellhell girişimi göz atın !
KGlasier

3

Kömür , 13 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

θ

Girişi ilk defa yazdırın.

W⊖Lθ«

Girişin uzunluğu 1 değilken tekrarlayın.

≔IΠθθ

Girdiyi dize dönüştürülmüş dijital ürünü ile değiştirin.

⸿θ

Girişi yeni bir satıra yazdırın.


3

Retina , 24 bayt

.+~(\`

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

Çevrimiçi deneyin! Açıklama:

.+~(\`

Mevcut değeri, her bir döngünün başında değiştirmeyi bırakıp değişmeyen değeri iki kez yazdırmadan kendi satırına yazdır. Her döngünün sonunda geçerli değeri değerlendirin.

.
$&$*

*Her rakamdan sonra bir tane ekleyin .

^
.+¶$$.(

Girişi, dijital ürünle değerlendirilen bir ifadeye dönüştürmeyi bitirin.

Sadece kayıt için, Retina bunu bir satırda yapabilir (25 bayt):

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

3

C (gcc) , 58 bayt

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

Çevrimiçi deneyin!

İteratif yaklaşım 1 bayt daha kısa çıkmaktadır.

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 bayt (özyinelemeli)

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

Çevrimiçi deneyin!

Özyineleme hem baskı hem de adım için yinelemeden daha kısa görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.