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


12

บทนำ

ในคณิตศาสตร์ตัวเลขหลายเหลี่ยมเป็นตัวเลขที่แสดงเป็นจุดหรือก้อนกรวดที่จัดเรียงในรูปของรูปหลายเหลี่ยมปกติ จุดต่างๆนั้นคิดว่าเป็นตัวอักษร (หน่วย) นี่เป็นตัวเลขเปรียบเทียบสองมิติหนึ่งประเภท

ตัวอย่างเช่นหมายเลข 10 สามารถจัดเรียงเป็นรูปสามเหลี่ยมได้:

*
**
***
****

แต่ 10 ไม่สามารถจัดเป็นสี่เหลี่ยม ในทางกลับกันหมายเลข 9 สามารถ:

***
***
***

ตัวเลขบางตัวเช่น 36 สามารถจัดเรียงได้ทั้งแบบสี่เหลี่ยมจัตุรัสและสามเหลี่ยม:

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

ตามแบบแผน 1 คือหมายเลขรูปหลายเหลี่ยมแรกสำหรับจำนวนด้านใด ๆ กฎสำหรับการขยายรูปหลายเหลี่ยมให้มีขนาดถัดไปคือการขยายแขนข้างที่ติดกันสองจุดด้วยจุดเดียวแล้วเพิ่มด้านพิเศษที่จำเป็นระหว่างจุดเหล่านั้น ในไดอะแกรมต่อไปนี้แต่ละเลเยอร์พิเศษจะแสดงเป็นสีแดง

ตัวเลขสามเหลี่ยม:

ตัวเลขสามเหลี่ยม

หมายเลขสแควร์:

ตัวเลขสแควร์

รูปหลายเหลี่ยมที่มีจำนวนด้านสูงกว่าเช่นเพนตากอนและรูปหกเหลี่ยมสามารถสร้างได้ตามกฎนี้แม้ว่าจุดจะไม่กลายเป็นโครงตาข่ายปกติอย่างสมบูรณ์แบบดังกล่าวข้างต้น

หมายเลขห้าเหลี่ยม:

ตัวเลขห้าเหลี่ยม

ตัวเลขหกเหลี่ยม:

ตัวเลขหกเหลี่ยม

ที่มา: Wikipedia

งานของคุณ

รับจำนวนเต็มบวกN (1 <= N <= 1,000) พิมพ์ทุกชนิดของรูปหลายเหลี่ยมจำนวนNเริ่มต้นจากตัวเลขสามเหลี่ยมจนถึงและรวมถึงตัวเลข Icosagonal (20-gon)

ตัวอย่างเช่นหมายเลข 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

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


สำหรับการอ้างอิงnจำนวน k-TH gonal (k-2)*n*(n-1)/2 + nคือ
xnor

9
จุดประสงค์ของ sandbox คือการปรับปรุงคำถาม หากคุณโพสต์คำถามในแซนด์บ็อกซ์และพบว่ามันไม่ชัดเจนในสิ่งที่คุณถามการตอบที่ถูกต้องคือการไม่เพิ่มความคิดเห็นในแซนด์บ็อกซ์รอสองชั่วโมงจากนั้นโพสต์คำถามไปยังหลักที่ไม่ได้แก้ไข ซ่อนความคิดเห็นที่ชัดเจนจากคนที่มีตัวแทนน้อยกว่าสองพันคน คำตอบที่ถูกต้องคือการใช้ถ้อยคำใหม่หรือขอคำแนะนำสำหรับการใช้ถ้อยคำใหม่และให้อีกหนึ่งหรือสองวันเพื่อดูว่าคำถามที่ใช้ถ้อยคำยังคงมีปัญหาอยู่หรือไม่
Peter Taylor

คำตอบ:


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 + nสำหรับnเพื่อดูว่าผลที่ได้คือจำนวนทั้งหมด

เปรียบเทียบ (73 ไบต์):

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

วิธีทางเลือกของการแก้สำหรับsให้ 62 ไบต์ในหลาม 3 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)

แก้สมการกำลังสอง 73 ไบต์บน Firefox รุ่นใหม่ที่เพียงพอ:

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^
>:&:&=?^:&:&)?^:@:@$-{:}++

คาดว่าอินพุตที่ด้านบนของสแต็กดังนั้น +3 ไบต์สำหรับ-vแฟล็ก

นี่เป็นครั้งแรกที่ฉันเขียนโปรแกรมใน> <> ดังนั้นฉันอาจพลาดเทคนิคที่ชัดเจนในการทำให้รหัสสั้นลง

คำอธิบาย:

การเริ่มต้น

&1v
v0<
1

ย้ายยังไม่มีการลงทะเบียนผลักเคาน์เตอร์เพื่อสแต็ค (เริ่มต้นที่1ซึ่งสอดคล้องกับตัวเลขสามเหลี่ยม) และเริ่มลำดับที่มีค่าและ01

หลักวน

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

เปรียบเทียบส่วนบนสุดของสแต็กกับรีจิสเตอร์ หากมีค่าเท่ากันให้ไปที่รูทีนการพิมพ์ ถ้ายิ่งใหญ่กว่าให้ไปที่รูทีนการรีเซ็ต มิฉะนั้นรับความแตกต่างระหว่างรายการสแต็คสองอันดับแรกเพิ่มตัวนับและเพิ่มไปยังรายการสแต็กด้านบนก่อนหน้า สิ่งนี้จะคำนวณจำนวนรูปหลายเหลี่ยมถัดไป

พิมพ์

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

พิมพ์ตัวนับ + 2 ตามด้วยบรรทัดใหม่แล้วย้ายไปที่รูทีนการรีเซ็ต

ตั้งค่าใหม่

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

ลบรายการสแต็กสองอันดับแรกและเพิ่มตัวนับ สิ้นสุดโปรแกรมถ้าตัวนับมีค่ามากกว่า 18 มิฉะนั้นจะกดตัวเลขเริ่มต้น0และ1ไปที่สแต็กและกลับไปที่ลูปหลัก


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)

นี่คือ golfed น้อยลงและรูทีนที่แสดงตัวเลข

 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

AWK , 67 ไบต์

{for(k=2;++k<21;)for(n=0;++n<=$1;)if((k/2-1)*(n*n-n)+n==$1)print k}

ลองออนไลน์!

ฉันพยายามแก้สมการกำลังสอง แต่การตรวจสอบแต่ละค่าเพื่อดูว่ามันใช้งานได้สั้นกว่า(และมีข้อผิดพลาดน้อยกว่าสำหรับฉัน)


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

อ่านNจาก stdin คำนวณNตัวเลข k-gonal แรกและได้kตำแหน่งที่เท่ากันNโดยใช้สูตรของ xnor อย่างไรก็ตามบันทึกไบต์บนวงเล็บโดยใช้1:18แทน3:20และเพิ่ม2ในตอนท้าย

expand.gridโดยค่าเริ่มต้นชื่อคอลัมน์Var1,, Var2... , ถ้าไม่มีชื่อ $ดัชนีโดยการจับคู่บางส่วนดังนั้น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 ไบต์

ฉันเพิ่งเริ่มเขียนล่อลวงที่มีประสิทธิภาพของความท้าทายนี้ (แม้ว่าจะครอบคลุม k> 1 ทั้งหมดไม่เพียง [1,20]) ... ดังนั้นฉันจะตอบมันแทน!

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

โปรแกรมเต็มรูปแบบการพิมพ์รายการ Jelly แสดงผลลัพธ์ *

ลองออนไลน์!

* ไม่มีผลลัพธ์พิมพ์อะไรเลย;
  ผลลัพธ์เดียวพิมพ์หมายเลขนั้น
  ผลลัพธ์หลายรายการจะพิมพ์รายการตัวเลขที่[]ล้อมรอบและ, แยกออกมา

อย่างไร?

Ṫð’××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.