สามเหลี่ยมของฉันต้องการโหนดมากขึ้น


20

พิจารณารูปสามเหลี่ยมด้านเท่ามาตรฐานพร้อมโหนดที่มีป้ายกำกับโดยใช้พิกัด barycentric :

เราสามารถเปลี่ยนสามเหลี่ยม 3 โหนดนี้เป็นสามเหลี่ยม 6 โหนดโดยการเพิ่มบรรทัดใหม่ของ 3 จุดยอด (มากกว่าหนึ่งอยู่ด้านข้างของสามเหลี่ยมโหนด 3 เดิม) ลบขอบภายในใด ๆ (แต่ไม่ใช่โหนดภายใน) และ ปรับมาตรฐานให้เป็นพิกัด:

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

ทำซ้ำกระบวนการเพื่อไปจากสามเหลี่ยมโหนด 6 จุดไปยังสามเหลี่ยมโหนด 10 เพิ่มบรรทัดของจุดยอด 4 (อีกครั้งหนึ่งมากกว่ามีอยู่ด้านข้างของสามเหลี่ยมโหนด 6 เดิม) เอาขอบภายในใด ๆ (แต่ไม่ใช่โหนดภายใน ) และทำให้พิกัดกลับเป็นปกติอีกครั้ง:

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

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

อินพุต

โปรแกรม / ฟังก์ชั่นของคุณควรรับข้อมูลเป็นจำนวนเต็มแบบไม่ลบเดี่ยวซึ่งNแสดงว่ามีการใช้กระบวนการนี้กี่ครั้ง โปรดทราบว่าสำหรับN=0คุณควรส่งออกสามเหลี่ยมเดิมด้วย 3 โหนด

อินพุตอาจมาจากแหล่งใดก็ได้ (ฟังก์ชันพารามิเตอร์ stdio ฯลฯ )

เอาท์พุต

โปรแกรม / ฟังก์ชั่นของคุณควรส่งออกโหนดทั้งหมดในพิกัด barycentric ปกติ ลำดับของโหนดไม่สำคัญ จำนวนสามารถระบุเป็นเศษส่วน (ไม่จำเป็นต้องลดเศษส่วน) หรือหมายเลขจุดลอยตัว นอกจากนี้คุณยังสามารถส่งสัญญาณ "สเกล" เพื่อระบุโหนด ตัวอย่างเช่นผลลัพธ์ทั้ง 3 รายการต่อไปนี้เทียบเท่าและได้รับอนุญาต:

0.5,0.5,0

1/2,2/4,0

[1,1,0]/2

หากใช้การแสดงผลแบบ floating point เอาต์พุตของคุณควรแม่นยำภายใน 1% เอาท์พุทอาจจะจมใด ๆ ที่ต้องการ (stdio, ค่าตอบแทน, พารามิเตอร์ส่งคืน, ฯลฯ ) โปรดทราบว่าแม้ว่าพิกัด barycentric จะถูกกำหนดโดยไม่ซ้ำกันโดยมีเพียง 2 หมายเลขต่อโหนดคุณควรส่งออกหมายเลข 3 ทั้งหมดต่อโหนด

ตัวอย่าง

กรณีตัวอย่างถูกจัดรูปแบบเป็น:

N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...

โดยที่บรรทัดแรกคืออินพุตNและบรรทัดต่อไปนี้ทั้งหมดสร้างโหนดx,y,zซึ่งควรอยู่ในเอาต์พุตหนึ่งครั้ง ตัวเลขทั้งหมดจะได้รับเป็นตัวเลขทศนิยมโดยประมาณ

0
1,0,0
0,1,0
0,0,1

1
1,0,0
0,1,0
0,0,1
0.5,0,0.5
0.5,0.5,0
0,0.5,0.5

2
1,0,0
0,1,0
0,0,1
0.667,0,0.333
0.667,0.333,0
0.333,0,0.667
0.333,0.333,0.333
0.333,0.667,0
0,0.333,0.667
0,0.667,0.333

3
1,0,0
0.75,0,0.25
0.75,0.25,0
0.5,0,0.5
0.5,0.25,0.25
0.5,0.5,0
0.25,0,0.75
0.25,0.25,0.5
0.25,0.5,0.25
0.25,0.75,0
0,0,1
0,0.25,0.75
0,0.5,0.5
0,0.75,0.25
0,1,0

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

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


คุณพูดว่า " ถ้าใช้กำลังส่งออกเลขทศนิยม " มีทางเลือกอะไรบ้าง? เศษส่วน? ถ้าเป็นเช่นนั้นพวกเขาจะต้องลดลง? แล้วเวกเตอร์ที่ปรับขนาดเป็น[1,2,3]/6อย่างไร
Peter Taylor

ใช่ทางเลือกทั้งหมดนั้นได้รับอนุญาต ฉันจะอัพเดทคำแถลงปัญหา
helloworld922

คำตอบ:


7

CJam (22 ไบต์)

{):X),3m*{:+X=},Xdff/}

นี่คือบล็อก (ฟังก์ชั่น) ที่ไม่ระบุชื่อซึ่งใช้Nกับสแต็กและปล่อยให้อาร์เรย์ของคู่ของอาร์เรย์บนสแต็ก การสาธิตออนไลน์

การผ่า

{         e# Define a block
  ):X     e# Let X=N+1 be the number of segments per edge
  ),3m*   e# Generate all triplets of integers in [0, X] (inclusive)
  {:+X=}, e# Filter to those triplets which sum to X
  Xdff/   e# Normalise
}


5

Python 3, 87 ไบต์

นี่ควรจะเป็นความเห็นต่อโซลูชันโดย TheBikingVikingแต่ฉันไม่มีชื่อเสียงเพียงพอสำหรับความคิดเห็น

หนึ่งสามารถบันทึกไม่กี่ไบต์โดยเฉพาะการทำซ้ำมากกว่าตัวแปรและการใช้ความจริงที่ว่ามีคนที่สามหนึ่งที่พวกเขาเพิ่มขึ้นถึงi,jn+1

def f(n):d=n+1;r=range(n+2);print([[i/d,j/d,(d-i-j)/d]for i in r for j in r if d>=i+j])

4

Mathematica,  44  43 ไบต์

Select[Range[0,x=#+1]~Tuples~3/x,Tr@#==1&]&

นี่เป็นฟังก์ชันที่ไม่มีชื่อซึ่งใช้อาร์กิวเมนต์เป็นจำนวนเต็มเดี่ยว เอาต์พุตเป็นรายการของเศษส่วนที่แน่นอน (ลดลง)

สร้างทริปเปิลทวีคูณ 3 รายการทั้งหมด1/(N+1)ระหว่าง 0 ถึง 1 และรวมแล้วเลือกรายการที่มีผลรวมเป็น 1 (ตามที่กำหนดโดยพิกัด barycentric)


4

05AB1E , 10 ไบต์

ÌL<¤/3ãDOÏ

คำอธิบาย

ÌL<          # range(1,n+2)-1
   ¤/        # divide all by last element (n+1)
     3ã      # cartesian product repeat (generate all possible triples)
       DO    # make a copy and sum the triples
         Ï   # keep triples with sum 1

ลองออนไลน์


ตั้งแต่¤ใช้อาร์เรย์ทำไม/แบ่งอาร์เรย์โดยที่? มัน "จำได้" ที่มีค่าล่าสุดที่ popped และใช้ถ้าจำเป็น?
Luis Mendo

@LuisMendo: ¤เป็นหนึ่งในไม่กี่คำสั่งที่ไม่ปรากฏและใช้งานจากสแต็ก มันดันองค์ประกอบสุดท้ายของรายการในขณะที่ออกจากรายการในสแต็ค
Emigna


@LuisMendo 05AB1E เพียง outputs ด้านบนของสแต็คในตอนท้ายของโปรแกรม
Emigna

โอ้แน่นอน! ขอบคุณสำหรับคำอธิบาย
หลุยส์เมนโด

3

MATL , 17 ไบต์

2+:qGQ/3Z^t!s1=Y)

ลองออนไลน์!

คำอธิบาย

วิธีการเช่นเดียวกับคำตอบอื่น ๆ :

  1. สร้างอาร์เรย์[0, 1/(n+1), 2/(n+1), ..., 1]โดยที่nอินพุตอยู่ที่ไหน
  2. สร้างสิ่งอันดับ 3 ทั้งหมดด้วยค่าเหล่านั้น
  3. 1เก็บเฉพาะผู้ที่มีผลรวมเป็น

โดยเฉพาะอย่างยิ่ง:

2+     % Take input and add 2: produces n+2
:q     % Range [0 1 ... n+1]
GQ/    % Divide by n+1 element-wise: gives [0, 1/(n+1), 2/(n+1)..., 1]
3Z^    % Cartesian power with exponent 3. Gives (n+1)^3 × 3 array. Each row is a 3-tuple
t      % Duplicate
!s     % Sum of each row
1=     % Logical index of entries that equal 1
Y)     % Use that index to select rows of the 2D array of 3-tuples

1

แมงกะพรุน , 37 33 ไบต์

ขอบคุณ Zgarb สำหรับการบันทึก 4 ไบต์

p
*%
# S
`
=E   S
`/
1+r#>>i
   3

ลองออนไลน์!

เช่นเดียวกับ Mathematica และคำตอบ CJam ของ Peter สิ่งนี้สร้างชุดของ tuples ผู้สมัครแล้วเลือกเฉพาะที่รวมเป็น 1 ฉันยังไม่พอใจกับรูปแบบทั้งหมดและฉันสงสัยว่าฉันสามารถบันทึกไบต์ด้วยตะขอหรือส้อมได้ไหม แต่ฉันจะต้องตรวจสอบในภายหลังว่า


1

Perl 6: 50 40 ไบต์

{grep *.sum==1,[X] (0,1/($_+1)...1)xx 3}

ส่งคืนลำดับของรายการ 3 องค์ประกอบของจำนวนตรรกยะ (ที่แน่นอน)

คำอธิบาย:

  • $_
    พารามิเตอร์ที่ประกาศโดยปริยายของแลมบ์ดา
  • 0, 1/($_ + 1) ... 1
    ใช้ตัวดำเนินการลำดับ...เพื่อสร้างลำดับเลขคณิตที่สอดคล้องกับค่าพิกัดที่เป็นไปได้
  • [X] EXPR xx 3
    ใช้ผลิตภัณฑ์คาร์ทีเซียนที่มี EXPR สามชุดนั่นคือสร้างสิ่งอันดับสามทั้งหมดที่เป็นไปได้
  • grep *.sum == 1, EXPR
    กรองสิ่งอันดับด้วยผลรวม 1

1

ทับทิม, 62

ฉันจะแปลกใจหากไม่สามารถปรับปรุงได้ใน:

->x{0.step(1,i=1.0/(x+1)){|a|0.step(1-a,i){|b|p [a,b,1-a-b]}}}

การให้คำแนะนำแฝงอยู่ในปริศนาตัวเลือกนี้จะคำนวณตัวเลือกโหนดที่สองโดยยึดตามโหนดแรกและโหนดที่สามโดยการลบสองโหนดแรก



0

Python 3, 106 ไบต์

def f(n):r=range(n+2);print([x for x in[[i/-~n,j/-~n,k/-~n]for i in r for j in r for k in r]if sum(x)==1])

ฟังก์ชั่นที่จะรับอินพุตผ่านการโต้แย้งและพิมพ์รายการของการลอยไปยัง STDOUT

Python ไม่ดีในผลิตภัณฑ์คาร์ทีเซียน ...

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

def f(n):                         Function with input iteration number n
r=range(n+2)                      Define r as the range [0, n+1]
for i in r for j in r for k in r  Length 3 Cartesian product of r
[i/-~n,j/-~n,k/-~n]               Divide each element of each list in the product
                                  by n+1
[x for x in ... if sum(x)==1]     Filter by summation to 1
print(...)                           Print to STDOUT

ลองใช้กับ Ideone


0

ที่จริงแล้ว 15 ไบต์

นี้ใช้อัลกอริทึมที่คล้ายกับหนึ่งในTheBikingViking คำตอบของงูหลาม ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

u;ur♀/3@∙`Σ1=`░

Ungolfed:

u;                Increment implicit input and duplicate.
  ur              Range [0..n+1]
    ♀/            Divide everything in range by (input+1).
      3@∙         Take the Cartesian product of 3 copies of [range divided by input+1]
         `Σ1=`    Create function that takes a list checks if sum(list) == 1.
              ░   Push values of the Cartesian product where f returns a truthy value.

0

Ruby, 77 74 ไบต์

คำตอบโดยใช้อัลกอริทึมในอีกTheBikingViking เป็นคำตอบหลาม ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

->n{a=[*0.step(1,i=1.0/(n+1))];a.product(a,a).reject{|j|j.reduce(&:+)!=1}}

อีกขั้นตอนวิธีการ 74 ไบต์บนพื้นฐานไม่ว่าชาร์ลส์คำตอบทับทิม

->x{y=x+1;z=1.0/y;[*0..y].map{|a|[*0..y-a].map{|b|p [a*z,b*z,(y-a-b)*z]}}}

0

JavaScript (Firefox 30-57), 88 81 ไบต์

n=>[for(x of a=[...Array(++n+1).keys()])for(y of a)if(x+y<=n)[x/n,y/n,(n-x-y)/n]]

ส่งคืนอาร์เรย์ของอาร์เรย์ของตัวเลขทศนิยม แก้ไข: บันทึก 7 ไบต์โดยคำนวณพิกัดที่สามโดยตรง ฉันพยายามกำจัดifโดยคำนวณช่วงyโดยตรง แต่มีค่าใช้จ่ายเป็นไบต์พิเศษ:

n=>[for(x of a=[...Array(++n+1).keys()])for(y of a.slice(x))[x/n,(y-x)/n,(n-y)/n]]

ในตอนท้ายคุณเขียน[x/n,y/n/z/n]คุณลืมเครื่องหมายจุลภาคหรือไม่
kamoroso94

@ kamoroso94 คุณถูกต้องฉันพิมพ์เครื่องหมายจุลภาคสุดท้ายขอบคุณที่แจ้งให้ฉันทราบ
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.