ตัวเลขห้าเหลี่ยมทำจากตัวเลขห้าเหลี่ยม


15

บทนำ

จำนวนห้าเหลี่ยม ( A000326 ) ถูกสร้างขึ้นโดยสูตรP n = 0.5 × (3n 2 -n) หรือคุณสามารถนับจำนวนจุดที่ใช้:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถใช้สูตรหรือ gif ด้านบนเพื่อค้นหาตัวเลขห้าเหลี่ยมสองสามตัวแรก:

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, 176, 210, 247, 287, 330, 376, 425, 477, etc...

ต่อไปเราจำเป็นต้องคำนวณผลรวมของตัวเลขที่ต่อเนื่องกันx

ตัวอย่างเช่นถ้าx = 4เราต้องมองไปที่ P n + P 1 + n + P n + 2 + P n + 3 (ซึ่งประกอบด้วย4เทอม) หากผลรวมของรูปห้าเหลี่ยมเป็นจำนวนห้าเหลี่ยมเราจะเรียกมันว่าเป็นรูปห้าเหลี่ยมรูปห้าเหลี่ยมห้าเหลี่ยมจำนวนเพนตากอน

สำหรับx = 4จำนวนที่เล็กที่สุดห้าเหลี่ยมเหลี่ยมเป็น330ที่ทำจาก451, 70, 92, 117หมายเลขห้าเหลี่ยมติดต่อกัน: ดังนั้นเมื่อเข้าเป็นโปรแกรมที่คุณควรฟังก์ชั่นการส่งออก4330


งาน

  • เมื่อกำหนดจำนวนเต็มมากกว่า 1 ให้ส่งห้าเหลี่ยมห้าเหลี่ยมที่เล็กที่สุด
  • คุณอาจมีฟังก์ชั่นหรือโปรแกรม
  • หมายเหตุ:มีโซลูชั่นสำหรับเช่นไม่มีx = 3 ซึ่งหมายความว่าหากไม่สามารถสร้างตัวเลขห้าเหลี่ยม 10,000 ตำแหน่งแรกคุณจะต้องหยุดการคำนวณและส่งออกสิ่งที่เหมาะสมที่สุดสำหรับคุณ
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

กรณีทดสอบ:

Input: 2
Output: 1926 (which comes from 925, 1001)

Input: 3
Output: ?

Input: 4
Output: 330 (which comes from 51, 70, 92, 117)

Input: 5
Output: 44290 (which comes from 8400, 8626, 8855, 9087, 9322)

Input: 6
Output: 651 (which comes from 51, 70, 92, 117, 145, 176)

Input: 7
Output: 287 (which comes from 5, 12, 22, 35, 51, 70, 92)

Input: 8
Output: ?

Input: 9
Output: 12105 (which comes from 1001, 1080, 1162, 1247, 1335, 1426, 1520, 1617, 1717)

Input: 10
Output: ?

ด้วยจำนวนที่มากขึ้นจะได้รับ:

Input: 37
Output: 32782

Input: 55
Output: 71349465

Input: 71
Output: 24565290

4
IMO มันบ้าที่จะลงโทษใครก็ตามที่เกิดขึ้นกับโซลูชันการวิเคราะห์ซึ่งสามารถแก้ไขกรณีที่ยากขึ้นโดยกำหนดให้พวกเขาตรวจสอบว่าโซลูชันนั้นน้อยกว่าหรือไม่10001-x
Peter Taylor

1
@PeterTaylor ด้วยกรณีที่ยากกว่าที่คุณหมายถึงชอบx = 3ซึ่งไม่มีทางออก?
Adnan

4
กรณีทดสอบที่ใหญ่ที่สุดที่ให้ผลลัพธ์: 9919->496458299155
Martin Ender

ไม่ฉันหมายถึงกรณีที่มีวิธีแก้ปัญหา แต่ใช้จำนวนห้าเหลี่ยมขนาดใหญ่กว่าในผลรวม
Peter Taylor

1
ฉันไม่แน่ใจเกี่ยวกับขีด จำกัด 10,000: ตัวเลขที่สร้างผลรวมต้องมาจาก 10,000 รูปห้าเหลี่ยมแรก แต่ไม่ใช่ผลรวมเองหรือมีผลรวมอยู่ใน 10,000 อันดับแรกหรือไม่
nimi

คำตอบ:


4

CJam, 29 ไบต์

6e5{)_3*(*2/}%_A4#<riew::+&1<

ลองออนไลน์

ใช้เวลาสองสามวินาทีในการทำงาน

คำอธิบาย

ก่อนอื่นเราต้องตรวจสอบว่าเราต้องพิจารณาว่ามีจำนวนห้าเหลี่ยมจำนวนเท่าไหร่ ผลรวมของแรก 10,000 500050000000หมายเลขห้าเหลี่ยมเป็น ตัวเลขห้าเหลี่ยมแรกที่มากกว่านั้นคือ 577,380

6e5       e# 600,000 (a short number that's a bit bigger than we need).
{         e# Map this block onto every number from 0 to 599,999...
  )       e#   Increment.
  _3*(*2/ e#   Apply the pentagonal number formula given in the challenge.
}%
_         e# Make a copy.
A4#<      e# Truncate to the first 10,000 elements.
ri        e# Read input and convert to integer.
ew        e# Get sublists of that length.
::+       e# Sum each sublist.
&         e# Set intersection with all 600k pentagonal numbers computed earlier.
1<        e# Truncate to the first result.

ฉันใช้โปรแกรมที่ปรับเปลี่ยนเล็กน้อยเพื่อค้นหาอินพุตที่ใหญ่ที่สุดซึ่งให้โซลูชันที่ไม่ว่างเปล่า นี่คือโซลูชั่นทั้งหมดสำหรับอินพุตมากกว่า 9,000 รายการ:

9919 -> 496458299155
9577 -> 446991927537
9499 -> 455533474060
9241 -> 401702906276
9017 -> 429351677617

4

Lua, 142 ไบต์

p={}o={}n=...for i=1,10^4 do p[i]=(3*i^2-i)/2o[p[i]]=1 end for i=0,10^4-n do s=0 for j=1,n do s=s+p[i+j]end if(o[s])then print(s)break end end

Ungolfed

p={}o={}n=tonumber(...)
for i=1,10^4 do 
    p[i]=(3*i^2-i)/2o[p[i]]=1 
end
for i=0,10^4-n do 
    s=0 
    for j=1,n do 
        s=s+p[i+j]
    end 
    if(o[s])then 
        print(s)
        break 
    end 
end

Yay สำหรับการกลับตาราง!

อัปเดต 142 ไบต์:บันทึก 10 ไบต์โดยลบการเรียกฟังก์ชั่นฟุ่มเฟือย 'tonumber'


3

Haskell, 109 ไบต์

p=map(\n->div(3*n^2-n)2)[1..10^7]
(%)=(sum.).take
x#l|length l<x=0|elem(x%l)p=x%l|1<2=x#tail l
(#take(10^4)p)

ผลตอบแทน 0ถ้าไม่มีเลขห้าเหลี่ยมรูปห้าเหลี่ยม

ตัวอย่างการใช้งาน (ใช้เวลาในการจบ): ->map (#take(10^4)p) [1..10][1,1926,0,330,44290,651,287,0,12105,0]

เป็นการใช้คำจำกัดความโดยตรงมากขึ้นหรือน้อยลง: หากผลรวมของxองค์ประกอบแรกอยู่ในรายการให้เอาท์พุทออกมาหรือลองอีกครั้งด้วยหางของรายการ เริ่มต้นด้วยตัวเลขห้าเหลี่ยม 10,000 ตัวแรกหยุดและส่งคืน0หากรายการมีxองค์ประกอบน้อยกว่า


3

PARI / GP, 71 ไบต์

ฉันชอบispolygonalฟังก์ชั่นใน PARI / GP

x->[p|p<-vector(10^4,i,sum(n=i,i+x-1,(3*n^2-n)/2)),ispolygonal(p,5)][1]

3

Python 3, 144 ไบต์

R,P=range,list(map(lambda n:(3*n*n-n)/2,R(1,10001)))
def F(X):
 for a in R(0,len(P)-X):
    S=sum(P[a:a+X])
    if(1+(1+24*S)**.5)%6==0:print(S);break

นี่กลับคำจำกัดความของตัวเลขห้าเหลี่ยม; ถ้า P (n) = (3n ^ 2-n) / 2 ดังนั้น P ที่ระบุจะเป็นตัวเลขห้าเหลี่ยม iff (1 + sqrt (24 * P + 1)) / 6 เป็นจำนวนเต็ม (เทคนิคก็ควรดูที่ (1-sqrt (24 * P + 1)) / 6 แต่ที่ควรจะเป็นเชิงลบ.) นอกจากนี้ยังใช้ช่องว่างและแท็บเป็นสองระดับเยื้องที่แตกต่างกันตามที่แนะนำที่นี่ นี่จะไม่แสดงผลลัพธ์ใด ๆ หากไม่พบหมายเลขห้าเหลี่ยมห้าเหลี่ยม ฉันเชื่อว่าไม่เป็นไร

ฉันเชื่อมั่นอย่างยิ่งว่าใครบางคนที่ฉลาดกว่าที่ฉันสามารถหาวิธีที่จะย่อขนาดนี้ให้สั้นลง


2

LabVIEW, 39 LabVIEW Primitives

ไม่มี gif ของมันทำงานในเวลานี้

โหนดคณิตศาสตร์ในวงสร้างอาร์เรย์ของตัวเลขทั้งหมด ใช้ Sub-array, เพิ่มองค์ประกอบ, ค้นหาหมายเลขนั้น, หากพบ take index และ stop loop

อินพุตที่ไม่ถูกต้องจะใส่ตัวเลขห้าเหลี่ยมที่สูงที่สุด


2

R, 114 100 ไบต์

k=.5*(3*(t=1:1e6)^2-t);z=1;for(i in 1:(1e4-(n=scan()-1)))z[i]=sum(k[i:(i+n)]);cat(intersect(k,z)[1])

ungolfed (ใจ)

k=.5*(3*(t=1:1e6)^2-t)                 # map all pentagon numbers up to 1e6
z=1                                    # create a vector
for(i in 1:(1e4-(n=scan()-1))){        # from 1 to 10.000 - n loop
  z[i]=sum(k[i:(i+n)])}                # get the sum of all pentagon numbers i:(i+n)
cat(intersect(k,z)[1])                 # see which sums is a pentagon number itself, plot the first

2

เยลลี่ 30 ไบต์

×24‘½‘%6¬Oị
15ȷ7RÇṫ³R$zȷ.5ZSÇḢ

รหัสนี้ใช้ได้กับJelly เวอร์ชันนี้และเทียบเท่ากับรหัสไบนารี่ต่อไปนี้:

0000000: 94 32 34 b2 90 b2 25 36 87 4f b1 0a 31 35 a0  .24...%6.O..15.
000000f: 37 52 92 ad 8b 52 24 7a a0 2e 35 5a 53 92 a6  7R...R$z..5ZS..

มันคือไกลโดยที่จะชะลอตัวและหน่วยความจำหิวสำหรับล่ามออนไลน์เพราะมันตรวจสอบครั้งแรก 150,000,000 สำหรับ pentagonality (149,995,000 เกิดขึ้นเป็น 10,000 THจำนวนห้าเหลี่ยม)

คุณสามารถลองออนไลน์ได้! สำหรับอินพุตที่มีขนาดเล็ก

ความคิด

ผลที่รู้จักกันเกี่ยวกับตัวเลขห้าเหลี่ยมคือว่าxเป็นเหลี่ยมและถ้าหากsqrt (24x + 1) - 1หารด้วย6

แทนที่จะคำนวณตัวเลขห้าเหลี่ยม 10,000 ตัวแรกเรากำหนดลิงก์ผู้ช่วยเหลือที่ลบตัวเลขที่ไม่ใช่รูปห้าเหลี่ยมออกจากอาร์เรย์ที่กำหนด ทำไม? เนื่องจากเวอร์ชั่นล่าสุดของ Jelly ที่มาก่อนการท้าทายนี้ไม่มีทางที่จะแยกรายการ ...

รหัส

×24‘½‘%6¬Oị  Define the aforementioned helper link. Left argument: a (list)

×24          Multiply each list item by 24.
   ‘         Increment each product.
    ½        Apply square root to each result.
     ’       Decrement each square root.
      %6     Compute all remainders of division by 6.
        ¬    Apply logical NOT.
         O   Get the indices of ones.
          ị  Hook; get the elements of a at those indices.

15ȷ7RÇṫ³R$zȷ.5ZSÇḢ  Define the main link. Input: x

15ȷ7R               Yields [1, ..., 1.5e8].
     Ç              Apply the helper link; keep only pentagonal numbers.
       ³R$          Yield r = [1, ..., x].
      ṫ             Remove the first y-1 pentagonal numbers for each y in r.
          zȷ.5      Transpose the resulting array, padding with sqrt(10).
              Z     Transpose once more. The shifted lists have now been padded.
                    This makes sure incomplete sums (i.e., of less than x
                    pentagonal numbers) will not be integers.
               S    Compute all sums.
                Ç   Apply the helper link once more.
                 Ḣ  Select the first match, if any.

เยลลี่, 21 ไบต์ (ไม่แข่งขัน)

ȷ6Rµ²×3_¹Hµḣȷ4ṡ³ZSf¹Ḣ

เวอร์ชันล่าสุดของ Jelly มีคุณสมบัติใหม่สองอย่าง (การซ้อนทับชิ้นและและการกรอง / การแยกรายการ) และการแก้ไขข้อบกพร่องซึ่งช่วยให้นับไบต์ที่ต่ำกว่ามาก

รหัสนี้ทำงานได้ดีบนคอมพิวเตอร์เดสก์ท็อปของฉัน แต่มันช้าไปหน่อยสำหรับการ จำกัด เวลาของ TIO เพื่อลองออนไลน์! (สำหรับอินพุตที่มีขนาดเล็กเพียงพอ) เราต้องลดช่วงเริ่มต้นอีกครั้ง

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

ȷ6Rµ²×3_¹Hµḣȷ4ṡ³ZSf¹Ḣ  Input: x

ȷ6R                    Yield [1, ..., 1,000,000].
   µ                   Begin a new, monadic chain.
    ²                  Square each number in the range.
     ×3                Multiply the squares by 3.
       _¹              Subtract the numbers from the range.
         H             Halve each difference.
                       This yields the first 1,000,000 pentagonal numbers.
          µ            Begin a new, monadic chain.
           ḣȷ4         Keep only the first 10,000 pentagonal numbers.
              ṡ³       Yield all overlapping slices of length x.
                ZS     Transpose and sum. This computes the sum of each slice.
                  f¹   Filter; intersect with the long list of pentagonal numbers.
                    Ḣ  Select the first match, if any.


0

ความจริง 157 ไบต์

p(n)==(3*n*n-n)quo 2;f(x)==(a:=0;for i in 1..x repeat a:=a+p(i);for j in 1..10000 repeat(p(floor((1+sqrt(1.+24*a))/6)::INT)=a=>return a;a:=a+p(j+x)-p(j));-1)

ungolfed และผลลัพธ์

h(x:PI):INT==
   a:=0;for i in 1..x repeat a:=a+p(i) -- sum(p(i),i=1..x)
   for j in 1..10000 repeat
      p(floor((1+sqrt(1.+24*a))/6)::INT)=a=>return a
      a:=a+p(j+x)-p(j)
   -1

(5) -> [[i,f(i)] for i in 1..10]
   (5)
   [[1,1], [2,1926], [3,- 1], [4,330], [5,44290], [6,651], [7,287], [8,- 1],
    [9,12105], [10,- 1]]
                                                  Type: List List Integer

esplenation: เราสามารถหา n โดยใช้ผลลัพธ์ "a" ดูด้านล่าง

a=(3*n^2-n)/2 => 3*n^2-n-2*a=0 => n=floor((1+sqrt(1.+24*a))/6)::INT

[ใช้ 1 + sqrt (... ) เพราะ n> 0]

นี่หมายความว่าถ้ามี n0 อยู่หนึ่งตัว

p(n0)=a 

กว่า

n0=floor((1+sqrt(1.+24*a))/6)::INT

อีกต่อไปที่เราต้องพิสูจน์ว่า p (n0) = a เพื่อให้แน่ใจ (เพราะไม่เสมอไป)

แต่เคล็ดลับหลักจะทำผลรวม

a:=sum(p(i),i=1..x) [x elements sum] 

เมื่อเริ่มต้นเท่านั้นและค้นหาองค์ประกอบ x ถัดไปที่ใช้เพียงการรวมกัน

a=a+p(x+1)-p(1)=sum(p(i), i=2..x+1)

และอื่น ๆ สำหรับผลรวมอื่น ๆ (ใช้ด้านบนในคำสั่ง a: = a + p (j + x) -p (j)) ซึ่งหมายความว่าไม่จำเป็นต้องรวมองค์ประกอบหนึ่งจำนวน x ภายในลูป ......



0

Javascript 93 ไบต์

p=i=>i>0&&3*i*i-i>>1
f=(x,i=1,t=0)=>i<1e4?(24*(t+=p(i)-p(i-x))+1)**.5%6==5&i>x?t:f(x,i+1,t):0

console.log(f(4))
console.log(f(5))
console.log(f(6))
console.log(f(7))
console.log(f(8))
console.log(f(9919)==496458299155)
console.log(f(9577)==446991927537)
console.log(f(9499)==455533474060)
console.log(f(9241)==401702906276)
console.log(f(9017)==429351677617)
console.log(f(9))
console.log(f(10))

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