คำนวณตัวเลขที่คดเคี้ยว


15

หมายเลขคดเคี้ยวคือหมายเลขจำนวนเต็มของการหมุนวนทวนเข็มนาฬิกาสุทธิผู้สังเกตการณ์ต้องทำตามเส้นทางปิดที่กำหนด โปรดทราบว่าการหมุนตามเข็มนาฬิกาใด ๆ นับว่าเป็นลบต่อจำนวนคดเคี้ยว เส้นทางได้รับอนุญาตให้ตัดกันด้วยตนเอง

ตัวอย่างบางส่วน (นำมาจากวิกิพีเดียลงคอ) ได้รับด้านล่าง:

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

เป้าหมายของคุณคือการคำนวณหมายเลขที่คดเคี้ยวสำหรับเส้นทางที่กำหนด

อินพุต

(0,0)ผู้สังเกตการณ์จะถือว่าเป็นที่แหล่งกำเนิด

อินพุตเป็นลำดับที่แน่นอนของคะแนน (เหมือนคู่ของตัวเลขจำนวนเต็ม) จากแหล่งอินพุตที่ต้องการซึ่งอธิบายเส้นทางเชิงเส้นแบบชิ้นส่วน คุณสามารถทำให้แบนนี้เป็น 1D ตามลำดับของตัวเลขจำนวนเต็มหากต้องการและอาจ swizzle อินพุตเพื่อใช้พิกัด x ทั้งหมดก่อนที่พิกัด y ทั้งหมด / vise-versa a+b iนอกจากนี้คุณยังอาจใช้การป้อนข้อมูลเป็นตัวเลขที่ซับซ้อน เส้นทางอาจตัดกันด้วยตนเองและอาจมีเซ็กเมนต์ที่มีความยาวเป็นศูนย์ จุดแรกคือจุดเริ่มต้นของเส้นทางและคาดว่าจะอยู่ที่ไหนสักแห่งบนแกน x บวก

ไม่มีส่วนใดของเส้นทางที่จะตัดกันที่มา เส้นทางจะปิดตลอดเวลา (เช่นจุดแรกและจุดที่หายไปเหมือนกัน) รหัสของคุณอาจบ่งบอกถึงจุดสุดท้ายหรือต้องการให้รวมไว้

ตัวอย่างเช่นขึ้นอยู่กับความต้องการของคุณทั้งสองอินพุทให้ระบุสแควร์เดียวกัน

จุดสิ้นสุดโดยนัย

1,0
1,1
-1,1
-1,-1
1,-1

จุดสิ้นสุดที่ชัดเจน

1,0
1,1
-1,1
-1,-1
1,-1
1,0

เอาท์พุต

เอาท์พุทเป็นจำนวนเต็มเดียวสำหรับหมายเลขคดเคี้ยว สิ่งนี้อาจเป็นแหล่งที่มาใด ๆ (ค่าส่งคืน, stdout, ไฟล์, ฯลฯ )

ตัวอย่าง

ตัวอย่างทั้งหมดมีจุดสิ้นสุดที่กำหนดไว้อย่างชัดเจนและได้รับเป็นคู่ x, y คุณควรป้อนตัวอย่างเหล่านี้ลงในรหัสใด ๆ โดยตรงโดยสมมติว่าจุดสิ้นสุดที่กำหนดโดยปริยายและผลลัพธ์ควรเหมือนกัน

1. การทดสอบขั้นพื้นฐาน

1,0
1,1
-1,1
-1,-1
1,-1
1,0

เอาท์พุต

1

2. การทดสอบจุดซ้ำ

1,0
1,0
1,1
1,1
-1,1
-1,1
-1,-1
-1,-1
1,-1
1,-1
1,0

เอาท์พุต

1

3. การทดสอบตามเข็มนาฬิกา

1,0
1,-1
-1,-1
-1,1
1,1
1,0

เอาท์พุต

-1

4. นอกการทดสอบ

1,0
1,1
2,1
1,0

เอาท์พุต

0

5. คดเคี้ยวผสม

1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,-1
-1,-1
-1,1
1,1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,1
-1,1
-1,-1
1,-1
1,0

เอาท์พุต

2

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

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


2
สามารถนำเข้าเป็นตัวเลขที่ซับซ้อน (หรือการแสดงสตริงของพวกเขาเช่น"1-i"หรือ"1-1i"?)
ระดับแม่น้ำเซนต์

ใช่อนุญาตให้ใช้ประเภทใดก็ได้
helloworld922

คำตอบ:


10

ES6, 83 ไบต์

a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2

รับอินพุตเป็นอาร์เรย์ของคู่ของคะแนนที่ถูกตีความว่าเป็นจำนวนเชิงซ้อน แทนที่จะแปลงแต่ละจุดเป็นมุมคะแนนจะถูกหารด้วยจุดก่อนหน้าซึ่ง Math.atan2 จะแปลงเป็นมุมระหว่าง-πถึงπดังนั้นจึงกำหนดเส้นทางที่คดเคี้ยวโดยอัตโนมัติ ผลรวมของมุมคือ2πคูณจำนวนคดเคี้ยว

เนื่องจาก Math.atan2 ไม่สนใจขนาดของการโต้เถียงฉันไม่ได้ทำการหารเต็มรูปแบบz / w = (z * w*) / (w * w*)แทนฉันแค่คูณแต่ละจุดด้วยการรวมที่ซับซ้อนของจุดก่อนหน้า

แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ edc65


ดีและรวดเร็ว และฉันไม่เข้าใจคณิตศาสตร์ของคุณ แต่reduceมันก็เป็นทางเลือกที่ไม่ดี
edc65

a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2ใช้แผนที่แทนหรือลด คุณมีคะแนนของฉันอยู่แล้ว
edc65

@ edc65 ขอบคุณ; ฉันใช้reduceเพราะฉันไม่ทราบว่า Math.atan2 (0,0) คือ 0 (ก็ขึ้นอยู่กับว่าหนึ่งใน 0 ของคุณคือ -0 จริง ๆ ) คณิตศาสตร์นั้นขึ้นอยู่กับการแบ่งที่ซับซ้อนซึ่งโดยปกติจะคำนวณเป็นz / w = z * w* / |w|²แต่ฉันไม่สนใจขนาดดังนั้นมันก็แค่การคูณโดยคอนจูเกตที่ซับซ้อน Math.atan2 ที่สับสนเล็กน้อยก็ยอมรับอาร์กิวเมนต์ (y, x)
Neil

ฉันยอมรับว่าฉันไม่เข้าใจรหัส แต่ถ้าคำอธิบายของคุณถูกต้องฉันเชื่อว่าคำตอบของคุณผิด แน่นอนถ้าคุณป้อนจุดจากเส้นทางนี้ (ฉันให้ภาพเพื่อความชัดเจนมากขึ้น) ดังนั้นจำนวนคดเคี้ยวคือ 1 ในขณะที่ปัญหาของคุณจะออก 2
Wojowu

@ Wojowu ขออภัยฉันหมายถึงมุมระหว่างจุดที่วัดจากจุดกำเนิดแทนที่จะเป็นมุมภายนอกของรูปหลายเหลี่ยมดังนั้นสำหรับรูปภาพของคุณรหัสของฉันควรคำนวณคำตอบที่ 1
Neil

3

MATL 11 ไบต์

X/Z/0)2/YP/

อินพุตเป็นลำดับของตัวเลขที่ซับซ้อนรวมถึงจุดสิ้นสุด

ลองออนไลน์!

คำอธิบาย

งานส่วนใหญ่ทำโดยZ/ฟังก์ชั่น ( unwrap) ซึ่งทำให้มุมเป็นเรเดียนโดยการกระโดดข้ามสัมบูรณ์มากกว่าหรือเท่ากับ pi เป็นส่วนเสริม 2 * pi

X/       % compute angle of each complex number
Z/       % unwrap angles
0)       % pick last value. Total change of angle will be a multiple of 2*pi because 
         % the path is closed. Total change of angle coincides with last unwrapped
         % angle because the first angle is always 0
2/       % divide by 2
YP/      % divide by pi

1
MATL และ Jelly ได้เชื่อมโยงกับความท้าทายทางคณิตศาสตร์ส่วนใหญ่เมื่อไม่นานมานี้ ฉันประทับใจคุณได้ใช้ภาษาเดนนิสเกือบตีกอล์ฟ ...
ETHproductions

@ ETHproductions ขอบคุณสำหรับคำพูดดี ๆ ของคุณ! ใช่พวกเขาถูกผูกติดอยู่กับความท้าทายล่าสุด ในทางกลับกันฉันได้เห็นปัญหาค่อนข้างน้อยที่จำนวนไบต์ของ Jelly ประมาณครึ่งหนึ่งเมื่อ MATL :-D
Luis Mendo

2

เยลลี่ 11 ไบต์

æAI÷ØPæ%1SH

สิ่งนี้รับอินพุตเป็นรายการของพิกัด y และรายการพิกัด x

ลองมันนี่


1

Python, 111

คำตอบที่ยาวที่สุด แรงจูงใจของฉันคือ 1) เรียนรู้หลามและ 2) อาจจะบอกสิ่งนี้กับพี ธ

from cmath import *
q=input()
print reduce(lambda x,y:x+y,map(lambda (x,y):phase(x/y)/pi/2,zip(q[1:]+q[:1],q)))

อินพุตถูกกำหนดเป็นรายการของตัวเลขที่ซับซ้อน

Ideone

ฉันคิดว่าวิธีนี้คล้ายกับคำตอบ ES6

เมื่อจำนวนเชิงซ้อน 2 ตัวคูณอาร์กิวเมนต์หรือเฟสของผลิตภัณฑ์คือผลรวมของอาร์กิวเมนต์หรือเฟสของตัวเลขทั้งสอง ดังนั้นเมื่อจำนวนเชิงซ้อนหารด้วยอีกเฟสของความฉลาดจึงเป็นความแตกต่างระหว่างเฟสของตัวเศษและส่วน ดังนั้นเราสามารถคำนวณมุมที่เคลื่อนที่ผ่านสำหรับแต่ละจุดและจุดต่อไป รวมมุมเหล่านี้และหารด้วย2πให้จำนวนคดเคี้ยวที่ต้องการ

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