Вдохновленный вызовом коэффициента передачи Lego Китом Рэндаллом.
Я также планирую построить гигантского робота Lego, который в конечном итоге сможет уничтожить других роботов в ранее не упоминавшемся соревновании. * В процессе создания робота я буду использовать множество зубчатых передач для соединения разные части робота. Я хочу, чтобы вы написали мне самую короткую программу, которая поможет мне построить сложные зубчатые передачи, необходимые для такой сложной задачи. Я, конечно, буду использовать только шестерни с радиусами 1, 2, 3 и 5 произвольных лего.
Каждое зубчатое колесо в зубчатой передаче имеет определенную целочисленную координату на двумерной сетке. Первая передача расположена в точке (0,0), а последняя - в неотрицательных координатах. Местоположение и размер первой и последней шестерен будут предоставлены в качестве входных данных, ваша программа должна указать, какие шестерни идут, где заполнить пробелы.
Кроме того, ваша программа должна использовать минимально возможное количество передач в передаче. Меньше передач / поезд = больше поездов ** = больший и лучший робот разрушения.
Ввод будет состоять из одной строки:
X,Y,B,A
X и Y - координаты конечной передачи. Первая передача всегда находится в точке (0,0). B и A - радиусы конечной и начальной шестерен соответственно. Чтобы добавить некоторые трудности, вы должны убедиться, что выходное зубчатое колесо вращается в правильном направлении. Если A и B имеют одинаковый знак, то выходное зубчатое колесо должно вращаться в одном и том же направлении, и должно использоваться нечетное количество зубчатых колес. Если они имеют противоположные знаки, то необходимо использовать четное количество передач.
Выходными данными должен быть список местоположения X, местоположения Y и радиусов каждого дополнительного зубчатого колеса, по одному зубчатому колесу на линию. Если существует несколько решений с минимальной передачей, напечатайте только одно на ваш выбор. Порядок передач на выходе не имеет значения.
Примеры (возможны более эквивалентные решения):
in
4,0,1,1
out
2,0,1
in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line
in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5
in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!
Вот решения приведенных выше примеров, визуализированные:
Насколько я знаю, никакие проблемы невозможны, если две входные шестерни не перекрываются или не соединяются напрямую. Вам не придется иметь дело с этим.
Это код гольф, самый короткий ответ выигрывает.
* Будущий кот, кто-нибудь?
** Чу Чу !!
Ответы:
C #, 660 байт
Попробуйте онлайн
Это было очень весело! Завершить программу, принимает ввод из STDIN, вывод в STDOUT. Вывод шестерен в порядке от конца к началу. Использование:
Выполняет простой поиск в ширину, который решает проблему с 4 передачами менее чем за секунду. Фактор ветвления на самом деле не так уж велик, поэтому он должен быть полезен для значительно большего (на самом деле это не проверялось). К сожалению, он использует Linq.
Q
Строка представляет собой таблицу всех разрешенных зубчатых соединений (т.е.r=3
и подключение кr=1
еслиdx=4
иdy=0
) в одном квадранте, который затем поворачивается , чтобы найти другие. Каждый набор из 3 -х байт являетсяdx
,dy
и информация радиус правовой связи. Выбор(
смещения был очень осознанным: на этот раз было забавно выбрать символ ASCII для хороших свойств, а не отчаянно пытаться найти хорошие свойства для навязанных символов ASCII.Возможно, я лучше справлюсь с чтением входных данных, но мне пока не повезло, не в последнюю очередь потому, что Linq оплачивается необходимостью в списке. Я также очень разочарован кодом поворота, я чувствую, что это можно сделать за значительно меньшее количество байтов.
Отформатированный и закомментированный код с
Q
генератором:источник