Konvergensi Jumlah Produk Digital Berurutan Berurutan

13

Mengingat bilangan bulat positif n( Contoh:n=1234444999 )

  • Pisahkan menjadi digit berturut-turut:
    • [1, 2, 3, 4444, 999]
  • Ambil produk digital dari setiap proses.
    • [1, 2, 3, 4*4*4*4, 9*9*9] = [1, 2, 3, 256, 729]
  • Jumlahkan itu ...
    • 991
  • Ulangi sampai ini menyatu ke satu nomor:
    • 1234444999
    • 991
    • 82
    • 10
    • 1
  • Kembalikan nomor terakhir.

Uji Kasus

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

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

Contoh yang Diminta:

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

Kemenangan?

Ini , byte-count terendah adalah pemenangnya.

Guci Gurita Ajaib
sumber
Annnnnnnnnnnnnnnnnnnd ... ini BUKAN kotak pasir. Sampah. Yah, tidak banyak yang bisa saya lakukan sekarang, maaf semua.
Magic Gurita Guci
11
Akan lebih baik untuk memiliki test case di mana digit dari jenis yang sama tidak semuanya dalam potongan berturut-turut.
xnor
1
Bisakah kita mengambil input sebagai daftar digit? Beberapa bahasa tidak dapat mendukung bilangan bulat setinggi 11122233344455566677788899.
ETHproduk
@ ETHproduksi Anda dapat menyatakan input integer maksimum yang diizinkan oleh bahasa Anda dan jawaban Anda valid jika Anda dapat menjelaskan batasannya.
Magic Gurita Guci
4
Akankah digit evet yang sama muncul dalam 2 berjalan yang berbeda, misalnya: 33445555666333?
Tn. Xcoder

Jawaban:

7

05AB1E , 7 6 5 byte

Terima kasih kepada Emigna karena telah menghemat satu byte!

vSγPO

Menggunakan penyandian 05AB1E . Cobalah online!

Adnan
sumber
3
Saya baru saja memperhatikan untuk pertama kalinya bahwa avatar Anda adalah meme doge.
Magic Gurita Guci
@MagicOctopusUrn dan Anda baru saja membuat saya memperhatikan hal itu juga ...
Socratic Phoenix
Anda bisa menggantinya gFdengan v.
Emigna
@Emigna Oohh tentu saja! Terima kasih! :)
Adnan
5

Jelly, 9 byte

DŒgP€SµÐL

Cobalah online

Begini cara kerjanya:

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ý
sumber
Mengapa P tidak secara otomatis membuat vektor? Tampaknya aneh ...
Buah Esolanging
Tidak, P secara otomatis membuat vektor, jadi Anda tidak perlu .
Buah Esolanging
Tidak, P tidak membuat vektor: tio.run/##y0rNyan8/9/l6KT0gOBDWw9P8Pn//78RKgAA
Zacharý
Oh, begitu - Œgtidak konsisten ketika hanya ada satu kelompok. Apa alasan di balik itu?
Buah Esolanging
Tidak ada petunjuk sama sekali!
Zacharý
5

Mathematica, 55 42 byte

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

-13 byte dari @JungHwan Min . Terima kasih!

jika seseorang ingin menggunakan ini sebagai generator acak-digit,
berikut adalah penghitungan angka 100.000 pertama

{{1, 17320}, {2, 4873}, {3, 10862}, {4, 11358}, {5, 10853}, {6, 9688}, {7, 11464}, {8, 10878}, { 9, 12704}}
atau jika Anda bertaruh, jangan menaruh uang Anda pada 2!

J42161217
sumber
5

Japt , 17 15 13 byte

e".+"_¬ò¦ x_×

Uji secara online! Mengambil input sebagai string.

Masih belum puas dengan jawaban ini ...

Penjelasan

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
Produksi ETH
sumber
Anda juga dapat menganggapnya sebagai bilangan bulat dan menyatakan input maksimum yang diijinkan, maaf, saya mengubah jawaban saya setelah mempostingnya ke jawaban default saya untuk pertanyaan itu.
Magic Gurita Guci
@ MagicOctopusUrn Oh, hei, terima kasih. Itu menghemat dua byte, sih ...
ETHproduksi
1
Juga, x_×dikombinasikan dengan I'm unsatisfiedmembuatku tertawa. Terima kasih;).
Magic Gurita Guci
Saya pikir ßmungkin cara untuk pergi ke sini. Saya salah! (Setidaknya jam setengah lima pagi, saya duduk di bus ke bandara!)
Shaggy
"Masih belum puas" ... jadi ... akhirnya kamu puas?
Zacharý
4

Python 3 , 96 byte

from itertools import*
f=lambda n:n*(n<10)or f(sum(int(k)**len([*g])for k,g in groupby(str(n))))

Cobalah online!

notjagan
sumber
4

Brachylog , 8 byte

Ḋ|ẹḅ×ᵐ+↰

Cobalah online!

Penjelasan

Ḋ          Input = Output = a digit
 |         Or
  ẹ        Split into a list of digits
   ḅ       Group consecutive equal elements together
    ×ᵐ     Map multiply
      +    Sum
       ↰   Recursive call
Fatalisasi
sumber
Anda tidak akan pernah berharap Brachylog mengungguli Jelly di sini kan?
Erik the Outgolfer
@EriktheOutgolfer Ketika Brachylog mengalahkan Jelly, asumsi pertama saya adalah bahwa jawaban Jelly tidak optimal
Fatalize
Milik saya juga, kecuali saya mencoba melakukan ini di Jelly juga. Masalahnya, yah, 05AB1E masih mengalahkan ini. :)
Erik the Outgolfer
Baik. itu satu byte, dan jawaban Jelly itu untuk saya, ya, saya harapkan Brachylog mengalahkan Jelly.
Zacharý
2

PHP , 113 byte

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;

Cobalah online!

Jörg Hülsermann
sumber
Apakah Anda pengembang PHP penuh waktu?
Magic Gurita Guci
@MagicOctopusUrn Tidak, saya memiliki pengalaman selama beberapa tahun
Jörg Hülsermann
2

Sekam , 8 byte

ωöṁΠgmis

Mengambil dan mengembalikan bilangan bulat. Cobalah online!

Penjelasan

Memiliki built-in untuk basis 10 digit akan menyenangkan ...

ωöṁΠ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
sumber
2

JavaScript (ES6), 77 73 67 65 byte

Disimpan 2 byte berkat @CraigAyre

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

Bagaimana?

Input s diubah menjadi ekspresi aritmatika dengan:

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

Misalnya, 1234444999menjadi+1+2+3+4*4*4*4+9*9*9 .

Kami mengevaluasi ungkapan ini dan melakukan panggilan rekursif dengan hasilnya sampai akhirnya menjadi satu angka desimal.

Uji kasus

Arnauld
sumber
Bisakah Anda menghemat beberapa byte dengan membandingkannya dengan 9 ?:f=s=>s>9?f(''+eval(s.replace(/(.)\1*/g,s=>'+'+[...s].join`*`))):s
Craig Ayre
@CraigAyre Sepertinya pendekatan saya memang agak rumit. Terima kasih!
Arnauld
2

Haskell , 103 70 69 byte

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

Cobalah online!

bartavelle
sumber
1
Anda dapat mempersingkat banyak itu dengan menggunakan until(<10). Juga map(read.pure)dapat dipindahkan sebelumnya show, yang menyimpan tanda kurung.
Ørjan Johansen
Ya, itu jauh lebih baik!
bartavelle
1
Anda bisa menggunakan $bukan tanda kurung luar.
Ørjan Johansen
1

R , 114 104 byte

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

membaca dari stdin; mengembalikan jawaban sebagai string.

Cobalah online!

Giuseppe
sumber
Anda bisa menggunakan pastebukan as.character. Mantan memaksa inputnya ke dalam charactertipe ;-)
Frédéric
1

MATL, 11 byte

`!UY'^sVtnq

Cobalah di MATL Online

Penjelasan

        % 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
sumber
1

R, 97 96 byte

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

Pendekatan yang sedikit berbeda dari jawaban lain menggunakan R .

Jawaban ini memanfaatkan rlefungsi, yang compute[s] the lengths and values of runs of equal values in a vector.

-1 byte, terima kasih kepada @Giuseppe!

Frédéric
sumber
1
**setara dengan^
Giuseppe
1

Braingolf, 25 byte

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

Akan menambahkan tautan TIO setelah saya meminta Dennis untuk menarik versi terbaru, karena menggunakan operator serakah di dalam (...) loop saat ini rusak pada TIO

Penjelasan

!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
sumber
1

Japt , 19 byte

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

Cobalah online!

Penjelasan:

=ò¦ 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
sumber