Số ngũ giác được làm từ số ngũ giác


15

Giới thiệu

Một số ngũ giác ( A000326 ) được tạo bởi công thức P n = 0,5 × (3n 2 -n) . Hoặc bạn chỉ có thể đếm số lượng dấu chấm được sử dụng:

nhập mô tả hình ảnh ở đây

Bạn có thể sử dụng công thức hoặc gif ở trên để tìm một vài số ngũ giác đầu tiên:

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

Tiếp theo, chúng ta cần tính tổng x số liên tiếp.

Ví dụ: nếu x = 4 , chúng ta cần xem P n + P n + 1 + P n + 2 + P n + 3 (bao gồm 4 số hạng ). Nếu tổng các số ngũ giác cũng là một số ngũ giác, chúng ta sẽ gọi đây là số ngũ giác .

Với x = 4 , số ngũ giác nhỏ nhất là ngũ giác 330được tạo bởi 4 số ngũ giác liên tiếp : 51, 70, 92, 117. Vì vậy, khi đầu vào là 4, chương trình chức năng của bạn sẽ xuất ra 330.


Bài tập

  • Khi cho một số nguyên lớn hơn 1, xuất ra số ngũ giác nhỏ nhất hình ngũ giác.
  • Bạn có thể cung cấp một chức năng hoặc một chương trình.
  • Lưu ý: Không có giải pháp nào cho ví dụ x = 3 . Điều này có nghĩa là nếu một số không thể được tạo từ 10000 số ngũ giác đầu tiên, bạn phải ngừng tính toán và xuất ra bất cứ thứ gì phù hợp nhất với bạn.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Các trường hợp thử nghiệm:

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: ?

Ngoài ra số lượng lớn hơn có thể được đưa ra:

Input: 37
Output: 32782

Input: 55
Output: 71349465

Input: 71
Output: 24565290

4
IMO thật điên rồ khi xử phạt bất cứ ai đưa ra giải pháp phân tích có thể giải quyết các trường hợp khó hơn bằng cách yêu cầu họ kiểm tra xem giải pháp đó có ít hơn không10001-x
Peter Taylor

1
@PeterTaylor Với những trường hợp khó hơn bạn muốn nói x = 3, mà không có giải pháp?
Ad Nam

4
Trường hợp thử nghiệm lớn nhất mang lại kết quả: 9919->496458299155
Martin Ender

Không, ý tôi là các trường hợp có giải pháp nhưng sử dụng các số ngũ giác lớn hơn trong tổng.
Peter Taylor

1
Tôi không chắc chắn về giới hạn 10.000: Các số xây dựng tổng có phải đến từ 10.000 số ngũ giác đầu tiên, nhưng không phải là tổng của chính nó, hay tổng số cũng nằm trong 10.000 đầu tiên?
nimi

Câu trả lời:


4

CJam, 29 byte

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

Hãy thử trực tuyến.

Mất vài giây để chạy.

Giải trình

Đầu tiên, chúng ta cần kiểm tra có bao nhiêu số ngũ giác mà chúng ta cần coi là tổng tiền tiềm năng. Tổng của 10.000 số ngũ giác đầu tiên là 500050000000. Số ngũ giác đầu tiên lớn hơn số đó là 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.

Tôi đã sử dụng một chương trình sửa đổi một chút để tìm các đầu vào lớn nhất mang lại giải pháp không trống. Đây là tất cả các giải pháp cho đầu vào lớn hơn 9.000:

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

4

Lua, 142 byte

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

Ung dung

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 cho đảo ngược bảng!

Cập nhật 142 byte: Đã lưu 10 byte bằng cách loại bỏ lệnh gọi hàm 'tonumber' thừa.


3

Haskell, 109 byte

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)

Trả về 0nếu không có số ngũ giác ngũ giác.

Ví dụ sử dụng (mất một chút thời gian để hoàn thành): map (#take(10^4)p) [1..10]-> [1,1926,0,330,44290,651,287,0,12105,0].

Đó ít nhiều là một triển khai trực tiếp của định nghĩa: nếu tổng các xphần tử đầu tiên có trong danh sách, hãy xuất nó, nếu không hãy thử lại với phần đuôi của danh sách. Bắt đầu với 10.000 số ngũ giác đầu tiên, dừng và trả về 0nếu danh sách có ít hơn xcác phần tử.


3

PARI / GP, 71 byte

Tôi thích ispolygonalchức năng trong 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 byte

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

Điều này đảo ngược định nghĩa của một số ngũ giác; if P (n) = (3n ^ 2-n) / 2, thì P đã cho sẽ là số ngũ giác iff (1 + sqrt (24 * P + 1)) / 6 là một số nguyên. (Về mặt kỹ thuật, nó cũng nên xem (1-sqrt (24 * P + 1)) / 6, nhưng điều đó luôn luôn là âm.) Cũng sử dụng khoảng trắng và tab làm hai mức thụt đầu dòng khác nhau, như được đề xuất ở đây . Điều này không tạo ra bất cứ điều gì nếu nó không thể tìm thấy một số ngũ giác ngũ giác; Tôi tin là ổn chứ?

Tôi tin tưởng mạnh mẽ rằng ai đó thông minh hơn tôi có thể tìm cách rút ngắn điều này hơn nữa, có lẽ là xung quanh vòng lặp for.


2

LabVIEW, 39 LabVIEW Nguyên thủy

Không có gif của nó chạy lần này.

Nút toán học trong vòng lặp tạo ra một mảng của tất cả các số. Lấy mảng con, thêm các phần tử, tìm kiếm số đó, nếu tìm thấy lấy chỉ mục và vòng lặp dừng.

Một đầu vào không hợp lệ đưa ra số ngũ giác cao nhất.


2

R, 114 100 byte

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])

không có ý thức

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

Thạch , 30 byte

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

Mã này hoạt động với phiên bản Jelly này và tương đương với mã nhị phân sau:

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

Nó là của xa để làm chậm và bộ nhớ đói cho người phiên dịch trực tuyến, vì nó kiểm tra 150.000.000 đầu tiên cho pentagonality (149.995.000 sẽ xảy ra là 10.000 ngày số ngũ giác ).

Bằng cách rút ngắn phạm vi thành một cái gì đó hợp lý hơn, bạn có thể dùng thử trực tuyến!cho đầu vào đủ nhỏ.

Ý tưởng

Một kết quả đã biết về các số ngũ giác là x là ngũ giác khi và chỉ khi sqrt (24x + 1) - 1 chia hết cho 6 .

Thay vì tính toán 10.000 số ngũ giác đầu tiên, chúng tôi xác định một liên kết trợ giúp loại bỏ các số không phải ngũ giác khỏi một mảng nhất định. Tại sao? Bởi vì phiên bản mới nhất của Jelly có trước thử thách này không có cách nào để cắt ngang danh sách ...

×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.

Jelly, 21 byte (không cạnh tranh)

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

Phiên bản mới nhất của Jelly có hai tính năng mới (các lát chồng chéo và lọc / giao cắt danh sách) và sửa lỗi, cho phép số byte thấp hơn nhiều.

Mã này hoạt động tốt trên máy tính để bàn của tôi, nhưng nó hơi chậm để giới hạn thời gian của TIO. Để thử trực tuyến! (đối với đầu vào đủ nhỏ), chúng ta phải giảm phạm vi ban đầu một lần nữa.

Làm thế nào nó hoạt động

ȷ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.

2

Toán học 85 byte

n=577380;Intersection[#(3#-1)/2&/@Range@n,Table[#((#-1)^2+x(3#-4+3x))/2,{x,n}]][[1]]&

tìm kiếm nhanh chóng lên đến P 10 4 .


0

Tiên đề, 157 byte

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)

vô dụng và kết quả

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: Chúng ta có thể tìm thấy n bằng cách sử dụng kết quả "a", xem bên dưới

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

[sử dụng 1 + sqrt (...) vì n> 0]

Điều này có nghĩa là nếu tồn tại một n0 sao cho

p(n0)=a 

hơn

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

Tuy nhiên, chúng ta phải chứng minh rằng p (n0) = a để chắc chắn (vì không phải lúc nào cũng như vậy)

Nhưng mẹo chính sẽ là tổng hợp

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

chỉ khi bắt đầu và tìm tổng số phần tử x tiếp theo bằng cách sử dụng

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

và v.v. đối với các khoản tiền khác (sử dụng ở trên trong câu lệnh a: = a + p (j + x) -p (j)). Điều này có nghĩa là không cần thiết một số x phần tử tổng trong vòng lặp ... ..



0

Javascript 93 byte

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))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.