Circle Maze Checker


12

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

กระดานจะถูกจัดขึ้นในแนวตั้งและลูกบอลจะเคลื่อนที่ตามแรงโน้มถ่วงเมื่อกระดานหมุนเท่านั้น "การเคลื่อนที่" แต่ละครั้งเป็นการหมุน (เป็นเรเดียน)

เขาวงกตเป็นเพียงกำแพงวงกลมเป็นวงกลมโดยที่แต่ละกำแพงมีช่องเปิดหนึ่งช่องเข้าสู่ทางเดินด้านนอกเหมือนกับที่นี่ (ถือว่าผนังเหล่านั้นเป็นวงกลมและไม่แหลม):

เขาวงกต

อย่างที่คุณเห็นลูกบอลเริ่มตรงกลางและพยายามออกไป ลูกบอลจะล้มลงทันทีที่การวางแนวถูกต้องแม้ว่าจะผ่านการหมุน การหมุนครั้งเดียวอาจทำให้ลูกบอลตกผ่านช่องเปิดหลายช่อง ตัวอย่างเช่นการหมุน>= n * 2 * piก็เพียงพอที่จะหลบหนีเขาวงกตใด ๆ

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

การป้อนข้อมูล:

อินพุตอยู่ในสองส่วน:

  • เขาวงกตได้รับจากจำนวนเต็มที่nแสดงจำนวนกำแพง / ช่องเปิดในเขาวงกต ตามด้วยnบรรทัดโดยมีหนึ่งหมายเลขในแต่ละตัวแทนตำแหน่งที่ผ่านไปยังทางเดินถัดไป

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

ตำแหน่งทางเดินทั้งหมดได้รับเป็น0 rad = upโดยมีเรเดียนบวกตามเข็มนาฬิกา

สำหรับภาพตัวอย่างด้านบนอินพุตอาจมีลักษณะดังนี้:

7                        // 7 openings
0
0.785398163
3.14159265
1.74532925
4.71238898
4.01425728
0
3                        // 3 moves
-3.92699082
3.14159265
0.81245687

ขาออก0ขาออกจำนวนทางเดินที่ลูกปลายในทางเดินเป็นศูนย์การจัดทำดัชนีเริ่มต้นจากศูนย์เพื่อให้คุณเริ่มต้นใน. 1หากคุณผ่านหนึ่งเปิดคุณอยู่ในทางเดิน หากคุณหนีจากเขาวงกตทั้งหมดให้ออกจำนวนเต็มใด ๆ>= n

สำหรับอินพุตตัวอย่างมีสามการเคลื่อนไหว ครั้งแรกที่จะทำให้ลูกตกผ่านสองช่อง ที่สองไม่พบการเปิดและคนที่สามพบหนึ่ง ลูกบอลอยู่ในทางเดิน3ดังนั้นผลลัพธ์ที่คาดหวังคือ:

3

พฤติกรรมไม่ได้กำหนดไว้สำหรับการป้อนข้อมูลที่ไม่ถูกต้อง การป้อนข้อมูลที่ถูกต้องเป็นรูปแบบที่ดีด้วยและn >= 1m >= 0

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


"พฤติกรรมไม่ได้กำหนดไว้สำหรับอินพุตที่ไม่ถูกต้อง" << - สิ่งนี้ต้องใส่ในจิ๊กซอว์ทั้งหมด!
TheDoctor

ในกรณีสมมุติคุณสามารถคำนวณπเมื่อจำเป็นด้วยความแม่นยำของตัวแปรเพิ่มความแม่นยำจนกว่ามันจะเพียงพอที่จะบอกว่าลูกบอลตกลงมาหรือไม่ ปัญหาที่ฉันมีกับความอดทนสำหรับการสวมใส่ (หรืออย่างน้อยถ้อยคำปัจจุบัน) คือถ้า A) การสวมใส่ที่ต่อเนื่องกันอยู่ใกล้กว่า 0.001 ซึ่งกันและกันซึ่งลูกบอลตกลงเพียงสองระดับหากการยอมรับถูกนำมาพิจารณา B) เมื่อ ลูกบอลอยู่ในระยะ 0.001 ของหลุมมันกระโดดไปยังหลุม (ถ้าคุณต้องการอ่านอะไรบางอย่างในถ้อยคำ)
Wrzlprmft

@Wrzlprmft ลูกไม่กระโดดลงหลุม ให้นึกถึงขีด จำกัด ซึ่งหมายความว่าหลุมนั้นกว้างกว่าลูกบอลเล็กน้อย มันยังคงหยดผ่านไปยังตำแหน่งเดียวกันเพียงอีกหนึ่งระดับ หากคุณจินตนาการถึงขีด จำกัด1คุณจะต้องทำงานกับหลุมขนาดใหญ่ไม่ใช่การกระโดดลูกบอลไปที่กึ่งกลางของหลุมเมื่อมันตกลงมา
Geobits

ทำไมอินพุตในรูปแบบที่ไม่สะดวกเช่นนี้? ฉันค่อนข้างมั่นใจว่าฉันเล่นกอล์ฟทั้งโปรแกรมสั้นกว่าที่ฉันต้องการอ่าน: /
Tal

คำตอบ:


2

Perl, 211 191

ด้วยการขึ้นบรรทัดใหม่และการเยื้องเพื่อให้อ่านง่าย:

$p=atan2 0,-1;
@n=map~~<>,1..<>;
<>;
while(<>){
    $_=atan2(sin,cos)for@n;
    $y=abs($n[$-]+$_)<$p-.001
        ?$_
        :($_<=>0)*$p-$n[$-];
    $_+=$y for@n;
    $p-.001<abs$n[$-]&&++$-==@n&&last;
    $_-=$y;
    .001<abs&&redo
}
print$-

จำนวนการเคลื่อนไหวในอินพุตถูกยกเลิก eof ของ stdin หมายถึงการสิ้นสุดการเคลื่อนไหว


5

จาวาสคริปต์ 200

function f(i){with(Math)for(m=i.split('\n'),o=m.slice(1,t=+m[0]+1),m=m.slice(t+1),c=PI,p=2*c,r=0,s=1e-3;m.length;c%=p)abs(c-o[r])<s?r++:abs(t=m[0])<s?m.shift(c+=t):(b=t<0?-s:s,c+=p-b,m[0]-=b);return r}

แก้ไข : นี่คือตัวอย่างภาพเคลื่อนไหวที่พิสูจน์ว่าตัวแก้ปัญหานี้ใช้งานได้: http://jsfiddle.net/F74AP/4/

ภาพเคลื่อนไหว

ฟังก์ชั่นจะต้องเรียกว่าผ่านสายป้อน
นี่คือตัวอย่างของ OP ที่ได้รับ:

f("7\n0\n0.785398163\n3.14159265\n1.74532925\n4.71238898\n4.01425728\n0\n3\n-3.92699082\n3.14159265\n0.81245687");

มันกลับมา3ตามที่ตั้งใจไว้


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

2
ฉันไม่เข้าใจค่าไม่ได้เป็นรหัสยาก! "... อินพุตจะต้องไม่ถูกกำหนดค่าตายตัวแต่สามารถนำมาจากอินพุตมาตรฐานอาร์กิวเมนต์คอนโซล ฯลฯ " เกี่ยวกับโปรแกรมที่สมบูรณ์ฉันไม่เห็นว่ามันถูกระบุไว้ที่ใดและ IMO นี้เป็นโซลูชัน JS ที่สมบูรณ์
Michael M.

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

1
@Geobits ฉันจะแก้ไขในภายหลังได้ดูซอนี้: jsfiddle.net/F74AP/1
Michael M.

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