В игре Pickomino в центре стола лежат несколько фишек , каждая с разным положительным целым числом. Каждый ход игроки бросают кубики определенным образом и получают счет, который является неотрицательным целым числом.
Теперь игрок берет плитку с наибольшим числом, которое все еще меньше или равно его счету, удаляя плитку из середины и добавляя ее в свой стек. Если это невозможно, потому что все числа в середине выше, чем оценка игрока, игрок теряет самый верхний тайл из своего стека (который был добавлен последним), который возвращается в середину. Если у игрока не осталось плиток, ничего не происходит.
Соревнование
Имитация игрока, играющего в игру против себя. Вы получаете список плиток в середине и список оценок, которые получил игрок. Вернуть список тайлов игрока после того, как все ходы были оценены.
Правила вызова
- Вы можете предположить, что список с плитками упорядочен и не содержит целых чисел дважды.
- Вы можете взять оба списка ввода в любом порядке, который вы хотите
- Выходные данные должны сохранять порядок листов в стеке, но вы можете решить, будет ли список отсортирован сверху вниз или снизу вверх.
Основные правила
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Добавление объяснения для вашего ответа рекомендуется.
пример
(взято из 6-го теста)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Первый результат - 22, поэтому возьмите самый высокий тайл в середине <= 22, то есть сам 22.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [22, 22, 23, 21, 24, 0, 22]
Следующий результат - 22, поэтому возьмите самый высокий тайл в середине <= 22. Поскольку 22 уже взято, игрок должен взять 21.
Middle: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 21]
Remaining scores: [22, 23, 21, 24, 0, 22]
Следующая оценка - 22, но все числа <= 22 уже заняты. Поэтому игрок теряет самый верхний тайл в стеке (21), который возвращается в середину.
Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [23, 21, 24, 0, 22]
Следующие оценки 23, 21 и 24, поэтому игрок берет эти плитки с середины.
Middle: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21, 24]
Remaining scores: [0, 22]
Игрок обанкротился и набрал ноль. Поэтому тайл с номером 24 (самый верхний в стеке) возвращается в середину.
Middle: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21]
Remaining scores: [22]
Последний результат - 22, но все плитки <= 22 уже заняты, поэтому игрок теряет самый верхний блок в стеке (21).
Middle: [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Final Stack and Output: [22, 23]
Контрольные примеры
(с самой верхней плиткой последней в списке вывода)
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [26, 30, 21]
Output: [26, 30, 21]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [35, 35, 36, 36]
Output: [35, 34, 36, 33]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23]
Output: [23]
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: []
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23, 0]
Output: []
Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Output: [22, 23]
Tiles: [1, 5, 9, 13, 17, 21, 26]
Scores: [6, 10, 23, 23, 23, 1, 0, 15]
Output: [5, 9, 21, 17, 13, 1]
Tiles: []
Scores: [4, 6, 1, 6]
Output: []
Ответы:
Haskell ,
119111104103 байта1 байт сохранен благодаря Эрджану Йохансену
Попробуйте онлайн!
Предполагается, что плитки отсортированы в порядке убывания.
Не так уж много здесь происходит. Первый аргумент - куча игроков, второй - их очки, а третий - куча в середине.
источник
sort
это восходящий. Тем не менее, тестовый пример TIO никогда не попадает в эту ветку. Я настоятельно рекомендую проверять все случаи каждый раз при повторении, как это.(#)=span.(<)
.Japt, 24 байта
Уф! Это не сработало так, как я думал, что будет!
Принимает ввод в обратном порядке.
Попробуйте или запустите все тестовые случаи на TIO
источник
Perl 6 , 89 байт
Попробуйте онлайн!
Я думаю, что есть еще несколько байтов для игры в гольф ...
источник
C # (интерактивный компилятор Visual C #) ,
159158154 байтаНазывается как
f(tiles)(scores)
Если только
System.Void
это на самом деле тип возврата, а не просто заполнитель для отражения. Я мог бы заменитьif(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);
сvar t=a>1?m.Add(s.Count<1?0:s.Pop()):s.Push(a);
, сохраняя два байта.Попробуйте онлайн!
источник
Рубин , 77 байт
Попробуйте онлайн!
источник
JavaScript (Node.js) , 80 байт
Та же логика, что и в версии ES6, но принимает плитки как битовую маску BigInt, а оценки - как массив BigInts.
Попробуйте онлайн!
JavaScript (ES6),
100 98 9487 байтПринимает вход как
(tiles)(scores)
. Плитка может быть передана в любом порядке.Попробуйте онлайн!
комментарии
источник
Древесный уголь , 35 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Цикл по баллам.
Ищите самую высокую доступную плитку.
Если это существует, то ...
... убрать плитку с середины ...
... и добавить его в стек.
Иначе, если стек не пустой ...
Удалите последнюю плитку из стека и верните ее в середину.
Выведите полученную стопку от самой старой до самой новой.
источник
Python 2 , 120 байт
Попробуйте онлайн!
источник
05AB1E ,
2722 байтаПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Pyth, 32 байта
Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
Здесь где-то должно быть место для улучшения - любые предложения будут высоко оценены!
источник
Perl 5
-apl -MList:Util=max
, 97 байтTIO
читает результаты и плитки на следующей строке и печатает вывод.
Как
-apl
:-p
циклически перебирать строки и печатать,-a
автоматически разбивать , разбивать-l
на части из ввода и добавлять символ новой строки в вывод$_=$".<>
: прочитать следующую строку (тайлы) и добавить пробел в стандартную переменную$_
for$i(@F){
...}
петля$i
над@F
полями текущей строки (баллы)(
..?
..:
..).=$&
добавить предыдущее совпадение к троичному l-значению($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$s
в случае, если максимальное значение найдено и удалено из плиток ($_
), l-значение равно Scores ($s
)$s=~s/ \d+$//?$_
в противном случае, если последний номер может быть удален из баллов, это плитки:$G
наконец, это мусор, потому что не может произойти$_=$s;s/ //
установить счет в стандартную переменную и удалить начальный пробелисточник