В настольной игре Terra Mystica есть очень интересная механика для одного из основных ресурсов - силы. Вместо того чтобы набирать и расходовать единицы мощности из банка, каждый игрок начинает игру с ровно 12 единицами мощности, которые распределены по трем «чашам», которые обозначены как I, II и III. Приобретая и тратя власть тогда просто перемещает власть между этими чашами:
- Чтобы потратить единицу энергии, переместите ее из чаши III в чашу I (при условии, что у вас есть юнит в чаше III).
- Когда вы получаете единицу энергии, если в миске I есть блок, переместите его в миску II. Если в чаше I нет ни одной единицы, а в чаше II есть единица, переместите ее в чашу III. Если все юниты уже находятся в чаше III, ничего не происходит.
- Когда вы получаете или тратите несколько единиц одновременно, они обрабатываются по одной единице за раз.
Вот пример. Скажем, игрок начинает со следующего распределения мощности (приведенного по порядку I | II | III
):
5 | 7 | 0
Их сила меняется следующим образом, если они получают и расходуют энергию несколько раз:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Ваша задача - вычислить результат одного из таких выигрышных или расходных событий.
Соревнование
Вам дают четыре целых числа в качестве входных данных. Первые три, I
, II
, III
, представляют собой количество энергии в каждом из трех чаш. Они будут неотрицательными, и их сумма составит 12. Четвертое число P
- это количество полученной или потраченной энергии, которое будет находиться в включенном диапазоне [-III, 24]
(поэтому вы можете предположить, что игрок никогда не попытается потратить больше энергии чем они в настоящее время могут, но они могли бы получить больше энергии, чем им нужно, чтобы перенести всю силу в чашу III).
Вы можете использовать эти числа в любом последовательном порядке, в качестве отдельных аргументов, в виде списка целых чисел или в виде строки, содержащей эти целые числа. Вы также можете взять в P
качестве одного аргумента, а I
, II
, III
как отдельный список аргументов.
Выведите три целых числа I'
, II'
, III'
которые представляют собой количество энергии в каждой чаше после P
единицы были получены или потрачены, следуя правилам пояснено выше.
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
источник
Ответы:
Mathematica, 52 байта
Это безымянная функция, которая принимает список в
{I, II, III, P}
качестве входных данных и возвращает список{I', II', III'}
.Решение в закрытой форме. Это еще не совсем оптимально ...
источник
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
это на байт длиннее. Мне нравится,12-+##
хотя.C
9794 байтаВ разряженной форме:
источник
Python 2, 104 байта
Попробуйте онлайн
Ungolfed:
источник
Haskell, 58 байт
Промежуточное значение
m
обозначает количество энергии, идущей от (или, если отрицательно) к первой чаше,z
обозначает количество энергии в третьей чаше после действия. В последнюю минуту оптимизация одного байта изменила старое выражение для второй чаши от12-a+m-z
использования идентификатораa+b+c=12
.Тип естественного результата - тройка для мисок, поэтому входные данные также принимают чаши как тройки, а изменение мощности - как второй аргумент. Это позволяет обрабатывать все тестовые случаи с помощью одного приложения
scanl
:источник
Röda ,
10094 байтаUngolfed:
источник
++
and--
?JavaScript,
6159 байтПопробуйте онлайн!
источник
GNU sed , 66 байт
Включает +1 для
-r
Использует одинарный (см. Этот консенсус ).
Попробуйте онлайн!
источник
Сетчатка ,
46413938 байтСпасибо Мартину Эндеру за несколько полезных предложений!
Принимает участие в одинарных. Первая строка содержит количество энергии в трех чашах, разделенных запятой, вторая строка - количество энергии для цикла.
Набор тестов - принимает все входные данные в одной строке и преобразует из десятичного в унарный и наоборот для удобства использования.
объяснение
Положительный случай: мы многократно удаляем ведущий
1
из второй строки и перемещаем a1
из первой непустой чаши в следующую, пока возможна эта операция (т. Е. Число циклов питания не равно нулю, а не все сила в третьем шаре). Вs
модифицирующие средстваsingle-line
, что позволяет ,.
чтобы соответствовать также символ новой строки.Отрицательный случай: все делается за один шаг, перемещая количество энергии, указанное последним входом, из третьего в первый шар. Это также удалит строку, содержащую отрицательное количество энергии для перемещения.
Оставляйте (grep) только строки, содержащие запятую. Это избавит от возможных остатков первой линии.
источник
Python 2, 91 байт
На основании этого ответа
Попробуйте онлайн
Ungolfed:
источник
Пакет, 87 байт
Используйте следующие формулы:
Так как у Batch нет оператора меньше чем, я вычисляю,
i = min(-i, 0)
используяi*=i>>5
.источник
Perl 6 , 99 байт
Позвольте
a
,b
иc
будет количество начальных токенов в чашах I, II и III соответственно. Затем для случая добавления мощности создается список, содержащийa
копии триплета(-1, 1, 0)
, затемa + b
копии триплета(0, -1, 1)
и бесконечные копии0
. Первыеd
элементы этого списка,d
являющиеся количеством добавляемой мощности, поэлементно добавляются к начальному распределению мощности.Для вычитания мощности (отрицательный
d
), используется простая замкнутая форма:(a - d, b, c + d)
.источник
тинилисп , 134 байта
Определяет функцию,
f
которая принимает четыре аргумента, три чаши (x y z
) и количество передаваемой мощности (p
), и возвращает список трех чаш после транзакции. Вот правильно размещенная версия со всеми тестами: попробуйте онлайн!источник