Wielokrotna konwergencja sumy produktów cyfrowych

13

Biorąc pod uwagę, dodatnia n( Przykład:n=1234444999 )

  • Podziel na kolejne cyfry:
    • [1, 2, 3, 4444, 999]
  • Weź cyfrowy produkt każdego biegu.
    • [1, 2, 3, 4*4*4*4, 9*9*9] = [1, 2, 3, 256, 729]
  • Zsumuj to ...
    • 991
  • Powtarzaj, aż zbiegnie się to w jedną liczbę:
    • 1234444999
    • 991
    • 82
    • 10
    • 1
  • Zwróć ostatni numer.

Przypadki testowe

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

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

Prośba o przykład:

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

Zwycięski?

Jest to , zwycięzcą jest najniższa liczba bajtów.

Urna Magicznej Ośmiornicy
źródło
Annnnnnnnnnnnnnnnnnnd ... to NIE jest piaskownica. Bzdury. Cóż, niewiele mogę teraz zrobić, przepraszam wszystkich ._.
Magic Octopus Urn
11
Dobrze byłoby mieć przypadki testowe, w których cyfry tego samego rodzaju nie znajdują się w jednym kawałku.
xnor
1
Czy możemy przyjmować dane wejściowe jako listę cyfr? Niektóre języki nie obsługują liczb całkowitych tak wysokich jak 11122233344455566677788899.
ETHprodukcje
@ETHproductions możesz podać maksymalną liczbę całkowitą dozwoloną przez Twój język i mieć poprawną odpowiedź, jeśli potrafisz wyjaśnić ograniczenia.
Magic Octopus Urn
4
Czy ta sama cyfra pojawi się w 2 różnych seriach, np .: 33445555666333?
Pan Xcoder,

Odpowiedzi:

7

05AB1E , 7 6 5 bajtów

Dzięki Emignie za uratowanie bajtu!

vSγPO

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Adnan
źródło
3
Właśnie teraz zauważyłem, że twój awatar jest memem doży.
Magic Octopus Urn
@MagicOctopusUrn, a ty właśnie to zauważyłem ...
Socratic Phoenix
Można wymienić gFz v.
Emigna
@Emigna Oohh oczywiście! Dziękuję Ci! :)
Adnan,
5

Galaretka, 9 bajtów

DŒgP€SµÐL

Wypróbuj online

Oto jak to działa:

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ý
źródło
Dlaczego P nie wektoryzuje automatycznie? To wydaje się dziwne ...
Esolanging Fruit
Nie, P automatycznie wektoryzuje, więc nie potrzebujesz .
Esolanging Fruit
Nie, P nie wektoryzuje: tio.run/##y0rNyan8/9/l6KT0gOBDWw9P8Pn//78RKgAA
Zacharý
Och, rozumiem - Œgjest niespójny, gdy jest tylko jedna grupa. Jakie jest tego uzasadnienie?
Esolanging Fruit
Żadnych wskazówek!
Zacharý
5

Mathematica, 55 42 bajtów

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

-13 bajtów od @JungHwan Min . Dzięki!

na wypadek, gdyby ktoś chciał użyć tego jako generatora liczb losowych,
oto suma pierwszych 100 000 liczb

{{1, 17320}, {2, 4873}, {3, 10862}, {4, 11358}, {5, 10853}, {6, 9688}, {7, 11464}, {8, 10878}, { 9, 12704}}
lub jeśli grasz, nie kładź pieniędzy na 2!

J42161217
źródło
5

Japt , 17 15 13 bajtów

e".+"_¬ò¦ x_×

Przetestuj online! Pobiera dane wejściowe jako ciąg.

Wciąż niezadowolony z tej odpowiedzi ...

Wyjaśnienie

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
ETHprodukcje
źródło
Możesz również wziąć to jako liczbę całkowitą i podać maksymalne dopuszczalne dane wejściowe, przepraszam, zmieniłem odpowiedź po opublikowaniu jej na domyślną odpowiedź na to pytanie.
Magic Octopus Urn
@MagicOctopusUrn Och, hej, dzięki. To i tak oszczędza dwa bajty ...
ETHprodukcje
1
W x_×połączeniu z I'm unsatisfiedrozśmieszyłem mnie. Dzięki ;).
Magic Octopus Urn
Myślałem, że to ßmoże być droga do tego miejsca. Myliłem się! (Przynajmniej o wpół do piątej rano siedziałem w autobusie na lotnisko, na którym byłem!)
Kudłaty,
„Wciąż niezadowolony” ... więc ... jesteś w końcu zadowolony?
Zacharý
4

Brachylog , 8 bajtów

Ḋ|ẹḅ×ᵐ+↰

Wypróbuj online!

Wyjaśnienie

Ḋ          Input = Output = a digit
 |         Or
  ẹ        Split into a list of digits
   ḅ       Group consecutive equal elements together
    ×ᵐ     Map multiply
      +    Sum
       ↰   Recursive call
Fatalizować
źródło
Nigdy nie spodziewałbyś się, że Brachylog przebije Galaretkę, prawda?
Erik the Outgolfer,
@EriktheOutgolfer Kiedy Brachylog pokonuje Jelly, moje pierwsze założenie jest takie, że odpowiedź na Jelly nie jest optymalna
Fatalize
Mój też, tyle że ja też próbowałem to zrobić w Galaretce. Chodzi o to, że 05AB1E wciąż to bije. :)
Erik the Outgolfer
Dobrze. to jeden bajt, a odpowiedź na galaretkę pochodzi ode mnie, tak, spodziewałbym się, że Brachylog pokona Jelly.
Zacharý
2

PHP , 113 bajtów

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;

Wypróbuj online!

Jörg Hülsermann
źródło
Czy jesteś pełnoetatowym programistą PHP?
Magic Octopus Urn
@MagicOctopusUrn Nie Mam doświadczenie przez kilka lat
Jörg Hülsermann
2

Łuska , 8 bajtów

ωöṁΠgmis

Bierze i zwraca liczbę całkowitą. Wypróbuj online!

Wyjaśnienie

Mając wbudowane 10 podstawowych cyfr, byłoby miło ...

ωöṁΠ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
źródło
2

JavaScript (ES6), 77 73 67 65 bajtów

Zaoszczędź 2 bajty dzięki @CraigAyre

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

W jaki sposób?

Dane wejściowe s przekształca się w wyrażenie arytmetyczne za pomocą:

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

Na przykład 1234444999staje się +1+2+3+4*4*4*4+9*9*9.

Oceniamy to wyrażenie i wykonujemy wywołanie rekurencyjne z wynikiem, aż zostanie sprowadzone do jednej cyfry dziesiętnej.

Przypadki testowe

Arnauld
źródło
Czy można zaoszczędzić kilka bajtów, porównując z 9 ?:f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s
Craig Ayre
@CraigAyre Wydaje się, że moje podejście było trochę zbyt skomplikowane. Dzięki!
Arnauld,
2

Haskell , 103 70 69 bajtów

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

Wypróbuj online!

bartavelle
źródło
1
Możesz to znacznie skrócić, używając until(<10). Również map(read.pure)można przesuwać przed show, co oszczędza nawiasów.
Ørjan Johansen
Tak, jest o wiele lepiej!
bartavelle,
1
Możesz użyć $zamiast zewnętrznych nawiasów.
Ørjan Johansen
1

R , 114 104 bajtów

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

czyta ze standardowego; zwraca odpowiedź jako ciąg znaków.

Wypróbuj online!

Giuseppe
źródło
Możesz użyć pastezamiast as.character. Ten pierwszy wymusza wprowadzanie tekstu character;-)
Frédéric
1

MATL, 11 bajtów

`!UY'^sVtnq

Wypróbuj w MATL Online

Wyjaśnienie

        % 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
źródło
1

R, 97 96 bajtów

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

Nieco inne podejście niż w pozostałych odpowiedzi przy użyciu R .

Ta odpowiedź korzysta z rlefunkcji, która compute[s] the lengths and values of runs of equal values in a vector.

-1 bajtów dzięki @Giuseppe!

Frédéric
źródło
1
**jest równoważne^
Giuseppe,
1

Braingolf, 25 bajtów

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

Dodam link do TIO, kiedy Dennis pobierze najnowszą wersję, ponieważ używanie chciwych operatorów w (...)pętlach jest obecnie zepsute w TIO

Wyjaśnienie

!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
źródło
1

Japt , 19 bajtów

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

Wypróbuj online!

Wyjaśnienie:

=ò¦ 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
źródło