五角形の数字から作られた五角形の数字


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 n + 1 + P n + 2 + P n + 34つの用語で構成される)を調べる必要があります。五角形の数の合計も五角形の数である場合、これを五角形の五角形の数と呼びます。

ためX = 4、最小五角形五角形の数である330から作られた、4つの連続五角数:51, 70, 92, 117。したがって、入力がの場合、4関数のプログラムはoutputになります330


仕事

  • 1より大きい整数を指定すると、最小の五角形五角形番号を出力します。
  • 機能またはプログラムを提供できます。
  • 注:たとえば、x = 3の解決策はありません。これは、最初の10000五角形の数字から数字を作成できない場合、計算を停止し、最適なものを出力する必要があることを意味します。
  • これはであるため、バイト数が最小の提出が勝ちです!

テストケース:

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
ピーター・テイラー

1
@PeterTaylorより困難なケースx = 3では、解決策がないというような意味ですか?
アドナン

4
結果を生成する最大のテストケース:9919->496458299155
Martin Ender

いいえ、解決策はあるが、合計でより大きな五角形の数字を使用する場合を意味します。
ピーターテイラー

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

非ゴルフ

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

テーブルを反転するためのイェーイ!

更新142バイト:余分な「tonumber」関数呼び出しを削除して10バイトを保存しました。


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バイト

ispolygonalPARI / 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の場合、(1 + sqrt(24 * P + 1))/ 6が整数の場合、特定のPは五角形の数値になります。(技術的に、それはまた、(1-SQRT(24 * P + 1)をご覧ください)/ 6が、それは常に負であるべきである。)示唆されるようにまた、2つの異なるインデントレベルとしてスペースとタブを使用してここに。五角形の五角形の番号が見つからない場合、これは何も出力しません。大丈夫ですか?

私よりも賢い人が、おそらくforループの周りでこれをさらに短縮する方法を見つけることができると強く信じています。


2

LabVIEW、39 LabVIEWプリミティブ

今回実行中のgifはありません。

ループ内の演算ノードは、すべての数値の配列を作成します。サブアレイを取得し、要素を追加し、その番号を検索します(見つかった場合はインデックスを取得し、ループを停止します)。

無効な入力は、最高の五角形の数字を出力します。


2

R、114100バイト

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

なし(ちょっと)

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の五角形(149,995,000が10,000 番目の五角形の数字である)をチェックするため、オンラインインタープリターの速度は遅くなり、メモリを大量に消費します。

範囲をより適切なものに短縮することで、オンラインで試すことができます!十分に小さい入力用。

考え

五角形の数値に関する既知の結果は、sqrt(24x + 1)-16で割り切れる場合に限り、xが五角形であるということです。

最初の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の最新バージョンには、2つの新しい機能(オーバーラップスライスとリストフィルタリング/交差)とバグ修正があり、バイト数を大幅に削減できます。

このコードは私のデスクトップコンピューターでは問題なく動作しますが、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.

2

Mathematica 85バイト

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

P 10 4までのクイック検索を実行し ます。


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:結果「a」を使用してnを見つけることができます。以下を参照してください

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

[n> 0であるため1 + sqrt(...)を使用]

これは、1つの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)で上記を使用)。これは、ループ内で1つの数値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.