ลำดับผลิตภัณฑ์หลัก


22

นี่เป็นลำดับที่น่าสนใจที่ค้นพบโดย Paul Loomis นักคณิตศาสตร์จาก Bloomsburg University จากหน้าของเขาในลำดับนี้:

กำหนด
f(n) = f(n-1) + (the product of the nonzero digits of f(n-1))
f(0) = xด้วยxจำนวนเต็มบวกใด ๆ ที่เขียนในฐาน 10

ดังนั้นเริ่มต้นด้วยf(0)=1คุณจะได้รับลำดับต่อไปนี้
1, 2, 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, ...

จนถึงมาตรฐานดังนั้น คุณสมบัติที่น่าสนใจเข้ามาเมื่อคุณใช้จำนวนเต็มอื่น ๆเป็นจุดเริ่มต้นในที่สุดลำดับก็มาบรรจบกันเป็นจุดตามx=1ลำดับข้างต้น ตัวอย่างเช่นเริ่มต้นด้วยx=3อัตราผลตอบแทน
3, 6, 12, 14, 18, 26, 38, 62, 74, 102, ...

นี่คือบางส่วนลำดับขึ้นแต่ละแสดงเฉพาะจนกว่าจะถึง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, ...

เขาคาดเดาและพิสูจน์ประจักษ์ถึงx=1,000,000ว่าคุณสมบัตินี้ (เช่นว่าตัวเลขทั้งหมดเข้ามาบรรจบกันในลำดับเดียวกัน) ถือเป็นจริง

ความท้าทาย

ได้รับจำนวนเต็มบวกเข้า0 < x < 1,000,000ส่งออกจำนวนที่f(x)ลำดับบรรจบกับf(1)ลำดับ ตัวอย่างเช่นสำหรับx=5นี่จะเป็น26เพราะนั่นเป็นหมายเลขแรกที่เหมือนกันสำหรับทั้งสองลำดับ

 x output
 1 1
 5 26
19 102
63 150056

กฎระเบียบ

  • หากเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาท์พุตจะพอดีกับภาษาของคุณ Integer
  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

คำตอบ:


5

JavaScript (ES6), 81 67 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @ l4m2

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

ลองออนไลน์!

แสดงความคิดเห็น

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

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

4

เยลลี่ , 18 14 ไบต์

ḊḢDo1P+Ʋ;µQƑ¿Ḣ

อินพุตเป็นอาร์เรย์เดี่ยว

ลองออนไลน์!

มันทำงานอย่างไร

ḊḢ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.

2

Python 2 , 111 95 93 ไบต์

การใช้การคลายออกในreplace(*'01')เช่นเดียวกับใน @Rod คำตอบ
-18 ไบต์ขอบคุณ @Lynn

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

ลองออนไลน์!


1
อาและเงื่อนไขของวงก็เป็นได้while cmp(*l)เช่นกัน!
ลินน์

@ ลินน์ใช่! ขอขอบคุณอีกครั้ง
Dead Possum



2

Husk , 13 ไบต์

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

รับอินพุตเป็นรายการเดี่ยว

ลองออนไลน์!

คำอธิบาย

                 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




0

J , 50 ไบต์

นิยามฟังก์ชั่นสไตล์โดยปริยาย

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

ถ้าอาร์กิวเมนต์ (บอกว่า 63) ถูกวางลงในนิพจน์ REPL อาจเป็น 45 เช่น

{.(e.~#])/(+[:*/@(*#])(#~10)&#:)^:(<453)"0]1,63
  • ,&1 ผนวก 1 เพื่อสร้างลำดับการค้นหาเช่นเดียวกับลำดับของอาร์กิวเมนต์
  • ^:(<453)"0 ทำซ้ำแต่ละจนกว่าจะถึง 1mio ในลำดับของ 1
  • + [: */@(*#]) (#~10)&#: fork เพิ่มลงใน hook ซึ่งทำผลคูณของตัวเลข
  • (e.~ # ])/ ใช้รายการซ้ำหากมีเพื่อแยกรายการ
  • {. ส่งคืนเฉพาะค่าทั่วไปแรก

ลองออนไลน์!


0

R , 110 86 ไบต์

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

รุ่นก่อนหน้า 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.