Управлять инвентарем Minecraft сложно. У вас есть 17 бриллиантов, но вам нужно 7, чтобы изготовить стол для зачарования, кирку и меч. Вы берете их и щелкаете правой кнопкой 7 раз? Или вы щелкаете правой кнопкой один раз, дважды щелкаете правой кнопкой мыши и берете 7 влево? Это так запутанно!
для тех из вас, кто сейчас в замешательстве, не волнуйтесь, я объясню все через секунду
Вызов
Учитывая размер стопки предметов и желаемую сумму, определите наименьшее количество кликов, чтобы получить эту сумму. Вам нужно только обработать до 64 для обоих входов, и вы можете предположить, что у вас есть бесконечные слоты инвентаря. Вы не можете использовать трюк перетаскивания для распространения.
Определения
Опись представляет собой набор слотов , где вы можете хранить предметы.
Слот представляет собой место для хранения в вашем инвентаре , где можно разместить до одного типа элемента.
Стека является количество элементов , размещенных в одной и той же группе. Для целей этой задачи стек - это просто набор элементов в одном месте (поэтому игнорируйте размер стека)
Курсор Ваша заостренная штуковина. Этот курсор. У него могут быть предметы "на нем"; другими словами, если вы нажали на слот и подняли предметы, предметы, которые вы подняли, находятся «на курсоре», пока вы не положите их вниз.
Характеристики
Есть четыре возможных ситуации. Либо у вас есть элемент на вашем курсоре, либо у вас его нет, и либо вы щелкаете левой кнопкой мыши, либо щелкаете правой кнопкой мыши.
Если на вашем курсоре нет элемента, и вы щелкаете левой кнопкой мыши по слоту, вы берете весь стек.
Если на вашем курсоре нет элемента, и вы щелкаете правой кнопкой мыши по слоту, вы берете половину стопки, округленную в большую сторону.
Если на вашем курсоре есть предмет и вы щелкаете левой кнопкой мыши по слоту, вы помещаете все предметы в этот слот. (Для всех вас, игроков Minecraft, у вас не будет> 64 предметов для этого испытания, и они все 64-стекируемые, и у вас есть только один тип, поэтому обмен предметами здесь не применяется)
Если у вас есть элемент на вашем курсоре, и вы щелкаете правой кнопкой мыши по слоту, вы помещаете один элемент в этот слот.
Итак, вы начинаете со всех данных предметов (первый ввод или второй; вы можете выбрать порядок) в слоте, и вы хотите закончить с желаемым количеством (другой ввод) в вашем курсоре.
Давайте рассмотрим пример. Допустим, вы начинаете с 17 предметов и хотите получить 7. Сначала вы щелкаете правой кнопкой мыши по стеку, что означает, что вы подняли 9 и в этом слоте 8. Затем, если вы снова щелкнете правой кнопкой мыши по стеку, вы поместите один предмет обратно в слот, и у вас останется 8, а в слоте - 9. Наконец, вы снова щелкните правой кнопкой мыши, и у вас будет 7, а в слоте - 10. Таким образом, вы бы вернулись 3
(количество кликов).
Если вам удастся превзойти меня в игре, скажите, и я отредактирую пример: P
Тестовые случаи
Они генерируются вручную, поэтому, пожалуйста, сообщите мне, если есть какие-либо ошибки. Я делаю управление запасами с помощью щелчка правой кнопкой мыши, поэтому у меня нет опыта оптимального управления запасами: P
Given, Desired -> Output
17, 7 -> 3
64, 8 -> 5
63, 8 -> 5
10, 10 -> 1
10, 0 -> 0 # note this case
25, 17 -> 7
Пояснения
Этот вызов может быть сложным для игроков не из Minecraft, я понятия не имею. Вот несколько объяснений.
64, 8 -> 5
потому что вы выбираете 32 с помощью правого щелчка, поместите его вниз, поднимите 16, поместите его вниз, затем поднимите 8.
63, 8 -> 5
по той же причине.
25, 17 -> 7
потому что вы подняли 13, поместите его вниз, возьмите 6 из остатка 12, поместите 2 обратно в оставшийся стек, а затем поместите 4 в курсоре в 13, а затем поднимите их.
правила
- Применяются стандартные лазейки
- Вы можете предположить, что
0 <= desired <= given <= 64
- Вы можете принимать входные данные в любом порядке и выполнять ввод / вывод в любом разумном формате.
0,[n]
, может перейти: (1) от0,[a,b,...]
доa,[b,...]
,b,[a,...]
,ceil(a/2),[floor(a/2),b,...]
, илиceil(b/2),[a,floor(b/2),...]
; или (2) изx,[a,b,...]
(x>0
) доx-1,[a+1,b,...]
,x-1,[a,b+1,...]
,x-1,[a,b,...,1]
,0,[a+x,b,...]
,0,[a,b+x,...]
,0,[a,b,...,x]
. Задача состоит в том, чтобы найти минимально возможные переходы от точки0,[g]
g к точке,t,L
гдеt
находится желаемая цель иL
есть ли какой-либо список?Ответы:
C ++ ,
498482457 байтЕсли эта функция вызывается только один раз, она может быть 455 байтов.
Я обнаружил, что почти каждый онлайн-компилятор GCC (включая TIO) запрещает мне опускать тип функции
f
. Однако GCC на моем компьютере позволяет это, и я не знаю почему.Этот может обрабатывать большие входные данные, если слот может содержать такое количество элементов (хотя требуется больший массив и, вероятно, закончится время).
Ungolfed:
источник
Желе , 74 байта
Полная программа с первым вводом (3-й аргумент) текущего стека и вторым вводом (4-й аргумент) искомого курсора.
Попробуйте онлайн! Из-за внедрения это истекает 60-секундным тайм-аутом для
25, 17
тестового примера. Это можно исправить, удалив избыточность, оставленную для игры в гольф, с использованием этого 84 байта (который отфильтровывает стеки нулевого размера и сортирует оставшиесяḟ€Ṣ¥0¦€0
в конце ссылки 6 и сохраняет только уникальные состояния на каждом шаге с использованиемQ$
в Main ссылка на сайт).Как?
Программа реализует определенный конечный автомат.
Он создает исходное состояние,
[0, [argument 1]]
затем последовательно переходит ко всем следующим возможным состояниям,
пока одно из них не будет найдено соответствующим
[argument 2, [...]]
.Примечание: запись программы находится в «Основной ссылке», которая является самой нижней (
Wṭ0WÇ€Ẏ$ÑпL’
)источник