Вдохновленный /puzzling//q/626
В своих приключениях вы попадете в серию из 7 мостов, которые вы должны пересечь. Под каждым мостом живет тролль. Чтобы пересечь мост, вы должны сначала дать троллю количество тортов в процентах от количества тортов, которые вы несете. Поскольку это добрые тролли, они вернут вам определенное количество тортов.
В начале каждого дня местный король троллей устанавливает процентный налог на торт, который должен платить каждый путешественник, и возврат тролля - количество тортов, которые каждый тролль должен вернуть путешественникам.
Ваша задача - рассчитать минимальное количество тортов, необходимое для прохождения всех 7 троллей-мостов для заданных условий в этот день.
Предполагать:
- Два входных параметра: процентный налог на торт (целое число от 0 до 100) и возврат тролля.
- Никто, даже тролли, не хочет торт, частично съеденный другим троллем. Если у вас останется кусок пирога, тролль получит его.
- Если тролль принимает налог с пирога, но затем должен вернуть вам все пироги (осталось столько же или меньше пирогов, чем раньше), он разозлится и съест вас и ваши пироги.
- У каждого тролля должен быть хотя бы один полный торт.
- Вы можете нести не более 100 тортов.
- Вам нужно закончить день, когда вы находитесь в данный момент или на другой стороне всех 7 мостов.
Вызов:
Напишите полную программу, чтобы вывести минимальное количество тортов для поездки на текущий день или ноль, если сегодня невозможно безопасно путешествовать - вы будете ждать, чтобы увидеть, какие цифры будут завтра.
Ввод должен быть передан как stdin, аргументы командной строки или файл.
Самый короткий код (число байтов) выигрывает.
Пример:
25% налог на торт, 2 тролля.
начать с 19 тортов
до тролля 1: (19 * 0,75) = 14,25
после тролля 1: (14 + 2) = 16
до тролля 2: (16 * 0,75) = 12
после тролля 2: (12 + 2) = 14
и т.п.
19 тортов -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 тортов -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (правило 3)
За 18 тортов последний тролль не сможет оставить себе тортов. Следовательно, минимальное количество тортов на 25% / 2 дня составляет 19.
input: 25 2
output: 19
Пример 2:
90% налог на торт, 1 возврат тролля
100 тортов -> 11 -> 2 -> 1 (правило 4)
Третий тролль не смог сохранить торт. Поэтому невозможно путешествовать на 90% / 1 день, даже начиная с максимального количества тортов.
input: 90 1
output: 0
Данные
Составьте быстрый график входных и выходных значений. Я был удивлен, что это не было «гладко» (как кривая колокола или подобное); Есть несколько заметных островов.
Данные для заинтересованных. Столбцы разделены на 5% интервалы, строки - это единицы с интервалами возврата 1 пирога (Excel повернул изображение). Вы можете видеть, что не может быть возврата выше, чем 28 тортов.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
11 пирогами вы даете троллю 2,75 пирога и получаете обратно 2, так что тролль держит 0,75 (+. 25), и вы выживаете. В случае с90 1
двумя пирогами вы даете троллю 1,8 и получаете обратно 1, так что тролль держит 0,8 (+ 2), но вы умираете.Ответы:
CJam,
46434139383633 байтаВвод через ARGV.
Есть онлайн-интерпретатор, но, к сожалению, он не поддерживает аргументы командной строки. Для тестирования вы можете имитировать его из STDIN с этой версией:
Объяснение версии на основе ARGV:
Содержимое стека автоматически печатается в конце программы.
источник
55 2
(0
вместо100
) и56 5
(98
вместо94
). Это потому, что100_0.55*-i
и25_0.56*-i
становятся жертвами неточностей с плавающей запятой. Насколько я могу судить, пары также31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
дают неверные результаты.CJam,
44 40 38 3735 байтИли при использовании аргументов командной строки и
{}#
трюка, 33 байта :Не ставить этот вопрос в качестве основного
{}#
подхода вдохновил ответ Мартина.Пример выполнения:
Входные данные:
Выход:
Другой:
Входные данные:
Выход:
Как это устроено
Попробуйте онлайн здесь
источник
]W=
трюк, но до сих пор, каждый раз, когда я пытаюсь его использовать, я получаю одинаковое количество символов.APL (39)
Объяснение:
T R←⎕
: прочитайте две цифры с клавиатуры и сохраните их вT
(налог) иR
(возврат).Z←⍳M←100
: сохранить номер100
вM
, и все числа от1
до100
вZ
.{
...}⍣7¨
: для каждого элемента вZ
, запустите следующую функцию 7 раз:R+⌊1-T÷M
: подсчитайте, сколько тортов нужно заплатить,⍵(⊢×>)
: умножьте эту сумму на 1, если у тролля будет больше торта, чем он начал, или на 0, если нет.⊃Z/⍨
: для каждого элемента вZ
, скопируйте его по номеру, который дала эта функция. (Таким образом, все числа, для которых возвращена функция,0
исчезают.) Затем выберите первый элемент из этого списка. Если список оказался пустым, это дает0
.источник
C 83 байта
Если это работает, это работает для всех возможных стартовых кексов, а не только от 1 до 100.
РЕДАКТИРОВАТЬ: Это работает. Golfed:
С пределом «максимум 100 тортов»:
91 байт.
источник
CJam, 36 байт
источник
C ++ - 202 символа
Как обычно, мой C ++ сделал худшее:
источник
APL, 36
объяснение
Обратите внимание, что существует «порог торта». Для получения налоговой ставки
x
и возмещенияy
вам потребуется строго больше, чемy÷x
пирожные для прохождения следующего моста.x y←⎕
принять входные данные и присвоитьx
(налог) иy
(возврат)⍳x÷←100
делитьx
на 100, а затем сгенерировать массив от 1 до 100{y+⍵-⌈⍵×x}⍣6
вызовите функцию «Pass Bridge» 6 раз:⌈⍵×x
количество тортов, умноженное на налоговую ставку, округление (сумма, которую вы платите).⍵-
Вычтите из количества тортов, которое вы имеете.y+
Добавьте возвратЗатем вы получите массив из 100 элементов, показывающий количество тортов, с которыми вы останетесь после пересечения 6 мостов, если вы начнете с 1 ~ 100 тортов. Чтобы увидеть, можете ли вы пересечь последний мост, проверьте, находитесь ли вы выше порога
y÷x
. Альтернативно:x×
умножьте массив наx
y<
проверку, если больше чемy
Наконец,
1⍳⍨
найти индекс первого появления1
(true), возвращает,101
если не найден101|
мод 101источник
С 128
Довольно похоже на другое решение C, но я думаю, что это неизбежно. Основной трюк - выход из внутреннего цикла с различными значениями в зависимости от того, идет ли он до завершения или нет. Это позволяет мне использовать?: Когда я не мог, если я использовал перерыв;
Ungolfed
источник