Wiederholte aufeinanderfolgende digitale Produktsummenkonvergenz

13

Bei einer positiven ganzen Zahl n( Beispiel:n=1234444999 )

  • In aufeinanderfolgende Ziffernfolgen aufteilen:
    • [1, 2, 3, 4444, 999]
  • Nehmen Sie das digitale Produkt jedes Laufs.
    • [1, 2, 3, 4*4*4*4, 9*9*9] = [1, 2, 3, 256, 729]
  • Fassen Sie es zusammen ...
    • 991
  • Wiederholen, bis dies zu einer einzelnen Zahl konvergiert:
    • 1234444999
    • 991
    • 82
    • 10
    • 1
  • Letzte Nummer zurückgeben.

Testfälle

BASE CASES:
0 = 0
...
9 = 9

OTHER CASES:
1234444999                     = 1
222222222222222                = 8
111222333444555666777888999000 = 9
11122233344455566677788899     = 8
1112223334445                  = 6
14536                          = 1
99                             = 9

Gewünschtes Beispiel:

334455553666333
9+16+625+3+216+27
896
8+9+6
23
2+3
**5**

Gewinnen?

Es ist , die niedrigste Byteanzahl ist der Gewinner.

Magic Octopus Urn
quelle
Annnnnnnnnnnnnnnnnnd ... das ist NICHT der Sandkasten. Mist. Nun, nicht viel kann ich jetzt tun, sorry all ._.
Magic Octopus Urn
11
Es wäre gut, Testfälle zu haben, in denen nicht alle Ziffern der gleichen Art in einem fortlaufenden Teil enthalten sind.
Xnor
1
Können wir Eingaben als Ziffernliste nehmen? Einige Sprachen unterstützen keine ganzen Zahlen bis zu 11122233344455566677788899.
ETHproductions
@ETHproductions Sie können die maximale Ganzzahleingabe angeben, die in Ihrer Sprache zulässig ist, und Ihre Antwort muss gültig sein, wenn Sie die Begrenzung erläutern können.
Magic Octopus Urn
4
Wird die gleiche Ziffer evet in zwei verschiedenen Läufen erscheinen, zum Beispiel: 33445555666333?
Mr. Xcoder

Antworten:

7

05AB1E , 7 6 5 Bytes

Danke an Emigna für das Speichern eines Bytes!

vSγPO

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Adnan
quelle
3
Mir ist gerade zum ersten Mal aufgefallen, dass dein Avatar ein Dogenmem ist.
Magic Octopus Urn
@MagicOctopusUrn und Sie haben mich auch darauf aufmerksam gemacht ...
Socratic Phoenix
Sie könnten ersetzen gFmit v.
Emigna
@Emigna Oohh natürlich! Vielen Dank! :)
Adnan
5

Gelee, 9 Bytes

DŒgP€SµÐL

Probieren Sie es online aus

So funktioniert das:

D  - input as a list of digits
Œg - group runs of equal elements
P€ - the product of each element
S  - the sum of the list
µ  - syntax stuff to separate the left from the right
ÐL - repeat until we get a result twice, then return that result.
Zacharý
quelle
Warum vektorisiert P nicht automatisch? Das scheint seltsam ...
Esolanging Fruit
Nein, P vektorisiert automatisch, sodass Sie das nicht benötigen .
Esolanging Fruit
Nein, P vektorisiert nicht: tio.run/##y0rNyan8/9/l6KT0gOBDWw9P8Pn//78RKgAA
Zacharý
Oh, ich verstehe - Œgist inkonsistent, wenn es nur eine einzige Gruppe gibt. Was steckt dahinter?
Esolanging Fruit
Überhaupt keine Ahnung!
Zacharý
5

Mathematica, 55 42 Bytes

#//.i_:>Tr[Times@@@Split@IntegerDigits@i]&

-13 Bytes von @JungHwan min . Vielen Dank!

Für den Fall, dass jemand dies als Zufallsgenerator verwenden möchte, finden Sie
hier die ersten 100.000 Zahlen

{{1, 17320}, {2, 4873}, {3, 10862}, {4, 11358}, {5, 10853}, {6, 9688}, {7, 11464}, {8, 10878}, { 9, 12704}}
oder wenn Sie spielen, setzen Sie Ihr Geld nicht auf 2!

J42161217
quelle
5

Japt , 17 15 13 Bytes

e".+"_¬ò¦ x_×

Online testen! Nimmt die Eingabe als String.

Immer noch nicht zufrieden mit dieser Antwort ...

Erläuterung

e".+"_  ¬ ò¦  x_  ×
e".+"Z{Zq ò!= xZ{Zr*1}}

e".+"                     Repeatedly replace all matches of /.+/ (the entire string)
     Z{               }   Z with this function:
       Zq                   Split Z into chars.
          ò!=               Partition at inequality; that is, split into runs of equal items.
              xZ{    }      Take the sum of: for each item in Z:
                 Zr*1         the item reduced by multiplication (i.e. the product).
                          This procedure is repeated until the same result is yielded twice.
                          Implicit: output result of last expression
ETHproductions
quelle
Sie können es auch einfach als Ganzzahl nehmen und die maximal zulässige Eingabe angeben. Tut mir leid, ich habe meine Antwort geändert, nachdem ich sie auf meine Standardantwort für diese Frage gepostet habe.
Magic Octopus Urn
@MagicOctopusUrn Oh, hey, danke. Das spart jedenfalls zwei Bytes ...
ETHproductions
1
Auch die x_×Kombination mit brachte I'm unsatisfiedmich zum Lachen. Vielen Dank ;).
Magic Octopus Urn
Ich dachte, ßdas wäre der richtige Weg gewesen. Ich hab mich geirrt! (Mindestens um halb 6 morgens saß ich im Bus zum Flughafen!)
Shaggy
"Immer noch nicht unzufrieden" ... also ... bist du endlich zufrieden?
Zacharý
4

Brachylog , 8 Bytes

Ḋ|ẹḅ×ᵐ+↰

Probieren Sie es online!

Erläuterung

Ḋ          Input = Output = a digit
 |         Or
  ẹ        Split into a list of digits
   ḅ       Group consecutive equal elements together
    ×ᵐ     Map multiply
      +    Sum
       ↰   Recursive call
Tödlich
quelle
Sie würden nie erwarten, dass Brachylog Jelly hier übertrifft, oder?
Erik der Outgolfer
@EriktheOutgolfer Wenn Brachylog Jelly schlägt, ist meine erste Annahme, dass die Jelly-Antwort nicht optimal ist
Fatalize
Meins auch, außer ich habe es auch in Jelly versucht. Die Sache ist, nun, 05AB1E schlägt das immer noch. :)
Erik der Outgolfer
Gut. Es ist ein Byte, und die Antwort von Jelly stammt von mir. Ja, ich würde erwarten, dass Brachylog Jelly besiegt.
Zacharý
2

PHP , 113 Bytes

for(;9<$a=&$argn;$a=$s){$s=0;preg_match_all('#(.)\1*#',$argn,$t);foreach($t[0]as$v)$s+=$v[0]**strlen($v);}echo$a;

Probieren Sie es online!

Jörg Hülsermann
quelle
Sind Sie ein Vollzeit-PHP-Entwickler?
Magic Octopus Urn
@MagicOctopusUrn Nein, ich habe Erfahrung über einige Jahre
Jörg Hülsermann
2

Schale , 8 Bytes

ωöṁΠgmis

Nimmt und gibt eine ganze Zahl zurück. Probieren Sie es online!

Erläuterung

Ein eingebautes 10-stelliges System wäre schön ...

ωöṁΠgmis
ω         Iterate until a fixed point is found
 ö        the composition of the following four functions:
       s   convert to string,
     mi    convert each digit to integer,
    g      group equal adjacent integers,
  ṁΠ       take product of each group and sum the results.
Zgarb
quelle
2

JavaScript (ES6), 77 73 67 65 Bytes

2 Bytes dank @CraigAyre gespart

f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s

Wie?

Die Eingabe s wird in einen arithmetischen Ausdruck umgewandelt mit:

s.replace(/(.)\1*/g, s => '+' + [...s].join`*`)

Zum Beispiel 1234444999wird +1+2+3+4*4*4*4+9*9*9.

Wir werten diesen Ausdruck aus und führen einen rekursiven Aufruf mit dem Ergebnis durch, bis eine einzelne Dezimalstelle erreicht ist.

Testfälle

Arnauld
quelle
Können Sie durch einen Vergleich mit 9 ein paar Bytes sparen ?:f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s
Craig Ayre
@CraigAyre Scheint, als wäre meine Herangehensweise in der Tat etwas zu kompliziert. Vielen Dank!
Arnauld
2

Haskell , 103 70 69 Bytes

import Data.List
until(<10)$sum.map product.group.map(read.pure).show

Probieren Sie es online!

Bartavelle
quelle
1
Sie können das viel verkürzen, indem Sie verwenden until(<10). Auch der map(read.pure)kann vorher verschoben werden show, wodurch Klammern gespart werden.
Ørjan Johansen
Ja, es ist viel besser!
Bartavelle
1
Sie können $anstelle der äußeren Klammern verwenden.
Ørjan Johansen
1

R , 114 104 Bytes

n=scan(,'');while(nchar(n)>1){n=el(strsplit(n,''));b=table(n);n=as.character(sum(strtoi(names(b))^b))};n

liest von stdin; gibt die Antwort als String zurück.

Probieren Sie es online!

Giuseppe
quelle
Sie könnten pasteanstelle von verwenden as.character. Ersteres erzwingt seine Eingabe in characterTyp ;-)
Frédéric
1

MATL, 11 Bytes

`!UY'^sVtnq

Probieren Sie es bei MATL Online aus

Erläuterung

        % Implicitly grab input as a string
`       % Do...while loop
  !U    % Convert the string to an array of numbers (the digits)
  Y'    % Perform run-length encoding
  ^     % Raise the digits to the power corresponding to the number of times they
        % occurred consecutively
  s     % Sum the result
  V     % Convert to a string
  tn    % Duplicate and determine the number of characters in the string
  q     % Subtract one, causes the loop to continue until it's a single digit
        % Implicit end of do...while loop and display
Suever
quelle
1

R 97 96 Bytes

a=scan(,"");while(nchar(a)>1){a=paste(sum(strtoi((b<-rle(el(strsplit(a,""))))$v)^strtoi(b$l)))}a

Etwas anderer Ansatz als die andere Antwort mit R .

Diese Antwort nutzt die rle Funktion, diecompute[s] the lengths and values of runs of equal values in a vector .

-1 Bytes dank @Giuseppe!

Frédéric
quelle
1
**ist gleichbedeutend mit^
Giuseppe
1

Braingolf, 25 Bytes

!L1-Mv[RG(d&*)&+!L1-Mv>]R

Füge einen TIO-Link hinzu, sobald ich Dennis dazu bringe, die neueste Version zu installieren, indem er gierige Operatoren verwendet (...) herunterladen soll Schleifen derzeit bei TIO nicht funktioniert

Erläuterung

!L1-Mv[RG(d&*)&+!L1-Mv>]R  Implicit input from commandline args
!L1-M                      Push length of input minus 1 to stack2
     v                     Switch to stack2
      [.........!L1-Mv>]   While length of input > 1..
       RG                  Split into digit runs
         (d&*)             Product of digits of each item in stack
              &+           Sum stack
                        R  Return to stack1
                           Implicit output from stack
Skidsdev
quelle
1

Japt , 19 Bytes

=ò¦ m¬®×Ãx)<A?U:ßUs

Probieren Sie es online!

Erläuterung:

=ò¦ m¬®×Ãx)<A?U:ßUs
=                    // Implicit U (input) =
 ò¦                  //   Split the input into an array of consecutive digit runs
    m¬               //   Split each inner array: ["1","22","333"] -> [["1"],["2","2"],["3","3","3"]]
      ®              //   Map; At each item:
       ×             //     Get the product of each run
        Ã            //   }
         x           //   Sum
           <A        // <10
             ?       // If true:
              U      //   return U
               :     // Else:
                ß    //   Run the program again; Pass:
                 Us  //     U, cast to a string
Oliver
quelle