Yahtzee - игра, в которую играют пять шестигранных кубиков и таблица результатов с тринадцатью различными полями для заполнения счета. У каждого окна есть свои правила подсчета очков:
- 1s, 2s, 3s, 4s, 5s, 6s все очки очков равны сумме соответствующих костей (то есть бросок [3, 2, 3, 1, 5], набранный как 3s, будет награжден 6 очками: 3 за каждые 3).
- Очки «три в своем роде» и «четыре в своем роде» (как они звучат, три или четыре кубика бросили одинаковые) дают очки, равные сумме всех пяти кубиков.
- Фулл-хаус (две кости показывают одно значение, остальные три показывают другое) набирает 25 очков
- Маленькая прямая (четыре последовательных значения) набирает 30 баллов
- Большая прямая (все последовательные значения) набирает 40 баллов
- Yahtzee (все кости имеют одинаковое значение) набирает 50 очков
Тринадцатое (шанс) имеет смысл в игре, но не так много для этой задачи; Кроме того, в игре есть бонусы для дополнительных Yahtzees, которые здесь не имеют смысла. Потому что проблема ...
Учитывая пять кубиков в качестве входных данных (пять целых чисел 1-6, однако ввод удобен, вы можете предположить, что ввод всегда действителен), выведите наивысшую возможную оценку для этой «руки». Для целей этого задания действительными являются только методы оценки, приведенные в приведенном выше списке (в частности, шанс не является действительным полем оценки для этого задания ). Счет должен быть выведен как его десятичное числовое значение, будь то целое число или его строковое представление, что угодно. Он должен быть сразу узнаваем как число. Лидирующие / конечные пробелы в порядке, речь идет о получении оценки, а не презентации.
Код гольф, поэтому ответ с наименьшим количеством байтов на данном языке выигрывает. Стандартные лазейки запрещены.
Контрольные примеры
(Обратите внимание, что все они независимы, задача состоит в том, чтобы выиграть одну «руку» игры в кости):
in: 1 5 4 3 2
out: 40
in: 1 1 4 3 1
out: 10
in: 2 2 6 5 3
out: 6
in: 2 4 2 4 6
out: 8
in: 1 1 1 1 1
out: 50
in: 5 2 5 3 6
out: 10
in: 1 6 3 4 2
out: 30
in: 1 3 1 1 3
out: 25
in: 6 5 5 6 6
out: 28
in: 1 2 3 5 6
out: 6
Ответы:
R ,
146141 байтПопробуйте онлайн!
Обойден планнапусом
Принимает ввод в виде списка и возвращает счет.
немного разгадал
источник
f(c(1,2,3,5,6))
терпит неудачу - это должно дать 6 и вместо этого дает 30. Кажется, это потому, что вы подсчитываете, сколько пар (после сортировки) различаются на единицу, что на самом деле четыре для вышеуказанной последовательности, даже если это не является прямой четырех. Я думаю, что столкнулся с этим, когда некоторое время назад выполнил это как упражнение, и я, вероятно, должен добавить это в качестве контрольного примера ...Python 2 ,
187184167165 байтов-17 байт благодаря @mypetlion
-2 байт благодаря @chrstphrchvz
Попробуйте онлайн!
источник
R
136134 байтаГольф на 2 байта благодаря @Giuseppe !
отступ,
Несколько тестовых случаев:
источник
factor
на горячую секунду, прежде чем отвлекся. Но я думаю, что если я буду использовать ваш подход сz
(s
в моем ответе), я смогуall(y<4&y-1)
и используя*
вместо[
, и устанавливаяy
inline, а не как аргумент функции, и он по-прежнему проходит все тестовые случаи: попробуйте онлайн!max
и я думаю, что это спасло байт от установкиy
inline.Пакетный, 359 байт
Объяснение:
Вычислите количество костей для каждого числа, плюс максимум, плюс сумму всех костей, плюс наибольшее количество костей с тем же числом.
Если все кости разные, это может быть длинная прямая, но это должно быть либо нет,
1
либо нет6
.В противном случае, или если не более двух кубиков одинаковы, это может быть короткая стрита. Должно быть как минимум a
3
и a,4
а также комбинация других четырех чисел.Если есть три кубика то же самое, проверить полный дом, так как
3^2==1
. Тем не менее, некоторые фулл-хаусы, такие как 6s и 5s, получают более высокие оценки как 3 в своем роде.В противном случае, или если есть четыре одинаковых, то наберите общий результат.
А если есть пять одинаковых, то Яхтзе!
Выведите лучший результат.
источник
Желе , 58 байт
Попробуйте онлайн!
источник
25.0
то время как ни в одном другом случае нет следов.0
?2.5 × 10 = 25.0
(арифметика с плавающей точкой), а другие, такие как30
выводятся как3 × 10 = 30
(целочисленная арифметика).× 10
как 2 байта,2.5
2 байта, как и25
, и3,5,4
сохраняет 3 байта больше30,50,40
, так что 3 + 0 - 2 = 1 байт сохранен.Perl 6 , 159 байт
Попробуйте онлайн!
Поскольку входные данные могут быть приняты «как бы это ни было удобно», моя функция воспринимает их как экземпляр
Bag
класса, который является контейнером с множественностью. АBag
также является ассоциативным контейнером;$bag{$key}
возвращает, сколько раз$key
встречается в сумке.Большая часть функции - это просто список функций, которые оценивают каждую возможную руку Яхтзе, возвращая счет для этой руки или ноль, если условия для руки не выполнены.
|(1..6).map({ *{$_} * $_ })
это список из шести функций, которые оценивают руки на основе повторяющихся серий чисел 1-6. Ведущий|
сводит этот список в окружающий список.{.kxxv.sum * ?.values.grep(* > 2) }
оценивает 3-х и 4-х в своем роде руки..kxxv
приBag
возврате возвращает ключи, повторенные с кратностью каждого, восстанавливая исходный список бросков кубика и,.sum
конечно, суммируя кубик. Эта сумма умножается на логическое значение (?
), которое истинно, если в сумке.values
(то есть, кратности) содержится значение больше 2.{ 25 * (6 == [*] .values) }
оценивает фулл-хаус. 25 умножается на логическое значение, которое истинно, если произведение кратностей равно 6, что для пяти кубиков может произойти, только если один равен 3, а другой равен 2.30 * ?*{ 3 & 4 & (1 & 2 | 2 & 5 | 5 & 6) }
оценивает маленькую прямую руку. ЭтоWhateverCode
функция; вторая звезда*
этоBag
. Выражение между фигурными скобками - это соединение значений 3 и 4 и либо 1 и 2, либо 2 и 5, либо 5 и 6. Поиск этого соединения вBag
результатах приводит к соединению соответствующих кратностей. Если кратности 3 и 4 и, по крайней мере, одно из 1 и 2, или 2 и 5, или 5 и 6, отличны от нуля, соединение является истинным, когда приведено к логическому (с?
), и этот логический коэффициент умножается на 30 чтобы получить счет.40 * ?*{ 2 & 3 & 4 & 5 & (1 | 6) }
Аналогично оценивает большую прямую руку. Это проще, потому что кости должны включать каждое из чисел 2-5, а также 1 или 6.50 * (*.keys == 1)
оценивает руку Яхтзе. Это просто 50-кратное логическое значение, которое истинно, если число различных кубиков равно единице.источник
Пип ,
6563 байтаПринимает кости как пять аргументов командной строки. Попробуйте онлайн!
Ungolfed + объяснение
(Это оригинальная версия.)
источник
Рубин , 184 байта
Полная программа. Чтобы упростить тестирование ввода, добавьте
$/=' '
сверху, чтобы читать в формате «цифры, разделенные пробелами». (191 символ)Я поставил перед собой барьер в 200 байт, и мне удалось с легкостью его уничтожить, оставив дюжину байтов!
Попробуйте онлайн!
объяснение
Не очень хороший, хотя. Надеюсь, у тебя есть знания по Ruby ~
источник