Я строю гигантского робота Lego, и мне нужно сгенерировать некоторые конкретные передаточные числа, используя набор передач. У меня много передач с общими размерами лего: 8, 16, 24 или 40 зубьев. Напишите программу, которую я могу использовать, где я вводю передаточное число, и программа говорит мне, какую комбинацию шестерен я должен использовать, чтобы получить требуемое передаточное число.
Отношение ввода будет указано на стандартном вводе (или эквиваленте вашего языка) с двумя целыми числами, разделенными двоеточием. Соотношение a:b
означает, что выходной вал должен вращаться a/b
так же быстро, как и входной вал.
Вывод в стандартный вывод должен быть отдельной строкой, содержащей разделенный пробелами список передаточных чисел, в виде x:y
где x
- размер шестерни на входном валу и y
размер шестерни на выходном валу. Вы должны использовать минимально возможное количество передач для данного передаточного числа. Каждый x
и y
должен быть одним из 8,16,24,40
.
Примеры:
1:5 -> 8:40
10:1 -> 40:8 16:8
9:4 -> 24:16 24:16
7:1 -> IMPOSSIBLE
7:7 ->
6:15 -> 16:40
Если желаемое передаточное число невозможно, выведите «Невозможно». Если никаких передач не требуется, выведите пустую строку.
Это код гольф, самый короткий ответ выигрывает.
1:5 -> 8:40
и10:1 -> 40:8
имеет смысл, но другие не так много.1:5
означает, что выходной вал вращается в 5 раз медленнее, и на этом происходит 8-зубчатая передача на входе и 40-зубчатая передача на выходе.10:1 -> 40:8 16:8
не то, что ты сказал. Что насчет других смущает вас?9:4
реализован, делая3:2
дважды.3:2
реализуется с помощью24:16
.7:7
так же, как1:1
, так что не требует никаких механизмов для реализации.Ответы:
Питон - 204
Хорошо, я пойду первым:
редактировать:Чтобы «оптимизировать» вывод, это можно добавить перед
print
оператором,доведя общее количество до 266 символов , я считаю.
источник
<1
можно заменить==0
. Такжеif b:a=...return a
может бытьreturn b and...or a
.23:12
.elif i!=1:return[]
к оригиналу решает проблему, но вводит другую.$ python gears.py <<< 21:28
=>24:16
.. Я собираюсь разобраться в этом. Похоже, что проблема была не так проста: D Я думаю, что код должен быть еще длиннее, или мне нужен другой подход.6:15
может быть сделано,16:40
но ваш код возвращается24:40 16:24
.Perl -
310 306 294 288272Я немного заржавел с Perl и никогда не занимался гольф-кодом ... но никаких оправданий. Счетчик символов без разрывов строки. Использование perl v5.14.2.
Я с нетерпением жду критиков и намеков. Не так просто найти советы и рекомендации по коду-гольфу (в Perl).
источник
$1:$2 ->
, это не требуется в выводе.$a[$_]=8 if!$a[$_];
до$a[$_]||=8;
($v,$n)=split/:|\s/,<>;
(не проверено).swi-prolog,
324250248204 байтаПролог неплохо справляется с такой проблемой.
Ввод передается как параметр-термин для предиката
m
. Вывод записывается в стандартный вывод. Извините за конечный «правда»; это просто способ переводчика, чтобы я знал, что все в порядке.источник
C,
246216213 байтовВ (бесполезной) попытке побить моё собственное решение Prolog, я полностью переписал решение C.
Мое оригинальное решение C (246 байт):
Это было хорошее упражнение, чтобы доказать, что это можно сделать без создания списков.
источник
Pyth, 101 байт
(Почти наверняка неконкурентоспособен в конкурсе, поскольку использует язык более новый, чем сентябрь / 2012)
Реализация @daniero 'python answer, но полуоптимизированная для Pyth .
Попробуй здесь
Или проверить каждый случай
источник
ES6, 230 байт
Один из моих самых длинных гольфов, так что я, должно быть, сделал что-то не так ... Ungolfed:
источник