多角形の数字!


12

前書き

数学では、多角形の数は、通常の多角形の形状に配置された点または小石として表される数です。ドットはアルファ(単位)と見なされます。これらは、2次元の数字の1つのタイプです。

たとえば、番号10は三角形として配置できます。

*
**
***
****

ただし、10個を正方形として配置することはできません。一方、番号9は次のようになります。

***
***
***

36などのいくつかの数値は、正方形と三角形の両方として配置できます。

******  *
******  **
******  ***
******  ****
******  *****
******  ******

慣例により、1は任意の数の辺の最初の多角形番号です。ポリゴンを次のサイズに拡大するルールは、2つの隣接するアームを1ポイント拡張し、それらのポイント間に必要な余分な辺を追加することです。次の図では、追加の各レイヤーが赤で示されています。

三角数字:

三角数字

平方数:

平方数

五角形や六角形など、より多くの辺を持つ多角形もこの規則に従って構築できますが、ドットは上記のような完全に規則的な格子を形成しなくなります。

五角形の番号:

五角形の数字

六角形の番号:

六角形の数字

ソース: ウィキペディア

あなたのタスク

正の整数N(1 <= N <= 1000)を指定すると、すべてのタイプの多角形数Nを出力します多角形、三角形から20角形(20角。

たとえば、10という数値は三角形と10進数であるため、出力は次のようになります(独自の出力形式を選択できますが、次のようになります)。

3 10

テストケース

1 -> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 -> (None)
3 -> 3
6 -> 3 6
36 -> 3 4 13

参考のため、n-th k-gonal番号は次のとおりです。

(k-2)(n)(n-1)/ 2 + n

クレジット:xnor

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。


参考までに、nk番目の対角数は(k-2)*n*(n-1)/2 + nです。
-xnor

8
サンドボックスのポイントは、質問を改善することです。サンドボックスに質問を投稿し、質問の内容が明確でないことがわかった場合、正しい回答は、サンドボックスにコメントを追加せず、2時間待ってから、メインの未変更の質問に投稿して、サンドボックスの質問を削除することです、数千人未満の担当者から説明的なコメントを隠します。正しい応答は、言い換えを言い直すか、言い換えの提案を求め、さらに1日か2日与えて、言い換えられた質問にまだ問題があるかどうかを確認することです。
ピーターテイラー

回答:


2

Python 3、68バイト

lambda R:[s+2for s in range(1,19)if(s-2+(4+s*(s-4+8*R))**.5)/2%s==0]

潜在的な辺の数ごとにs+2、二次式を解きますR=s*n*(n-1)/2 + nn、結果が整数であるかどうかを確認するためにをます。

比較(73バイト):

lambda R:[s+2for s in range(1,19)if R in[n+s*n*~-n/2for n in range(R+1)]]

を解決する別のアプローチはs、Python 3で62バイトを与えますが、失敗しR=1ます。

lambda R:{(R-n)*2/n/~-n+2for n in range(2,R+1)}&{*range(3,21)}

1

JavaScript(ES6)、90バイト

n=>[...Array(21).keys(n--)].slice(3).filter(i=>(Math.sqrt(i*i+8*i*n-16*n)+i-4)%(i+i-4)==0)

二次方程式を解きます。Firefoxの新しい十分なバージョンで73バイト:

n=>[for(i of Array(18).keys())if(((~-i**2+8*n*-~i)**.5+~-i)/2%-~i==0)i+3]

1

> <>、62 + 3 = 65バイト

&1v
v0<;?)+8a:+1~~<
1.292:{<>+n}ao^
>:&:&=?^:&:&)?^:@:@$-{:}++

スタックの最上部での入力を想定しているため、-vフラグは+3バイトです。

> <>でのプログラミングは今回が初めてなので、コードを短くするためのいくつかの明らかなトリックを見逃しているかもしれません。

説明:

初期化

&1v
v0<
1

Nをレジスターに移動し、カウンターをスタックにプッシュし(1三角数字に対応するから開始)、値0とシーケンスでシーケンスを開始します1

メインループ

 :&:&=?^:&:&)?^:@:@$-{:}++

スタックの最上部とレジスタを比較します。等しい場合は、印刷ルーチンに進みます。大きい場合は、リセットルーチンに進みます。そうでない場合は、上位2つのスタックアイテムの差を取り、カウンターを追加して、前の上位スタックアイテムに追加します。これにより、次の多角形番号が計算されます。

印刷する

 .292:{<>+n}ao^
       ^

カウンター+ 2を出力し、その後に改行を続けて、リセットルーチンに移動します。

リセットする

v0<;?)+8a:+1~~<
1             ^

上の2つのスタックアイテムを削除し、カウンターをインクリメントします。カウンターが18より大きい場合はプログラムを終了します。そうでない場合は、開始番号01スタックにプッシュしてメインループに戻ります。


1

ゼリー、22バイト

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3

オンラインでお試しください!

説明

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3
18pȷ                   - All possible (k-2,n) pairs
    µ      µ€          - to each pair compute the corresponding polygonal number:
     Ḣ                 -   retrieve k-2
      ×’               -   multiply by n-1
        ×H             -   multiply by half of n
          +            -   add n
             _³        - subtract the input. There will now be 0's at (k-2,n) pairs which produce the input
               ¬FT     - retrieve all indices of 0's. The indices are now (k-2)*1000+n
                  :ȷ   - floor division by 1000, returning k-3
                    +3 - add 3 to get all possible k.

1

公理203バイト

 l(x)==(local q,m,a;v:List INT:=[];for i in 3..20 repeat(q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n);if #q>1 then(m:=rhs q.1;a:=rhs q.2;if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v)));v:=sort v;v)

ここに数字が表示されるゴルフやルーチンが少なくなります

 l(x)==
  local q,m,a
  v:List INT:=[]
  for i in 3..20 repeat 
     q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n)  -- this would find only rational solutions as r/s with r,s INT
     if #q>1 then -- if exist rational solution and denominator =1=> add to list of result
        m:=rhs q.1;a:=rhs q.2;
        if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v) 
  v:=sort v
  v

 (2) ->  [[i,l(i)]  for i in 1..45]
    Compiling function l with type PositiveInteger -> List Integer

    (2)
    [[1,[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]], [2,[]], [3,[3]],
     [4,[4]], [5,[5]], [6,[3,6]], [7,[7]], [8,[8]], [9,[4,9]], [10,[3,10]],
     [11,[11]], [12,[5,12]], [13,[13]], [14,[14]], [15,[3,6,15]], [16,[4,16]],
     [17,[17]], [18,[7,18]], [19,[19]], [20,[20]], [21,[3,8]], [22,[5]],
     [23,[]], [24,[9]], [25,[4]], [26,[]], [27,[10]], [28,[3,6]], [29,[]],
     [30,[11]], [31,[]], [32,[]], [33,[12]], [34,[7]], [35,[5]], [36,[3,4,13]],
     [37,[]], [38,[]], [39,[14]], [40,[8]], [41,[]], [42,[15]], [43,[]],
     [44,[]], [45,[3,6,16]]]
                                                           Type: List List Any


0

R、68 66バイト

N=scan();m=expand.grid(k=1:18,1:N);n=m$V;m$k[m$k*n*(n-1)/2+n==N]+2

Nstdinから読み取ります。最初のNk対角数を計算し、kそれらが等しい場所を取得しますNxnorの式を使用ます。ただし、1:18代わりに3:20を使用して追加することにより、括弧のバイト数を節約します2して末尾にで、。

expand.gridデフォルトでは、列Var1に名前を付けますVar2は、名前が指定されていない場合名前を付けます。$部分一致によるインデックス。したがって、2番目の列にm$V対応しm$Var2,ます。

古いバージョン:

N=scan();m=expand.grid(k=3:20,1:N);n=m$V;m$k[(m$k-2)*n*(n-1)/2+n==N]

オンラインでお試しください!



0

ゼリー、20 バイト

私はこのチャレンジの効果的なだまし書きを書き始めました([1,20]だけでなくk> 1をすべてカバーしていますが)...その代わりに答えます!

Ṫð’××H+⁸
18pÇċ¥Ðf⁸+2

結果のゼリーリスト表現を印刷する完全なプログラム*

オンラインでお試しください!

*結果は何も印刷しません。
  単一の結果はその数だけを出力します。
  複数の結果が[]囲まれたものを印刷し、, は、数字の分離されたリストをします

どうやって?

Ṫð’××H+⁸ - Link 1, ith (x+2)-gonal number: list [x,i]   e.g. [3,4] (for 4th Pentagonal)
Ṫ        - tail & modify (i.e. yield i & make input [x])     4
 ð       - new dyadic chain, i.e. left = i, right = [x]
  ’      - decrement i                                       3
   ×     - multiply by [x]                                   [9]
     H   - halve [x]                                         [2]
    ×    - multiply                                          [18]
       ⁸ - chain's left argument, i                          4
      +  - add                                               [22]

18pÇċ¥Ðf⁸+2 - Main link: number, n                      e.g. 36
18p         - Cartesian product of range [1,18] with n       [[1,1],[1,2],...,[1,36],[2,1],...,[18,1],[18,2],[18,36]]
            -   (all pairs of [(k-2),i] which could result in the ith k-gonal number being n)
      Ðf    - filter keep if this is truthy:
        ⁸   -   chain's left argument, n                     36
     ¥      -   last two links as a dyad:
   Ç        -     call the last link as a monad (note this removes the tail of each)
    ċ       -     count (this is 1 if the result is [n] and 0 otherwise)
            -                            filter keep result: [[1],[2],[11]]
         +2 - add two                                        [[3],[4],[13]]
            - implicit print ...due to Jelly representation: [3, 4, 13]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.