Digit Urutan Produk

22

Berikut urutan menarik yang ditemukan oleh Paul Loomis, seorang ahli matematika di Universitas Bloomsburg. Dari halamannya di urutan ini:

Definisikan
f(n) = f(n-1) + (the product of the nonzero digits of f(n-1))
f(0) = x, dengan xbilangan bulat positif apa pun, yang ditulis dalam basis 10.

Jadi, dimulai dengan f(0)=1, Anda mendapatkan urutan berikut
1, 2, 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, ...

Sejauh ini standar. Properti menarik ikut bermain ketika Anda mengambil bilangan bulat lainnya sebagai titik awal, akhirnya urutan menyatu menjadi titik di sepanjang x=1urutan di atas . Misalnya, mulai dengan x=3hasil
3, 6, 12, 14, 18, 26, 38, 62, 74, 102, ...

Berikut adalah beberapa urutan lainnya, masing-masing ditampilkan hanya sampai mencapai 102:

5, 10, 11, 12, 14, 18, 26, 38, 62, 74, 102, ...
7, 14, 18, 26, 38, 62, 74, 102, ...
9, 18, 26, 38, 62, 74, 102, ...
13, 16, 22, 26, 38, 62, 74, 102, ...
15, 20, 22, 26, 38, 62, 74, 102, ...
17, 24, 32, 38, 62, 74, 102, ...
19, 28, 44, 60, 66, 102, ...

Dia menduga, dan secara empiris membuktikan x=1,000,000, bahwa properti ini (yaitu, bahwa semua nomor input menyatu dengan urutan yang sama) berlaku.

Tantangan

Diberikan integer input positif 0 < x < 1,000,000, output angka di mana f(x)urutan konvergen ke f(1)urutan. Misalnya, untuk x=5, ini akan menjadi 26, karena itu adalah angka pertama yang sama untuk kedua urutan.

 x output
 1 1
 5 26
19 102
63 150056

Aturan

  • Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber

Jawaban:

5

JavaScript (ES6), 81 67 byte

Disimpan 1 byte berkat @ l4m2

f=(n,x=1)=>x<n?f(x,n):x>n?f(+[...n+''].reduce((p,i)=>p*i||p)+n,x):n

Cobalah online!

Berkomentar

f = (n,                   // n = current value for the 1st sequence, initialized to input
        x = 1) =>         // x = current value for the 2nd sequence, initialized to 1
  x < n ?                 // if x is less than n:
    f(x, n)               //   swap the sequences by doing a recursive call to f(x, n)
  :                       // else:
    x > n ?               //   if x is greater than n:
      f(                  //     do a recursive call with the next term of the 1st sequence:
        +[...n + '']      //       coerce n to a string and split it
        .reduce((p, i) => //       for each digit i in n:
          p * i || p      //         multiply p by i, or let p unchanged if i is zero
        ) + n,            //       end of reduce(); add n to the result
        x                 //       let x unchanged
      )                   //     end of recursive call
    :                     //   else:
      n                   //     return n
Arnauld
sumber
`` `` f = (n, x = 1) => x <n? f (x, n): x> n? f (+ [... n + '']. kurangi ((p, i) = > p * i || p) + n, x): n `` ``
l4m2
4

Jelly , 18 14 byte

ḊḢDo1P+Ʋ;µQƑ¿Ḣ

Input adalah array tunggal.

Cobalah online!

Bagaimana itu bekerja

ḊḢDo1P+Ʋ;µQƑ¿Ḣ  Main link. Argument: [n]

            ¿   While...
          QƑ      all elements of the return value are unique...
         µ          execute the chain to the left.
Ḋ                     Dequeue; remove the first item.
 Ḣ                    Head; extract the first item.
                      This yields the second item of the return value if it has
                      at least two elements, 0 otherwise.
       Ʋ              Combine the links to the left into a chain.
  D                     Take the decimal digits of the second item.
   o1                   Perform logical OR with 1, replacing 0's with 1's.
     P                  Take the product.
      +                 Add the product with the second item.
        ;             Prepend the result to the previous return value.
             Ḣ  Head; extract the first item.
Dennis
sumber
2

Python 2 , 111 95 93 byte

Menggunakan unpacking in replace(*'01')seperti pada @Rod answer
-18 bytes berkat @Lynn

l=[1,input()]
while cmp(*l):l[0]+=eval('*'.join(`l[0]`.replace(*'01')));l.sort()
print l[0]  

Cobalah online!

Possum Mati
sumber
1
Ah, dan kondisi loop while cmp(*l)juga bisa!
Lynn
@ Lynn Ya! Terima kasih lagi
Dead Possum
2

Haskell , 65 byte

(!1)
a!b|a>b=b!a|a<b=(a+product[read[d]|d<-show a,d>'0'])!b|1<2=a

Cobalah online!

Lynn
sumber
2

Python 2 , 78 byte

f=lambda a,b=1:a*(a==b)or f(*sorted([a+eval('*'.join(`a`.replace(*'01'))),b]))

Cobalah online!

Lynn
sumber
Saya sedang mengerjakan solusi dengan lambda, tetapi macet dengan shortcircuting selama beberapa menit, pekerjaan yang baik!
Dead Possum
2

Sekam , 13 byte

→UΞm¡S+ȯΠf±dΘ

Mengambil input sebagai daftar tunggal.

Cobalah online!

Penjelasan

                 Implicit input, e.g 5
            Θ    Prepend a zero to get  [0,5]
   m             Map the following over [0,5]
    ¡              Iteratatively apply the following function, collecting the return values in a list
           d         Convert to a list of digits
         f±          keep only the truthy ones
       ȯΠ            then take the product
     S+              add that to the original number
                After this map, we have [[0,1,2,4,8,16,22,26,38,62...],[5,10,11,12,14,18,26,38,62,74...]]
  Ξ             Merge the sorted lists:  [0,1,2,4,5,8,10,11,12,14,16,18,22,26,26,38,38,62,62,74...]
 U              Take the longest unique prefix: [0,1,2,4,5,8,10,11,12,14,16,18,22,26]
→               Get the last element and implicitely output: 26
H.Piz
sumber
1

Python 3 , 126 125 byte

m=[1]
n=[int(input())]
while not{*m}&{*n}:
 for l in m,n:l+=l[-1]+eval('*'.join(str(l[-1]).replace(*'01'))),
print({*m}&{*n})

Cobalah online!

Ambil input sebagai string

tongkat
sumber
1

Java (JDK 10) , 99 byte

n->{for(int x=1;x!=n;n+=(""+n).chars().reduce(1,(a,b)->a*(b>48?b-48:1)))x^=x<n?n^(n=x):0;return n;}

Cobalah online!

Sebagian besar merupakan port iteratif dari jawaban JavaScript Arnauld , jadi ikutilah dia!

Olivier Grégoire
sumber
0

J , 50 byte

definisi fungsi gaya diam-diam

[:{.@(e.~#])/[:(+[:*/@(*#])(#~10)&#:)^:(<453)"0,&1

jika argumen (katakanlah 63) disisipkan ke dalam ekspresi REPL itu bisa menjadi 45 misalnya

{.(e.~#])/(+[:*/@(*#])(#~10)&#:)^:(<453)"0]1,63
  • ,&1 tambahkan 1 untuk menghasilkan urutan pencarian serta urutan argumen
  • ^:(<453)"0 iterates masing-masing sampai 1mio tercapai dalam urutan 1
  • + [: */@(*#]) (#~10)&#: garpu menambah kait yang melakukan produk digit
  • (e.~ # ])/ menggunakan item berulang jika ada untuk mendapatkan persimpangan daftar
  • {. hanya mengembalikan nilai umum pertama

Cobalah online!

jayprich
sumber
0

R , 110 86 byte

o=c(1,1:9);o=o%o%o%o%o;o=c(o%o%o)
x=c(1,n);while((x=sort(x))<x[2])x[1]=(x+o[x+1])[1]
x

TIO

versi sebelumnya 110:

f=function(x){if((x[1]=x[1]+(c((y=(y=c(1,1:9))%o%y%o%y)%o%y))[x[1]+1])==x[2]){x[1]}else{f(sort(x))}}
f(c(1,n))

TIO

jayprich
sumber