Затраты ресурсов энергосистемы
Вступление
В настольной игре Power Grid неотъемлемой частью игры является покупка ресурсов для питания ваших электростанций. В игре используются четыре типа ресурсов (пять, если вы используете возобновляемую энергию, но, очевидно, вы не можете купить ресурсы для этого). Это уголь, нефть, мусор и уран. Рынок ресурсов выглядит так:
1---- | 2---- | 3---- | 4---- | 5---- | 6---- | 7---- | 8---- | 10 | 12
CCC | CCC | CCC | CCC | CCC | CCC | CCC | CCC | U | U
OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | 14 | 16
GGG | GGG | GGG | GGG | GGG | GGG | GGG | GGG | U | U
Когда ресурсы покупаются, они берутся с левой стороны рынка, где они самые дешевые. Когда новые ресурсы добавляются на рынок, они добавляются справа. Как видно, это приводит к балансу спроса и предложения - если покупается больше ресурсов определенного типа, чем пополняется каждый раунд, цена этого ресурса будет расти. Точно так же, если это меньше, стоимость уменьшится.
Стоимость угля, нефти и мусора увеличивается с одинаковой скоростью, а уран - быстрее. Одна единица неранового ресурса стоит 8 - floor((<units available> - 1) / 3)
. Одна урановая единица стоит, 13 - <units available>
если доступно 5 и более единиц, и так далее 18 - (2 * <units available>)
.
Например, в начале игры все 24 единицы угля доступны для покупки. Если первый игрок захочет купить 4 единицы угля, первые три единицы будут стоить 1 каждая, а четвертая будет стоить 2, в результате чего общая стоимость составит 5. Это оставляет 20 доступных единиц. Если второй игрок также захочет купить 4 единицы угля, стоимость будет (2 * 2 + 2 * 3) = 10.
Соревнование
Ваша задача состоит в том, чтобы написать программу или функцию, которая рассчитывает стоимость покупки определенного количества определенного ресурса, исходя из того, что на рынке имеется определенное количество этого ресурса.
Ваша заявка должна принимать в любом разумном формате ввода и в любом порядке следующие параметры:
- Тип ресурса - гарантированно один из [C, O, G, U].
- Количество того ресурса, который присутствует на рынке - гарантированно будет неотрицательным целым числом. Если тип ресурса не U, он не будет больше 24. Если тип ресурса U, он не будет больше 12.
- Количество этого ресурса, которое игрок хотел бы купить - гарантированно будет неотрицательным целым числом, которое меньше или равно количеству, уже присутствующему на рынке.
На выходе должна быть стоимость запрошенных ресурсов.
Дополнительные правила
- Приведенные формулы приведены только в иллюстративных целях, не стесняйтесь использовать любой метод расчета затрат, которые вам нравятся.
- Буквенные коды для различных типов ресурсов (C, O, G, U) могут быть заменены их строчными эквивалентами. Вы также можете заменить буквы на цифры, либо в форме,
C=0, O=1, G=2, U=3
либоC=1, O=2, G=3, U=4
. - Это код-гольф , поэтому наименьшее количество байтов будет победителем.
- Если ваша заявка требует ввода в другом порядке или формате, чем указано в предыдущем разделе, вы должны предоставить подробности.
Контрольные примеры
Формат теста:
resource type, amount in market, amount to buy
> result
Тестовые случаи:
C, 24, 4
> 5
C, 20, 4
> 10
O, 3, 3
> 24
U, 1, 1
> 16
C, 1, 1
> 8
G, 0, 0
> 0
O, 10, 7
> 44
U, 12, 4
> 10
G, 11, 4
> 22
f("O",1,5)
?f(G, 11, 4) = 22
иf(O, 10, 7) = 44
.Ответы:
Javascript (ES6),
7159 байтПринимает
type
,market_amount
и вbuy_amount
качестве аргументов.type
целое число от 0 до 3демонстрация
Показать фрагмент кода
источник
Python 3,
7169 байтСпасибо @xnor за -2 байта
Функция, которая принимает входные данные через аргумент с нулевым индексом типа ресурса
r
, доступной суммыa
и суммы для покупкиb
, и возвращает стоимость.При этом используется тот факт , что
True
иFalse
приравнять1
и0
в Python, что позволяет использовать выражения логических индексировать в списках.Как это устроено
Попробуйте это на Ideone
источник
max(18-2*a,13-a)
вместо[18-2*a,13-a][a>4]
.Befunge, 142 байта
Попробуй это здесь! Принимает входные данные как 3 целых числа, где тип ресурса равен 0,1,2,3. Выход является целым числом.
Не знаю, может ли это быть лучше в гольф. Пробелов не так много, но переводы строки, вероятно, больно.
источник
Python 2.7, 85 байт:
Основано на ответе Р. Капа, но вы можете сбрить байт до 85, удалив лишнее / для разделения по полу. Поскольку это все целые числа, оно автоматически сводится к целому числу.
источник
Python 2.7, 86 байт:
Вводит массив в формате
[resource type, units available, units to purchase]
. Выход является целым числом. Постараюсь в гольф больше со временем.Попробуйте онлайн! (Ideone)
источник
Луа,
107101 байтРекурсивная функция, которую нужно вызывать с помощью
f(resource,stock,buy)
. ресурс должен быть числом от 0 до 3. Вывод осуществляется через возвращаемое значение.Спасибо LeakyNun за то, что я сэкономил 6 байт:
(25-y+(y-1)%3)/3
он короче, чем8-math.floor((y-1)/3)
на 5 байт, и позволил мне получить еще один байт за счет его размещения.Ungolfed
Вы можете проверить этот код в Интернете , скопировав следующий фрагмент.
источник
6and
не будет работать, потому что6a
это шестнадцатеричное значение, но6an
это не так.8-math.floor((y-1)/3)
действительно(25-y+(y-1)%3)/3