Multiplikative Persistenz


46

Multiplikative Persistenz

  1. Multiplizieren Sie alle Ziffern einer Zahl
  2. Wiederholen, bis Sie eine einzelne Ziffer übrig haben

Wie von Numberphile erklärt :

Beispiel

  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 → 7 × 6 × 8 = 336
  9. 336 → 3 × 3 × 6 = 54
  10. 54 → 5x4 = 20
  11. 20 → 2x0 = 0

Dies ist übrigens der aktuelle Rekord: die kleinste Zahl mit der größten Anzahl von Schritten.

Golf

Ein Programm, das eine beliebige ganze Zahl als Eingabe annimmt und dann das Ergebnis jedes Schritts ausgibt, beginnend mit der Eingabe selbst, bis wir eine einzelne Ziffer treffen. Für 277777788888899 sollte die Ausgabe sein

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

(Das Zählen der Anzahl der Schritte bleibt dem Benutzer als Übung überlassen.)

Mehr Beispiele

Von A003001 :

25
10
0

Auch ab A003001:

68889
27648
2688
768
336
54
20
0

Aus dem Numberphile- Video:

327
42
8

Es gab also eine Frage zur additiven Persistenz , aber dies ist die multiplikative Persistenz. Außerdem fragt diese Frage nach der Anzahl der Schritte als Ausgabe, während ich daran interessiert bin, die Zwischenergebnisse zu sehen.


Bonus: Finden Sie einen neuen Rekord: Kleinste Zahl mit der größten Anzahl von Schritten. Vorbehalt: Vermutung, dass 11 die größtmögliche ist.
SQB

7
Sie sollten wahrscheinlich noch einige Testfälle hinzufügen, die nicht mit enden . 0
Arnauld

Kam, um diesen Beitrag zu machen, fand es bereits vorhanden, gg
cat

ist eine einstellige gültige Eingabe?
Dzaima

1
Im Numberphile-Video gibt Matt Parker an, dass mehrere hundert Stellen durchsucht wurden.
HardScale

Antworten:


7

Gelee , 4 Bytes

DP$Ƭ

Probieren Sie es online!

Erläuterung

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

Als Bonus gibt es hier einen TIO, der die Zahlen mit der größten Anzahl von Schritten für einen bestimmten Ziffernbereich findet. Es lässt sich auch mit TIO gut skalieren.


15

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

-1 Byte Danke an @SolomonUcko!

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

Eingang ist in Ans.
Die Ausgabe wird als Abfrageanforderung angezeigt. Das Trailing Answird benötigt, um den letzten Schritt auszudrucken.

Ich gebe zu, ich habe selbst nicht an diese Formel gedacht, sondern sie hier gefunden und an die Herausforderung angepasst.

BEARBEITEN : Beim erneuten Lesen der Abfrage wurde mir klar, dass das Programm abgebrochen werden muss, wenn das Produkt eine Ziffer ist. Daher mussten 2 Bytes hinzugefügt werden, um dies zu berücksichtigen.

Beispiel:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

Erläuterung:

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

Visual Model:
Ans startet als 125673.
Dieses Modell deckt nur die Logik zur Multiplikation der Ziffern ab. alles andere ist leichter zu verstehen.

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)

Anmerkungen:

TI-BASIC ist eine Token-Sprache. Die Anzahl der Zeichen entspricht nicht der Anzahl der Bytes.

10^(ist dieses Ein-Byte-Token .

Dieses Programm liefert aufgrund der Einschränkungen der Dezimalgenauigkeit der TI-Rechner nicht die richtige Produktsequenz mit Ganzzahlen, die länger als 14 Stellen sind.


Können Sie ein Byte speichern, indem Sie nach 10^(außen gehen seq(und die schließende Klammer weglassen?
Solomon Ucko

Ja, ich glaube schon!
Tau

11

K (ngn / k) , 9 Bytes

{*/.'$x}\

Probieren Sie es online!

{ }\ Wenden Sie die Funktion in geschweiften Klammern an, bis die Sequenz konvergiert

$x Formatieren Sie das Argument als String (Liste der Zeichen)

.'bewerten sich gegenseitig (andere Dialekte von k erfordern einen Doppelpunkt .:')

*/ Zeiten vorbei, dh Produkt



8

R , 59 Bytes

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

Probieren Sie es online!

Da print invisiblyseine Eingabe zurückgegeben wird, können wir print(n)innerhalb der whileSchleife eine do-whileSchleife simulieren . Dies wird durch eine meiner inspirierte Tipps für die in R Golf spielen .

Die Kopfzeile verhindert, dass große Zahlen in wissenschaftlicher Notation gedruckt werden.







5

PowerShell , 54 Byte

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

Probieren Sie es online!


Iterative Methode, die zuerst das Eingabeargument schreibt, es dann in eine Zeichenfolge konvertiert und in ein Zeichenarray umleitet. Dieses Array wird durch ein einzelnes Sternchen verbunden und als Befehl mit dem Aufrufausdruck-Alias ​​ausgeführt. Da hiermit die Startnummer bis zur letzten Zahl größer als 0 (20 in dem gegebenen Testszenario) notiert wird, füge ich $adem auszugebenden Ende ein Finale hinzu .



5

PHP , 63 Bytes

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

Iterative Version, Aufruf mit php -nFEingabe von STDIN.

Probieren Sie es online!

PHP ,72 71 Bytes

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

Probieren Sie es online!

Rekursive Version als Funktion.

Eingabe: 277777788888899

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

Eingabe: 23

23
6

5

Python 2 , 61 62 59 Bytes

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

Probieren Sie es online!

-3 Bytes, danke an Jonathan Allan


Funktioniert nicht für Eingaben, die bei ihrer letzten Iteration nicht mit einer 0 enden, zum Beispiel 23
Verkörperung der Ignoranz

int.__mul__ist drei Bytes kleiner alslambda a,b:a*b
Jonathan Allan

@ JonathanAllan Danke! Ich wusste, dass es so etwas geben musste
TFeld

Wechseln Sie f(reduce(int.__mul__,map(int,`n`)))zu f(eval('*'.join(`n`))), um 13 Byte zu speichern.
mypetlion

@mypetlion ... das habe ich schon in einem anderen post gemacht.
Jonathan Allan


5

MathGolf , 9 10 Bytes

h(ôo▒ε*h(→

Probieren Sie es online!

Eingaben, die einstellig sind, werden nun korrekt verarbeitet. Nicht perfekt, aber immerhin stimmt es.

Erläuterung

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)

Die Ausgabe für eine einstellige Eingabe sollte eine Kopie der Zahl sein - klargestellt in den Kommentaren
dzaima

@dzaima Ich werde es untersuchen und die Antwort aktualisieren, wenn es gelöst ist
maxb




4

APL (NARS), 19 Zeichen, 38 Byte

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

Prüfung:

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




4

Japt -R , 9 Bytes

Schrecklich ineffizient - versuchen Sie nicht einmal , den ersten Testfall auszuführen!

_ì ×}hN â

Versuch es

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

ẉ?Ḋ|ẹ×↰

Probieren Sie es online!

Erläuterung

ẉ          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

Ich habe es selbst ausprobiert. Vergaß das Ḋ. Den Rest hatte ich gleich.
Kroppeb


3

Power , 64 59 Bytes

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

Probieren Sie es online!

Iterative Methode. Nimmt Eingaben auf und speichert sie in $aeiner forSchleife, bis die Länge $azwei oder mehr beträgt (dh, sie ist größer als 9). Innerhalb der Schleife geben wir sie aus $aund berechnen sie neu, indem wir sie toCharArra konvertieren y, joinzusammen mit *und dann iex(kurz für Invoke-Expressionund ähnlich wie eval). Sobald wir die Schleife verlassen haben, müssen wir noch eine einzelne Ziffer drucken, damit wir sie wieder $ain die Pipeline einfügen können.

-5 Bytes dank KGlasier.


Sie können den Vergleich 9-lt$averwenden $a.length-1, um 5 Byte zu sparen. Und wenn man nicht die ganze Zeit auf Saiten basiert, kann man einen anständigen Teil abschneiden. Schau dir meinen PowerShell-Versuch an, wenn du willst!
KGlasier

3

Kohle , 13 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

θ

Die Eingabe zum ersten Mal drucken.

W⊖Lθ«

Wiederholen Sie diesen Vorgang, solange die Länge der Eingabe nicht 1 beträgt.

≔IΠθθ

Ersetzen Sie die Eingabe durch das digitale Produkt, das in Zeichenfolge umgewandelt wurde.

⸿θ

Geben Sie die Eingabe in einer neuen Zeile aus.


3

Retina , 24 Bytes

.+~(\`

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

Probieren Sie es online! Erläuterung:

.+~(\`

Geben Sie den aktuellen Wert zu Beginn jeder Schleife in einer eigenen Zeile aus, bis er sich nicht mehr ändert, und geben Sie den unveränderten Wert nicht zweimal aus. Werten Sie den aktuellen Wert am Ende jeder Schleife aus.

.
$&$*

Fügen Sie *nach jeder Ziffer ein hinzu.

^
.+¶$$.(

Verwandeln Sie die Eingabe in einen Ausdruck, der das digitale Produkt ergibt.

Nur zur Veranschaulichung, Retina kann dies in einer Zeile (25 Bytes) tun:

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

3

C (gcc) , 58 Bytes

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

Probieren Sie es online!

Der iterative Ansatz ist 1 Byte kürzer.

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 Bytes (rekursiv)

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

Probieren Sie es online!

Die Rekursion scheint sowohl für Druck als auch für Schritt kürzer als die Iteration zu sein ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.