多角形の数字


12

多角形の数は、kサイズの1角形のドットの数ですn

とが与えられnkあなたの仕事は、対応する番号を出力/印刷するプログラム/関数を書くことです。

得点

これはです。バイト単位の最短ソリューションが勝ちです。

3番目の六角形番号

3RD六角数は(k=6, n=3)で28あるので、28上記のドットが。

テストケース

このPythテストスイートから生成できます。

使用法:テストケースごとに2行、n上、k下。

n    k  output
10   3  55
10   5  145
100  3  5050
1000 24 10990000

さらに詳しい情報


1
それは写真の4番目の六角形の数字ではありませんか?
ニール

@Neilゼロからカウントします。
リーキー修道女

2
あなたは本当に質問の投稿を続けていますよね?
R.キャップ

この例はオフになっている可能性があります。テストスイートに配置するn=3k=6、が得られ15ます。とを入れるn=4k=6、得られ28ます。
NonlinearFruit

回答:


9

ゼリー、7バイト

’;’;PH+

これは式を使用します

formula

n 番目を計算する のs対角数ます。

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

使い方

’;’;PH+  Main link. Arguments: s, n

’        Decrement; yield s - 1.
 ;       Concatenate; yield [s - 1, n].
  ’      Decrement; yield [s - 2, n - 1].
   ;     Concatenate; yield [s - 2, n - 1, n].
    P    Product; yield (s - 2)(n - 1)n.
     H   Halve; yield (s - 2)(n - 1)n ÷ 2.
      +  Add; yield (s - 2)(n - 1)n ÷ 2 + n.

4

六角形、25バイト

?(({"+!@/"*'+{/?('*})/2':

展開:

   ? ( ( {
  " + ! @ /
 " * ' + { /
? ( ' * } ) /
 2 ' : . . .
  . . . . .
   . . . .

読みます k最初にn 2番目を(セパレーターを使用)。

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

説明

プログラムは完全に線形ですが、Hexagonyで通常のように、実行の順序はいたるところにあります。

enter image description here

パスは、グレーダークブルーレッドライトブルーダークグリーンピンクの順に実行されます。ご覧のとおり、3つ/はフローをリダイレクトするためだけに機能します。また、.no-opsです。すべての六角形の空想を取り除き、結果の線形プログラムは次のとおりです。

?(({?('*})"*'+{2':"+!@

これにより、標準式が計算されます

formula

他のほとんどの答えのように。これは、次の5つのメモリエッジを使用して行われ、メモリポインター(MP)は赤で示されているように開始されます。

enter image description here

これを行う方法は次のとおりです。

?    Read integer input s into edge A.
((   Decrement twice to get (s-2).
{    Move the MP forwards onto edge B.
?    Read integer input n into edge B.
(    Decrement to get (n-1).
'    Move the MP backwards onto edge C.
*    Multiply edges A and B to store the result (s-2)(n-1) in edge C.
}    Move the MP forwards onto edge B.
)    Increment to restore the value n.
"    Move the MP backwards onto edge A.
*    Multiply edge B and C to store the result (s-2)(n-1)n in edge A.
'    Move the MP backwards onto edge D.
+    Add edges E (initially 0) and A to copy (s-2)(n-1)n into edge D.
{    Move the MP forwards onto edge E.
2    Set the memory edge to value 2.
'    Move the MP backwards onto edge A.
:    Divide edge D by edge E to store (s-2)(n-1)n/2 in edge A.
"    Move the MP backwards onto edge C.
+    Add edges A and B to store (s-2)(n-1)n/2+n in edge C.
!    Print as integer.
@    Terminate the program.

このような単純な式は... 25バイト必要ですか?!
リーキー修道女

4
@KennyLauこれはある ...結局Hexagony
マーティン・エンダー

六角形のメタ質問
-downrep_nation


3

ラビリンス、13バイト

?::(*?((*#/+!

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

説明

単一文字のコマンド(言語の2D性の単なる必要性)のために、ラビリンスは線形プログラムにとって驚くほどゴルファーです。

これは、他のいくつかの回答と同じ式を使用します。

formula

Op  Explanation                 Stack
?   Read n.                     [n]
::  Make two copies.            [n n n]
(   Decrement.                  [n n (n-1)]
*   Multiply.                   [n (n*(n-1))]
?   Read s.                     [n (n*(n-1)) s]
((  Decrement twice.            [n (n*(n-1)) (s-2)]
*   Multiply.                   [n (n*(n-1)*(s-2))]
#   Push stack depth, 2.        [n (n*(n-1)*(s-2)) 2]
/   Divide.                     [n (n*(n-1)*(s-2))/2]
+   Add.                        [(n+(n*(n-1)*(s-2))/2)]
!   Print.                      []

この時点で、命令ポインタは行き止まりに当たり、向きを変えます。ここ+で再び実行されますが、これは何もしません(スタックの底が無限にゼロで埋められているため)。その後/、ゼロ除算を試みて、エラーでプログラムを終了します。


2

JavaScript(ES6)、24 22バイト

(k,n)=>n+n*--n*(k-2)/2

説明:各n角形は、1辺に沿ったnポイントとサイズn-1のk-2三角形、つまりn + n(n-1)(k-2)/ 2と見なすことができます。


k--*n--+2-nけれどもテストしていない
漏れ修道女

@KennyLau申し訳ありませんが、(k,n)=>n*(--k*--n-n+2)/2まだ24バイトです。
ニール

@KennyLau実際、私は--nfor の明らかな使用を見落としていました(n-1)。ど!
ニール

@NeiIまあ、いいね。
漏れの修道女

カレーでさようならを保存できます。– k=>n=>n+n*--n*(k-2)/2
デニス


2

APL(Dyalog Extended)、11 バイトSBCS

この代替バージョンを提案してくれたAdámに感謝します。

⊢+-∘2⍤⊣×2!⊢

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

説明

⊢+-∘2⍤⊣×2!⊢  Right argument (⊢) is n. Left argument (⊣) is s.

        2!⊢  Binomial(n, 2) == n*(n-1)/2.
  -∘2⍤⊣×     Multiply (×) with by getLeftArgument (⊢) with (⍤) minus 2 (-∘2) called on it.
             In short, multiply binomial(n,2) with (s-2).
⊢+           Add n.

APL(Dyalog Unicode)12 11 バイトSBCS

これをゴルフで手伝ってくれたアダムに感謝します。

編集:NGNから-1バイト。

⊢+{⍺-22!⊢

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

アンゴルフ

⊢+{⍺-22!⊢  Right argument (⊢) is n. Left argument (⊣) is s.

        2!⊢  Binomial(n, 2) == n*(n-1)/2.
  {⍺-2     Multiply it by s-2.
⊢+           Add n.

1

実際には、12バイト

3@n(¬@D3╟π½+

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

説明:

3@n(¬@D3╟π½+
3@n           push 3 copies of n (stack: [n, n, n, k])
   (¬         bring k to front and subtract 2 ([k-2, n, n, n])
     @D       bring an n to front and subtract 1 ([n-1, k-2, n, n])
       3╟π    product of top 3 elements ([n*(n-1)*(k-2), n])
          ½   divide by 2 ([n*(n-1)*(k-2)/2, n])
           +  add ([n*(n-1)*(k-2)/2 + n])

1

dc、14バイト

?dd1-*2/?2-*+p

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

説明

これは、次の式を使用します(T n =に注意してくださいn*(n-1)/2)。

Polygonal numbers

                # inputs              | N S                  | 10 5
?dd             # push N three times  | N, N, N              | 10, 10, 10
   1-           # subtract 1          | (N-1), N, N          | 9, 10, 10
     *          # multiply            | (N-1)*N, N           | 90, 10
      2/        # divide by two       | (N-1)*N/2, N         | 45, 10
        ?       # push S              | S, (N-1)*N/2, N      | 5, 45, 10
         2-     # subtract 2          | (S-2), (N-1)*N/2, N  | 3, 45, 10
           *    # multiply            | (S-2)*(N-1)*N/2, N   | 135, 10
            +   # add                 | (S-2)*(N-1)*N/2 + N  | 145
             p  # print to stdout


1

MathGolf、8バイト

_┐*½?⌡*+

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

説明(と n=10k=5

_          duplicate first implicit input, stack is [10, 10]
 ┐         push TOS-1 without popping, stack is [10, 10, 9]
  *        multiply, stack is [10, 90]
   ½       halve TOS, stack is [10, 45]
    ?      rotate top 3 stack elements, popping k to the top: [10, 45, 5]
     ⌡     decrement TOS twice: [10, 45, 3]
      *    multiply: [10, 135]
       +   add: [145]

代替の8バイトは┼┐*½\⌡*+、入力を逆順に取得します。



0

Mathematica、17バイト

(#2-2)#(#-1)/2+#&

数式の簡単な適用。

使用法

  f = (#2-2)#(#-1)/2+#&
  f[10, 3]
55
  f[10, 5]
145
  f[100, 3]
5050
  f[1000, 24]
10990000

0

J、14バイト

]++/@i.@]*[-2:

式に基づいています。

P(k, n) = (k - 2) * T(n - 1) + n where T(n) = n * (n + 1) / 2
        = (k - 2) * n * (n - 1) / 2 + n

使用法

   f =: ]++/@i.@]*[-2:
   3 f 10
55
   5 f 10
145
   3 f 100
5050
   24 f 1000
10990000

説明

]++/@i.@]*[-2:
            2:  The constant function 2
          [     Get k
           -    Subtract to get k-2
        ]       Get n
     i.@        Make a range from 0 to n-1
  +/@           Sum the range to get the (n-1) Triangle number = n*(n-1)/2
                The nth Triangle number is also the sum of the first n numbers
         *      Multiply n*(n-1)/2 with (k-2)
]               Get n
 +              Add n to (k-2)*n*(n-1)/2

私のアプローチを使用すると、どのくらいの時間がかかりますか?
リーキー修道女



0

Pythonの3、31の 30 28バイト

このwiki記事からのまっすぐな方程式

lambda s,n:(s-2)*(n-1)*n/2+n

バイトを保存してくれた@Megoに感謝します!


コロンと括弧の間のスペースを削除できます。
メゴ



0

Java 8、21バイト

等しいバイト長のすべての個別の回答:

k->n->n+n*~-n*(k-2)/2
k->n->n+n*--n*(k-2)/2
k->n->n+n*~-n*~-~-k/2
k->n->n+n*--n*~-~-k/2

説明:

ここで試してみてください。

k->n->            // Method with two integer parameters and integer return-type
  n+              //  Return `n` plus
    n*            //   `n` multiplied by
      ~-n         //   `n-1`
         *(k-2)   //   Multiplied by `k-2`
               /2 //   Divided by 2
                  // End of method (implicit / single-line return-statement)


0

、9バイト

S+~*-2(Σ←

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

説明

私のdc答えと同じ式を使用して:

多角形の数字

            -- implicit inputs S, N                     | 5, 10
S+          -- compute N + the result of the following  | 10 + 
  ~*        --   multiply these two together            |      (   ) * 
    -2      --     S-2                                  |       S-2
      (Σ←)  --     triangle number of (N-1)             |              tri(N-1)

0

APL(NARS)、16文字、32バイト

{⍵+(⍺-2)×+/⍳⍵-1}

これは、n×(n-1)/ 2 = sum(1..n-1)テストと思われるという事実に基づいています。

  f←{⍵+(⍺-2)×+/⍳⍵-1}
  10 f 3
27
  3 f 10
55
  5 f 19
532
  3 f 10
55
  5 f 10
145
  3 f 100
5050
  24 f 1000
10990000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.