Круг лабиринт 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 >= 1и m >= 0.

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

Geobits
источник
Msgstr "Поведение не определено для неверного ввода." << - Это нужно поставить во все головоломки!
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$-

Количество ходов на входе отбрасывается, ed стандартного ввода указывает на конец ходов.

user2846289
источник
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}

РЕДАКТИРОВАТЬ : Вот анимированный пример, доказывающий, что этот решатель работает: 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.
Майкл М.
Я не указал полную программу, поэтому не вижу проблем только с функцией. Тем не менее, вход будет определен как отделены друг от друга символами новой строки, уже не расположены в родные массивы. Это должно быть просто удовлетворить.
Geobits
1
@Geobits, я изменю это позже, взгляните на эту скрипку: jsfiddle.net/F74AP/1
Майкл М.
1
@ Geobits, верно! Простая ошибка знака ... Исправлено ;-)
Майкл М.