Эта задача состоит в том, чтобы выиграть руку Криббеджа. Если вы не играете в Криббедж, у вас есть кое-какое обучение. Мы играем со стандартной покерной колодой, и комбинация состоит из четырех карт плюс «открытая карта». Существует два типа рук: нормальная и «рука для кроватки».
Карты приходят в формате, vs
где v
один из: A23456789TJQK
(T для десяти) и s
является одним из SCDH
. Рука будет дана в форме (например)
AS 2D 3H JS | 4S
где 4S
открытая карта Рука для кроватки будет иметь формат
JD 3C 4H 5H | 5S !
Лицевые карты имеют значение 10, а туз - значение 1. Подсчет очков выполняется следующим образом.
- Пятнадцать: за каждое подмножество из пяти карт, сумма которых составляет 15, добавьте два очка.
- Пары: за каждую пару карт с одинаковым рангом (не значением) добавьте два очка.
- Прогоны: для каждого максимального прогона последовательных карт длиной более 2, добавьте длину прогона в пунктах.
- Флеш: если все пять карт одной масти, добавьте пять очков. В противном случае, если все, кроме открытой карты, одной масти, добавьте четыре очка. Если это рука с колыбелью, четырехточечный вариант не учитывается.
- Нобы: если в руке есть валет с той же мастью из открытой карты, добавьте одно очко.
Заметки:
Тройки и четверки не являются особенными - в тройке три пары, поэтому тройка стоит 6 очков.
Пробеги могут перекрываться. Например,
AS AH 2D 3C | 2C
(двойной двойной прогон) имеет четыре трассы длиной 3 и две пары, поэтому стоит 3 + 3 + 3 + 3 + 2 + 2 = 16 баллов.Подсчитываются только максимальные пробеги, поэтому
KS QD JD TC | 9S
стоит 5 баллов, поскольку это пробег 5. Подвалы не учитываются.
Дом Правило:
Невозможно набрать 19 очков в руке. Вместо нуля сообщите 19 баллов.
Примеры:
5S 5H 5D JS | KS
21
AS 2D 3H JS | 4S !
9
JD 3C 4H 5H | 5S
12
9S 8S 7S 6S | 5H !
9
9S 8S 7S 6S | 5H
13
8D 7D 6D 5D | 4D !
14
8D 7D 6D 5D | 4D
14
AD KD 3C QD | 6D
19
Это код гольф. Самое короткое решение побеждает.
Ответы:
GolfScript,
187178174 символовТак как я никогда не играл в криббидж, я не знаю каких-либо хитростей. Поэтому я подумал, что единственный способ соревноваться (хотя бы немного) - это использовать язык гольфа. Код довольно простой GolfScript, тестовые примеры можно найти здесь .
Код более читабелен (немного переформатирован и немного разложен ):
Изменить: Изменена логика для пятнадцати и флеш.
источник
С 364
388символовОн большой и некрасивый (хотя и не такой большой, как раньше):
(Для облегчения чтения были добавлены разрывы строк; они не включены в приведенный выше список.)
В описании проблемы не указывалось, должен ли код проверять наличие недопустимых входных данных, поэтому, естественно, я предполагал, что программа может свободно вести себя по желанию, если входные данные, скажем, содержат дополнительный пробел.
Вот негольфированная версия:
источник
Руби 1,9
359356Это слишком долго - почти столько же, сколько C-решение.
источник
Что-то для начала .. Ruby,
422 365 355352Слегка разгульный
Модульные тесты для гольфовой версии:
Полученные результаты:
источник
Python, 629 символов
Я только отправляю свой, потому что никто не имеет. Это довольно долго :(
источник
print s or 19
? Я думаю, что вы также можете использовать Python 3.x и сбрить еще 3 символа (raw_input
доinput
, затемprint s or 19
доprint(s or 19)
).Python 2,
606584 байтаСохранено 22 байта благодаря игре в гольф Джо Кинга .
Попробуйте онлайн!
Чуть короче, чем ответ GRC , и выбирает другой путь.
Объяснение:
Объяснение для логики запусков, в частности:
источник
if
чтобы получить 584 байтаStax , 106 байт
Запускать и отлаживать онлайн!
Бонус для CP437: видите символ тех костюмов на упакованном Stax? Жаль, что клубы не появляются ...
Эквивалент ASCII
объяснение
источник