Это отверстие для мини-гольфа:
Внешняя граница представляет собой круг с радиусом 10 и центром (0,0). Внутренняя граница представляет собой круг с радиусом 3 и центром (0,5). Тройник в (0, -8). Предположим, что шар - это просто точка с радиусом 0.
Динамика мяча регулируется следующими правилами:
Мяч изначально поражен энергией 50 и с заданным углом.
- Угол отклоняется в декартовой системе координат, поэтому 0 ° означает прямо вправо, 90 ° - прямо вверх и т. Д.
Когда мяч ударяется о край внутреннего или внешнего круга, он отскакивает от круга, используя закон отражения.
Мяч теряет энергию при движении.
На каждую единицу земли, которую он покрывает, теряется 1 единица энергии.
Каждый раз, когда он отскакивает от стены, он теряет 5 единиц энергии.
Мяч останавливается, когда у него заканчивается энергия или когда он падает в лунку.
Если мяч ударяется о стену с энергией <= 5 единиц, он останавливается.
Он падает в отверстие, если у него есть энергия <10, когда он находится на расстоянии 1 от отверстия, в противном случае он продолжает двигаться.
Вызов
Учитывая координаты xy отверстия, верните угол, под которым вы можете ударить по мячу, чтобы шар упал в отверстие (если такой угол существует).
вход
В качестве входных данных возьмите x- и y-координаты центра отверстия в любой удобной форме. Входные данные могут быть взяты из STDIN (или ближайшей альтернативы), параметров командной строки или аргументов функции.
Выход
Напечатайте или верните угол в градусах, при котором шарик может попасть в тройник так, чтобы шарик упал в отверстие. Если такой угол существует, выходной сигнал должен находиться в диапазоне [0, 360), в противном случае выходной сигнал должен быть равен -1.
Ответы:
С
415430РЕДАКТИРОВАТЬ: Как упоминалось @Winny, выход значения выше 255 не представляется возможным, поэтому мне пришлось увеличить этот размер кода, чтобы напечатать значения до 360.
Предполагается 2 (и только 2) ввода командной строки (xy) как целые. Ответ в градусах печатается или -1, если степень не существует.
Ex.
Первый раз игрок в гольф; возможно, можно было бы немного улучшить. Если нам нужно больше точности, у меня есть версия, которая принимает xy и возвращает угол с двойным числом, работая с точностью 0,01 градуса при 449 символах.
Читаемая версия:
источник
exit(code)
. Протестировано на Linux и FreeBSD черезecho 'int main(){return 300;}' > test.c && cc test.c && ./a.out; echo $?
.