ตัวเลขรูปหลายเหลี่ยม


12

จำนวนเหลี่ยมเป็นจำนวนจุดในส่วนk-gon nขนาด

คุณจะได้รับnและkและงานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่ส่งออก / พิมพ์หมายเลขที่สอดคล้องกัน

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

หมายเลขหกเหลี่ยมที่ 3

3จำนวน RD หกเหลี่ยม ( k=6, n=3) เป็น28เพราะมี28จุดที่อยู่บน

Testcases

สามารถสร้างขึ้นจากชุดทดสอบ Pyth นี้

การใช้งาน: สองบรรทัดต่อ testcase nข้างบนkด้านล่าง

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

ข้อมูลเพิ่มเติม


1
นั่นคือเลขหกเหลี่ยมที่ 4 ในรูปภาพเหรอ?
Neil

@Neil เรานับจากศูนย์
Leun Nun

2
คุณกำลังจะมีคำถามโพสต์ความสนุกสนานใช่มั้ย
R. Kap

ตัวอย่างอาจถูกปิด หากคุณใส่n=3และเข้าไปในชุดทดสอบของคุณคุณจะได้รับk=6 15หากคุณใส่ในn=4และคุณจะได้รับk=6 28
NonlinearFruit

คำตอบ:


9

เยลลี่ขนาด 7 ไบต์

’;’;PH+

ใช้สูตรนี้

สูตร

การคำนวณn TH sจำนวน -gonal

ลองออนไลน์!

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

’;’;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

Hexagony 25 ไบต์

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

กางออก:

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

อ่านkครั้งแรกและnครั้งที่สอง (ใช้ตัวคั่นใด ๆ )

ลองออนไลน์!

คำอธิบาย

โปรแกรมมีลักษณะเป็นเส้นตรงทั้งหมด แต่ตามปกติใน Hexagony คำสั่งของการดำเนินการอยู่ที่:

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

เส้นทางที่จะดำเนินการในลำดับสีเทา , สีน้ำเงินเข้ม , สีแดง , สีฟ้า , สีเขียวเข้ม , สีชมพู อย่างที่คุณเห็นสามสิ่ง/เดียวที่ทำหน้าที่เปลี่ยนเส้นทางการไหล นอกจากนี้ยัง.ไม่มี ops การตัดเส้นหกเหลี่ยมทั้งหมดโปรแกรมเชิงเส้นที่ได้คือ:

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

สิ่งนี้คำนวณสูตรมาตรฐาน

สูตร

ชอบคำตอบส่วนใหญ่ โดยใช้ขอบหน่วยความจำทั้งห้าต่อไปนี้โดยที่ตัวชี้หน่วยความจำ (MP) เริ่มต้นดังแสดงในสีแดง:

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

นี่คือวิธีการทำ:

?    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 ไบต์!
Leun Nun

4
@KennyLau นี่คือ Hexagony เลย ...
Martin Ender

Hexagony meta question
downrep_nation

3

05AB1E , 8 ไบต์

รหัส:

D<LOIÍ*+

คำอธิบาย:

D         # Duplicate the input
 <LO      # Compute n × (n - 1) / 2
    IÍ    # Compute k - 2
      *   # Multiply, resulting into (k - 2)(n - 1)(n) / 2
       +  # Add, resulting into n + (k - 2)(n - 1)(n) / 2

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


3

เขาวงกตขนาด 13 ไบต์

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

ลองออนไลน์!

คำอธิบาย

เนื่องจากคำสั่งอักขระเดี่ยว (ซึ่งเป็นเพียงความจำเป็นของ 2D-ness ของภาษา) เขาวงกตสามารถเล่นกอล์ฟได้อย่างน่าประหลาดใจสำหรับโปรแกรมเชิงเส้น

ใช้สูตรเดียวกันกับคำตอบอื่น ๆ :

สูตร

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

เมื่อมาถึงจุดนี้ตัวชี้คำสั่งกระทบยอดตันและหันไปรอบ ๆ ตอนนี้+จะถูกดำเนินการอีกครั้งซึ่งเป็น no-op (เนื่องจากด้านล่างของสแต็กเต็มไปด้วยจำนวนศูนย์ที่ไม่มีที่สิ้นสุด) แล้ว/พยายามหารด้วยศูนย์ซึ่งยุติโปรแกรมด้วยข้อผิดพลาด


2

JavaScript (ES6), 24 22 ไบต์

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

คำอธิบาย: แต่ละ n-gon สามารถพิจารณาได้ว่าเป็นคะแนน n ด้านหนึ่งบวกด้วยรูปสามเหลี่ยมขนาด k-2 ที่ n-1 คือ n + n (n-1) (k-2) / 2


k--*n--+2-nยังไม่ได้ทดสอบ
Leaky Nun

@KennyLau ขออภัย แต่(k,n)=>n*(--k*--n-n+2)/2ยังคงเป็น 24 ไบต์
Neil

@KennyLau ในความเป็นจริงผมมองข้ามการใช้งานที่ชัดเจนของสำหรับ--n (n-1)D'โอ้!
Neil

@NeiI ดี
Leun Nun

คุณสามารถบันทึกลาก่อนด้วยการแกง: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

ขอบคุณAdámที่ช่วยเขาตีกอล์ฟนี้

แก้ไข: -1 ไบต์จาก ngn

⊢+{⍺-22!⊢

ลองออนไลน์!

Ungolfing

⊢+{⍺-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):

ตัวเลขรูปหลายเหลี่ยม

                # 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

Aceto , 18 15 ไบต์

คำตอบของพอร์ตของBruce Forte :

riddD*2/ri2-*+p

บันทึก 3 ไบต์ด้วยการตระหนักว่าโปรแกรม "บริสุทธิ์" (ไม่มีคำสั่งรวม) ใด ๆ สามารถเขียนโปรแกรมเชิงเส้นได้


1

MathGolf , 8 ไบต์

_┐*½?⌡*+

ลองออนไลน์!

n=10,k=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

จะใช้เวลานานแค่ไหนโดยใช้วิธีการของฉัน
Leun Nun


0

GameMaker Language ขนาด 44 ไบต์

n=argument1;return (argument0-2)*n*(n-1)/2+n

จำเป็นต้องใช้พื้นที่ว่างหรือไม่
Leun Nun




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

Husk , 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 = ผลรวม (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.