Công cụ kiểm tra vòng tròn mê cung


12

Bạn có biết những đồ chơi bằng gỗ với vòng bi nhỏ nơi đối tượng di chuyển xung quanh mê cung không? Đây là một loại như thế. Đưa ra một mê cung và một loạt các động tác, xác định nơi bóng kết thúc.

Bảng được giữ theo chiều dọc, và quả bóng chỉ di chuyển bằng trọng lực khi bảng được xoay. Mỗi "di chuyển" là một vòng quay (tính bằng radian).

Mê cung chỉ đơn giản là những bức tường tròn đồng tâm, với mỗi bức tường có chính xác một cửa mở ra hành lang bên ngoài, tương tự như thế này (giả sử những bức tường đó là hình tròn và không nhọn):

mê cung

Như bạn có thể thấy, bóng bắt đầu ở giữa và đang cố gắng thoát ra. Quả bóng sẽ ngay lập tức rơi qua ngay khi đạt được hướng chính xác, ngay cả khi nó ở giữa một vòng quay. Một vòng quay duy nhất có thể làm cho quả bóng rơi qua nhiều lỗ. Chẳng hạn, một vòng quay >= n * 2 * pilà đủ để thoát khỏi bất kỳ mê cung nào.

Đối với mục đích của trò chơi, một quả bóng nằm trong 0.001radian của lỗ mở được coi là "phù hợp" và sẽ rơi qua hành lang tiếp theo.

Đầu vào:

Đầu vào gồm hai phần:

  • Mê cung được đưa ra bởi một số nguyên nbiểu thị có bao nhiêu bức tường / khe hở trong mê cung. Điều này được theo sau bởi ncác dòng, với một số trên mỗi, đại diện cho nơi lối đi đến hành lang tiếp theo.

  • Các bước di chuyển được đưa ra dưới dạng một số nguyên mbiểu thị số lần di chuyển được thực hiện, tiếp theo (một lần nữa trên các dòng riêng biệt) bằng cách mxoay theo chiều kim đồng hồ của bảng theo radian (âm là ngược chiều kim đồng hồ).

Tất cả các vị trí thông qua được đưa ra như 0 rad = up, với radian tích cực đi theo chiều kim đồng hồ.

Đối với hình ảnh mẫu ở trên, đầu vào có thể trông như thế này:

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

Đầu ra: Xuất số hành lang mà bóng kết thúc. Hành lang được lập chỉ mục bằng không, bắt đầu từ tâm, vì vậy bạn bắt đầu vào 0. Nếu bạn đi qua một lối mở, bạn đang ở trong hành lang 1. Nếu bạn thoát khỏi toàn bộ mê cung, hãy xuất bất kỳ số nguyên nào>= n

Đối với đầu vào mẫu, có ba di chuyển. Việc đầu tiên sẽ làm cho quả bóng rơi qua hai lần mở. Cái thứ hai không tìm thấy một cái mở, và cái thứ ba tìm thấy một cái mở . Quả bóng đang ở trong hành lang 3, vì vậy đầu ra dự kiến ​​là:

3

Hành vi không được xác định cho đầu vào không hợp lệ. Đầu vào hợp lệ được hình thành tốt, với n >= 1m >= 0.

Ghi điểm là mã golf tiêu chuẩn, số byte thắng thấp nhất. Sơ hở tiêu chuẩn bị cấm. Đầu vào không được mã hóa cứng, nhưng có thể được lấy từ đầu vào tiêu chuẩn, đối số, bàn điều khiển, v.v. Đầu ra có thể là bàn điều khiển, tập tin, bất cứ thứ gì, chỉ cần làm cho đầu ra ở đâu đó hiển thị.


"Hành vi không được xác định cho đầu vào không hợp lệ." << - Điều này cần phải được đặt trong tất cả các câu đố!
TheDoctor

Trong trường hợp giả thuyết đó, bạn cũng có thể tính toán bất cứ khi nào cần thiết với độ chính xác thay đổi, nâng cao độ chính xác cho đến khi đủ để biết bóng có rơi hay không. Một vấn đề tôi gặp phải với khả năng chịu đựng sự phù hợp (hoặc ít nhất là từ ngữ hiện tại của nó) là nếu A) các khớp nối liên tiếp gần hơn 0,001 với nhau sao cho bóng chỉ rơi hai cấp nếu dung sai được tính đến B) khi quả bóng nằm trong 0,001 của một lỗ, nó nhảy vào lỗ (nếu bạn thực sự muốn đọc một cái gì đó vào từ ngữ).
Wrzlprmft

@Wrzlprmft Quả bóng không nhảy vào lỗ. Hãy nghĩ về ngưỡng có nghĩa là các lỗ rộng hơn một chút so với quả bóng. Nó vẫn rơi xuống cùng một vị trí, chỉ một cấp độ nữa. Nếu bạn tưởng tượng ngưỡng là 1, bạn sẽ chỉ làm việc với các lỗ lớn, không nhảy quả bóng vào giữa lỗ khi chúng rơi.
Geobits

Tại sao đầu vào trong một định dạng bất tiện như vậy? Tôi khá chắc chắn rằng tôi đã chơi toàn bộ các chương trình ngắn hơn những gì tôi cần đọc: /
Tal

Câu trả lời:


2

Perl, 211 191

Với dòng mới và thụt lề cho dễ đọc:

$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$-

Số lượng di chuyển trong đầu vào bị loại bỏ, eof của stdin cho biết kết thúc di chuyển.


5

JavaScript 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}

EDIT : Đây là một ví dụ hoạt hình chứng minh rằng bộ giải này hoạt động: http://jsfiddle.net/F74AP/4/

hoạt hình

Hàm phải được gọi là truyền chuỗi đầu vào.
Đây là cuộc gọi của ví dụ được đưa ra bởi OP:

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

Nó trả lại 3như dự định.


2
Từ thử thách, "... đầu vào không được mã hóa cứng ..." . Trừ khi tôi nhầm, điều đó có nghĩa là bạn phải đọc nó và bạn cũng phải có một chương trình hoàn chỉnh. Đây trông giống như một chức năng.
Rainbolt

2
Tôi không hiểu, các giá trị không được mã hóa cứng! "... Đầu vào không được mã hóa cứng, nhưng có thể được lấy từ đầu vào tiêu chuẩn, đối số, bàn điều khiển, v.v. ". Liên quan đến chương trình hoàn chỉnh , tôi không thấy nó được chỉ định ở đâu và dù sao, IMO đây là một giải pháp JS hoàn chỉnh.
Michael M.

Tôi đã không chỉ định một chương trình đầy đủ, vì vậy tôi thấy không có vấn đề gì với một chức năng. Tuy nhiên, đầu vào được chỉ định là được phân tách bằng các dòng mới, chưa được sắp xếp thành các mảng gốc. Điều đó nên đơn giản để đáp ứng.
Geobits

1
@Geobits, tôi sẽ sửa đổi nó sau, hãy xem fiddle này: jsfiddle.net/F74AP/1
Michael M.

1
@Geobits, đúng rồi! Lỗi ký hiệu đơn giản ... Đã sửa ;-)
Michael M.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.