การหาตำแหน่งสี่เหลี่ยมจัตุรัส


13

ยินดีต้อนรับสู่ความท้าทายรหัส - กอล์ฟครั้งแรกของฉัน! :) มาดูกันดีกว่า

ท้าทาย:

กำหนดเวกเตอร์จุดลอยตัวสองตัวO (จุดเริ่มต้น) และT (เป้าหมาย) คุณต้องสร้างโปรแกรมเพื่อพิมพ์ค่าLและRถึง STDOUT

  1. Oคือมุมหนึ่งของจัตุรัส
  2. Tคือมุมหนึ่งของจัตุรัสที่ตั้งอยู่ตรงข้ามกับO
  3. Lคือจุด 2D (มุม) ที่ทำเครื่องหมายจุดอื่นของสี่เหลี่ยมจัตุรัสที่ไม่สมบูรณ์
  4. Rคือจุด 2D (มุม) ที่อยู่ตรงข้ามกับL

กฎระเบียบ

  1. ต้องอ่านค่าOและTจาก STDIN (ดูอินพุตตัวอย่าง)
  2. อีกครั้งค่าของLและRจะต้องถูกพิมพ์ไปยัง STDOUT

เกณฑ์การให้คะแนนและโบนัส

  1. นับจำนวนไบต์ของโปรแกรมของคุณ
  2. หากโปรแกรมของคุณวาดเส้นที่เชื่อมต่อระหว่างOถึงLถึงTถึงRให้ลบ 15 ไบต์จากจำนวนไบต์

ตัวอย่าง

บรรทัดแรกครอบคลุมอินพุต (วงเล็บเหลี่ยมแรกสำหรับOและวงเล็บถัดไปสำหรับT ) และบรรทัดอื่น ๆ แทนเอาต์พุตที่คาดไว้

  • [0, 0] [3, 3] คาดว่า: [0, 3] [3, 0]
  • [0, 0] [-2, -2] คาดว่า: [-2, 0] [0, -2]
  • [1, -1] [4, 2] คาดว่า: [1, 2] [4, -1]
  • [0, -1] [0, 1] คาดว่า: [-1, 0] [1, 0]

ข้อสังเกต : อินพุตและเอาต์พุตสามารถเป็นทศนิยมได้!

ข้อมูลสำคัญ!

  • ค่าOและTสามารถนำมาใช้ในรูปแบบใดก็ได้ตราบใดที่มาจาก STDIN (เช่นภายใน [] หรือ () ... ) ให้ใช้รูปแบบใดก็ได้ที่คุณต้องการ
  • LและRสามารถพิมพ์ในลำดับใดก็ได้
  • ข้อควรจำ: เมื่อเชื่อมต่อ (O-> L-> T-> R-> O) แต่ละด้านจะต้องมีความยาวเท่ากัน!

การชนะ

  • นี่คือ code-golf ดังนั้นคำตอบไบต์น้อยที่สุดชนะ!
  • คำตอบของผู้ชนะจะได้รับการยอมรับในวันอาทิตย์ 15.11.2015 20: 00-22: 00 (เวลาฟินแลนด์) (ถ้าฉันไม่ผิดวันนั้นจะเขียนเหมือน 11.15.2015 ในสหรัฐอเมริกาอย่าสับสน)

มีความสุขในการเล่นกอล์ฟ!


3
ในกรณีที่คุณไม่ทราบให้ฉันแนะนำsandboxสำหรับความท้าทายในอนาคตซึ่งคุณสามารถรับข้อเสนอแนะและขัดความท้าทายของคุณก่อนที่จะเผยแพร่จริง (และก่อนการเปลี่ยนแปลงอาจทำให้คำตอบที่มีอยู่ไม่ถูกต้อง)
Martin Ender

เราสามารถรับข้อมูลเป็นรายการของจำนวนเชิงซ้อนสองตัวได้หรือไม่?
lirtosiast

@ThomasKwa แน่ใจว่าคุณสามารถใช้เป็นรายการได้ ไม่ป้อนจำนวนเชิงซ้อนเมื่อมันได้รับ ... ? ฉันหมายความว่าคุณไม่จำเป็นต้องรู้คุณค่าของตัวเองเพื่อให้คอมพิวเตอร์คำนวณได้ใช่ไหม
Yytsi

เมื่อคุณพูดว่า "point of the square" ดูเหมือนว่าคุณหมายถึงมุมหนึ่งหรือไม่? มีจุดอื่น ๆ มากมายในจตุรัส
Reto Koradi

@RetoKoradi คุณพูดถูก ฉันหมายถึงมุมหนึ่งด้วย
Yytsi

คำตอบ:


8

อย่างจริงจัง 11 ไบต์

พอร์ตของคำตอบ TI-BASIC ของฉัน mean(X)+i*(X-mean(X))คำนวณ

,;Σ½;)±+ï*+

คำอธิบาย:

,           Read input
;           Duplicate
Σ½          Half the sum (the mean) of the top copy
;           Copy the mean
)           Rotate stack to the left
            Now there's a copy of the mean on the bottom
±+          Negate mean and add to input list
ï*          Multiply by i
+           Add to mean

การป้อนข้อมูลเป็นรายการของทั้งสองตัวเลขที่ซับซ้อน: และการส่งออกในรูปแบบเดียวกัน:[1-1j,4+2j][(4-1j), (1+2j)]


3
ผมภูมิใจมากเลย ...
ชำเลืองไปที่

หลังจากโพสต์คำตอบนี้แล้ว Mego จะเพิ่มæค่าเฉลี่ยของรายการและทำให้î(คูณด้วยตัวเอง) ทำให้เวกเตอร์ยอมให้มีการแก้ปัญหาแบบ 9 ไบต์ที่ไม่ใช่คู่แข่ง จริงจังเริ่มเป็นภาษาที่ดีอย่างจริงจัง
lirtosiast

ภาษาที่ดี "จริงจัง" @ThomasKwa
Addison Crump

ไม่ใช่Σ2 ไบต์?
Ash Burlaczenko

@AshBurlaczenko ดูเหมือนจะใช้การเข้ารหัส CP437 อย่างจริงจังซึ่งΣมีจุดรหัส 0xF4
เดนนิส

6

อย่างจริงจัง 25 ไบต์

,i││-++½)+-+½)++-½)±+++½)

รับอินพุตเป็นรายการ: [x1,y1,x2,y2]

กลยุทธ์เดียวกับคำตอบของ Python แต่อย่างจริงจัง!

คำอธิบาย:

,      get input
i      flatten list
││     duplicate stack twice, so that we have 4 copies of the input total
-++½)  calculate the first x-value using the formula (x1-y1+x2+y2)/2, and shove it to the end of the stack
+-+½)  calculate the first y-value using (x1+y1-x2+y2)/2, and shove it to the end of the stack
++-½)  calculate the second x-value using (x1+y2+x2-y2)/2, and shove it to the end of the stack
±+++½) calculate the second y-value using (-x1+y1+x2+y2)/2, and shove it to the end of the stack

ลองออนไลน์


3
นี้จะจริงจังเย็น! (ตั้งใจเล่นปัน)
kirbyfan64sos

5

TI-BASIC ขนาด 16 ไบต์

สำหรับเครื่องคิดเลขชุด TI-83 + หรือ 84+

Input X
i∟X+.5sum(∟X-i∟X

นอกเสียจากว่าฉันเข้าใจผิด OP บอกว่าพวกเขาใช้ได้ดีกับการป้อนข้อมูลและเอาท์พุทเป็นตัวเลขที่ซับซ้อน iนี่คือหน่วยจินตภาพไม่ตัวแปรสถิติ

TI-BASIC มีmean(ฟังก์ชั่น ERR:DATA TYPEแต่รำคาญมันไม่ทำงานกับรายการที่ซับซ้อนการขว้างปา

ป้อนข้อมูลในแบบฟอร์มสำหรับ{1-i,4+2i} [[1,-1],[4,2]]เอาท์พุทเป็นในรูปแบบสำหรับ{4-i 1+2i}[[1,2][4,-1]]


สิ่งนี้เตือนฉันว่า TI-BASIC ไม่สนับสนุนรายการสตริง นั่นอาจเป็นสิ่งหนึ่งที่ฉันจะเพิ่มใน TI-BASIC: P
Conor O'Brien

4

Matlab, 51 45 46 45 42 ไบต์

ตอนนี้อินพุตถูกคาดหวังในเวกเตอร์คอลัมน์เดียว: [x0;y0;x1;y1](ouput ในรูปแบบเดียวกัน) ฉันเพิ่งแก้ไขให้เป็นโปรแกรมแบบเต็ม

z=eye(4);disp((.5-z([2:4,1],:))*input(''))

หรืออีกวิธีหนึ่ง

z=[1,1;-1,1];disp([z',z;z,z']*input('')/2)

โซลูชันเก่า:

อินพุตคาดหวังเวกเตอร์คอลัมน์เช่น f([0;0],[3;3])

@(a,b)[0,1;-1,0]*(b-a)*[.5,-.5]+(b+a)*[.5,.5]

นอกจากนี้ยังส่งคืนคอลัมน์เวกเตอร์สองคอลัมน์ (เป็นเมทริกซ์ 2x2)


3

Japt 29 29ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม

1o5 mZ=>$eval$(Uq'+)/2-UgZ%4

โปรดทราบว่าฟังก์ชั่นลูกศรต้องการเบราว์เซอร์ที่สอดคล้องกับ ES6 เช่น Firefox รุ่นใหม่ การป้อนข้อมูลไปในการเป็น array 4 [1,-1,4,2]รายการเช่น

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

         // Implicit: U = input array
1o5      // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=>     // Map each item Z in this range to:
$eval$(  //  evaluate:
 Uq'+    //   U joined with "+" (equivalent to summing U)
)/2      //  divided by 2,
-UgZ%4   //  minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
         //  which in turn tranlsates to:
         //   [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
         //  which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
         // Implicit: Output last expression

มันเป็นอย่างไรกอล์ฟ

ฉันลองเพียงคัดลอกวิธีของ Python ของ @ Mego สิ่งนี้ทำให้ฉันกับสัตว์ประหลาดขนาด 48 ไบต์:
(หมายเหตุ: ข้อมูลที่ไม่ควรถูกห่อในอาร์เรย์ในขณะนี้)

[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]

เนื่องจากแต่ละรายการเหล่านี้จะต้องหารด้วย 2 จึงสั้นกว่าในการจับคู่อาร์เรย์ทั้งหมดด้วยmY=>Y/2:

[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2

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

[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

ดีบันทึกไบต์! แต่เป็นไปได้ไหมที่จะลดขนาดอาเรย์ในตอนเริ่มต้น? ลองบรรจุลงในสตริงแล้วแยกกลับเข้าไปในอาเรย์ด้วยa:

"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

ดูนั่นบันทึกอีกหนึ่งไบต์ แต่มีวิธีที่ดีกว่า เราสามารถใช้ความจริงที่[1,2,3,0] ≡ [1,2,3,4] mod 4:

1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4

อีกสองไบต์! ตอนนี้เรากำลังจะไปที่ไหนสักแห่ง แต่นั่นUg0 +Ug1 +Ug2 +Ug3เป็นพื้นที่กว้างมาก ถ้าเราลดอาร์เรย์ด้วยการบวก

1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4

ว้าวนั่นช่วยได้จริงๆ! ตอนนี้เราลดเหลือ 29 ไบต์ และต้องขอบคุณ @ ןnɟuɐɯɹɐןoɯฉันยังสามารถเล่นกอล์ฟอีกหนึ่งไบต์จากการลด แต่ถ้าเราสามารถใช้บิวด์อินเพื่อรวมอาเรย์มันจะสั้นกว่า:

1o5 mZ=>Uu /2-UgZ%4

19 ไบต์! ! ที่น่าตื่นตาตื่นใจ น่าเสียดายที่ Japt ยังไม่มีบิวด์อินดังกล่าว ฉันจะเพิ่มสิ่งนี้ในเมื่อฉันมีโอกาส ข้อเสนอแนะยินดีต้อนรับสำหรับทั้งโปรแกรมหรือภาษา!


ในฐานะของ v1.4.4 ฉันได้ใช้คุณสมบัติเพิ่มเติมเล็กน้อยใน Japtor กว่าที่ฉันเคยวางแผนไว้ เริ่มต้นด้วยแผนดั้งเดิมสำหรับเวอร์ชันที่สั้นกว่า:

1o5 mZ=>Uu /2-UgZ%4

ครั้งแรกที่เราจำเป็นต้องเปลี่ยนแปลงบางสิ่ง: ฟังก์ชั่นจะถูกกำหนดด้วยและฟังก์ชั่นรวมเป็น{ xรุ่นนี้ทำงานตามที่เป็นอยู่:

1o5 mZ{Ux /2-UgZ%4

ตอนนี้@เป็นชวเลขXYZ{ที่ช่วยให้เราประหยัดไบต์โดยเปลี่ยนจากการZ Xนอกจากนี้ยัง£เป็นทางลัดสำหรับm@บันทึกไบต์อื่น:

1o5 £Ux /2-UgX%4

เมื่อเร็ว ๆ นี้ฉันได้ติดตั้งฟีเจอร์ที่Uมักจะเป็นจุดเริ่มต้นของโปรแกรม อย่างไรก็ตามเนื่องจากข้อผิดพลาดในการใช้งานสิ่งนี้ยังทำงานได้กับฟังก์ชัน

1o5 £x /2-UgX%4

ในที่สุดgตอนนี้ฟังก์ชั่นจะตัดถ้าดัชนีผ่านจุดสิ้นสุดของสตริงทำให้เราสามารถลบออกได้%4ทั้งหมด13 ไบต์ :

1o5 £x /2-UgX

และฉันคิดว่า 19 คนน่าทึ่ง ;-) ทดสอบออนไลน์!


คุณสามารถอาจบันทึกไบต์บางอย่างโดยใช้เทียบเท่า Japt eval(U.join`+`)ของ
Mama Fun Roll

ฉันรักภาษานี้: D
เฟส

@ ןnɟuɐɯɹɐןoɯขอบคุณแม้ว่าฉันยังไม่ได้เพิ่มที่evalเทียบเท่าที่จริงบันทึกไบต์!
ETHproductions

2

Javascript (Node.js / ES6), 154 ไบต์

process.stdin.on('data',s=>(s=s.toString().split(','),a=s[0]-0,b=s[1]-0,x=s[2]-0,y=s[3]-0,console.log([a+(c=(a+x)/2-a)+(d=(b+y)/2-b),b+d-c,a+c-d,b+d+c])))

รับ stdin เป็นส่วนหนึ่งของรหัสอีกต่อไป การป้อนข้อมูลควรเป็นจุดที่คั่นด้วยเครื่องหมายจุลภาค:

echo "0,0,3,3" | node square.js

นี่เป็นโปรแกรมเต็มหรือไม่? จุดใดที่ให้คะแนนไปที่ STDOUT ... ดูเหมือนจะไม่เป็นเช่นนั้น
Yytsi

คุณถูก.
ห่า

แก้ไขแล้ว เกือบจะนานกว่านี้อีก 3 เท่า :(
Naouak

อืม: / ฉันยังคงคิดว่าประเด็นคือการสร้างรหัสศิลปะที่สวยงามที่ทำงานได้ดี และรหัสที่คุณให้มานั้นดูซับซ้อนและหล่อมาก :) ขอบคุณที่เข้าร่วม!
Yytsi

2

ngn APL, 21 ไบต์

⎕←F.5 0J.5×(F←+/,-/)⎕

สิ่งนี้จะรับอินพุตเป็นคู่ของจำนวนเชิงซ้อน (เช่น, 1J¯1 4J2) และพิมพ์เอาต์พุตในลักษณะเดียวกัน (เช่น, 4J¯1 1J2) ลองใช้ออนไลน์ในNGN / APL สาธิต


ใช้งานได้กับอินพุตบวกทั้งหมด แต่จะไม่แสดงผลใด ๆ เมื่อฉันป้อนจำนวนลบ ฉันเข้ามาในรูปแบบที่ไม่ถูกต้องหรือไม่? 1J1 3J3 ใช้งานได้ 0J-1 0J1 ไม่ได้ ฉันพยายามใช้สัญลักษณ์ลบด้านบนเพื่อประกาศจำนวนการปฏิเสธ
Yytsi

@ TuukkaX เครื่องหมายลบสูงที่สุดในทางที่จะไป ฉันรับเอาต์พุต1 ¯1สำหรับอินพุต0J¯1 0J1ซึ่งเป็นคำตอบที่ถูกต้อง คุณได้อะไร
เดนนิส

1
โอ้ตอนนี้ฉันทำงานได้แล้ว ฉันแค่ต้องลบช่องว่างเล็ก ๆ ก่อนที่เครื่องหมายลบสูง มันทำงานและมีคุณสมบัติ
Yytsi



1

CJam, 30 ไบต์

q~_:.+\:.-(W*+_2$.+@@.-].5ff*`

ลองออนไลน์

สิ่งนี้รับอินพุตเป็นรายการของรายการเช่นสำหรับตัวอย่างล่าสุด:

[[0 -1] [0 1]]

คำอธิบาย:

q~      Get and interpret input.
_       Make a copy.
:.+     Reduce the list of two points with vector sum operator.
\       Swap copy of input to top.
:.-     Reduce the list of two points with vector difference operator.
(W*+    Turn (x, y) into orthogonal (y, -x) by popping off first element, inverting
        its sign, and concatenating again. We now have center and offset vector.
_2$     Create a copy of both...
.+      ... and add them.
@@      Rotate original values to top...
.-      ... and subtract them.
]       Wrap the two results...
.5ff*   ... and multiply all values by 0.5.
`       Convert list to string.

1

Prolog, 118 ไบต์

p([A,B],[C,D]):-read([E,F,G,H]),I is(E+G)/2,J is(F+H)/2,K is(G-E)/2,L is(H-F)/2,A is I-L,B is J+K, C is I+L, D is J-K.

อ่านง่ายขึ้นเล็กน้อย:

p([A,B],[C,D]):-read([E,F,G,H]),
                        I is(E+G)/2,
                        J is(F+H)/2,
                        K is(G-E)/2,
                        L is(H-F)/2,
                        A is I-L,
                        B is J+K, 
                        C is I+L, 
                        D is J-K.

ในการเริ่มต้นโปรแกรม:

p(X,Y).

อินพุตตัวอย่างเมื่อมุมที่รู้จักคือ [1, -1] [4, 2]:
[1, -1,4,2]

ตัวอย่างเอาต์พุตโดยที่ X และ Y จะมีมุมที่ไม่รู้จัก:
X = [1.0, 2.0],
Y = [4.0, -1.0]

ลองออนไลน์ได้ที่นี่

แก้ไข:เปลี่ยนเพื่ออ่านอินพุตจาก STDIN


สิ่งนี้อ่านจาก STDIN และพิมพ์ไปยัง STDOUT ... หรือไม่
Yytsi

@ TuukkaX: อาจจะไม่ มันจะใส่ในรูปแบบของแบบสอบถาม ฉันอ่านส่วนที่กล่าวว่าอินพุตอาจเป็นรูปแบบใดก็ได้ที่เราต้องการ ฉันพลาดส่วนเกี่ยวกับ STDIN ไม่แน่ใจด้วยซ้ำว่า STDIN ใน Prolog คืออะไร การอ่านอินพุตจากผู้ใช้ตกลงไหม
Emigna

STDIN ย่อมาจากอินพุตมาตรฐาน ดังนั้นการอ่านจากผู้ใช้เป็นวิธีที่จะไป :) และตามรูปแบบฉันหมายถึงวิธีที่ผู้ใช้ป้อนค่า ตัวอย่าง [x, y] [x, y] หรือ {x, y} ...
Yytsi

0

Python 3, 102 ไบต์

g=lambda a,b,c,d:((a-b+c+d)/2,(a+b-c+d)/2,(a+b+c-d)/2,(d+b-a+c)/2)
print(g(*map(float,input().split())))

อินพุตถูกใช้ในแบบฟอร์มx1 y1 x2 y2บนบรรทัดเดียว

ลองออนไลน์


คุณทำอะไรผิดนับจำนวนไบต์ของคุณเพิ่มขึ้นด้วยการแก้ไขแต่ละครั้ง แต่ฉันพยายามที่จะลดจำนวนไบต์ลงด้วยการแก้ไขแต่ละครั้ง = P
ข้อบกพร่อง

8
@flawr ฉันเป็นผู้ต่อต้านเดนนิส
Mego

ฉันเชื่อว่าคำตอบทั้งหมดต้องเป็นโปรแกรมเต็มรูปแบบรับข้อมูลจาก STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) มีคุณสมบัตินี้ไหม
ETHproductions

0

Python 2, 56 ไบต์

i=input()
s=sum(i)/2.0
print s-i[1],s-i[2],s-i[3],s-i[0]

อินพุตอาจเป็นx1,y1,x2,y2หรือ(x1,y1,x2,y2)

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