Коло лабіринт


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 >= 1і m >= 0.

Підрахунок балів - це стандартний код гольфу, найменша кількість виграних байтів. Стандартні лазівки заборонені. Введення даних не повинно бути жорстко закодованим, але його можна взяти зі стандартного вводу, аргументів, консолі тощо.


"Поведінка не визначена для недійсного введення." << - Це потрібно поставити у всіх пазлах!
TheDoctor

У цьому гіпотетичному випадку ви також можете обчислити π, коли це потрібно із змінною точністю, підвищуючи точність, поки не буде достатньо сказати, чи впав куля чи ні. Проблема, яку я маю з допуском до пристосування (або принаймні його поточної редакції), полягає в тому, що якщо A) послідовні приступи ближче один до одного 0,001, так що м'яч падає лише на два рівні, якщо допуск враховується В), коли куля знаходиться в межах 0,001 від отвору, вона стрибає в отвір (якщо ви дійсно хочете щось прочитати у формулюванні).
Wrzlprmft

@Wrzlprmft М'яч не стрибає в отвір. Подумайте, що поріг означає, що отвори трохи ширші, ніж куля. Він все ще провалюється до того ж місця, лише на один рівень далі. Якщо ви уявляєте, який був поріг 1, ви просто працювали з великими дірками, а не стрибаючи кулями до центру отвору, коли вони падають.
Геобіт

Чому введення в такому незручному форматі? Я майже впевнений, що я гольфував цілі програми коротше, ніж мені потрібно це прочитати: /
Тал

Відповіді:


2

Перл, 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$-

Кількість рухів на вході відміняється, ef stdin вказує на кінець ходу.


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 : Ось анімаційний приклад, який підтверджує, що цей вирішувач працює: http://jsfiddle.net/F74AP/4/

анімований

Функція повинна бути викликана передачею вхідного рядка.
Ось заклик прикладу, поданий ОП:

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.
Майкл М.

Я не вказав повну програму, тому не бачу жодної проблеми лише з функцією. Тим НЕ менше, вхід буде визначено як відокремлені один від одного символами нового рядка, вже не розташовані в рідні масиви. Це має бути простим для задоволення.
Геобіц

1
@Geobits, я зміню його пізніше, подивіться на цю загадку
Michael M.

1
@Geobits, правда! Проста помилка знаку ... Виправлена ​​;-)
Майкл М.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.