Соревнование:
В этом вопросе: Назовите покерную комбинацию, в которой вы брали пятикарточную покерную комбинацию, и определите ее. Этот вопрос похож, с двумя поворотами:
Во-первых, выходные данные будут в нижнем регистре. Это позволяет больше играть в гольф, так как вам не нужно беспокоиться о капитализации flush
иstraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Во-вторых, благодаря популярности техасского холдема и 7-карточного стад- покера , мы здесь, в кодовом гольфе, должны иметь возможность выиграть покерную комбинацию из семи карт, я прав? Когда вы набираете комбинацию из семи карт, используйте пять лучших карт для своей руки и игнорируйте две, которые вам не нужны.
Ссылка:
Список покерных рук: http://en.wikipedia.org/wiki/List_of_poker_hands
Ввод (снято непосредственно с предыдущего потока)
7 карт из аргументов стандартного ввода или командной строки. Карта - это двухбуквенная строка в форме RS
, где R - ранг, а S - масть. В рядах являются 2
- 9
(номер карты), T
(десять), J
(Jack), Q
(Queen), K
(король), A
(Ace). В костюмы являются S
, D
, H
, C
для лопаты, бубны, червы и клубов соответственно.
Пример карт
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Пример ввода => желаемый вывод
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Обратите внимание, что во втором примере фактически есть три пары, но вы можете использовать только пять карт two pair
. В пятом примере есть и a, three of a kind
и straight
возможное, но a straight
лучше, поэтому вывод straight
.
счет
Это код-гольф , поэтому выигрывает самый короткий код!
описки
- Вы не можете использовать внешние ресурсы.
- Туз и высокий и низкий для прямых.
Ответы:
Рубин 353
Это было основано на ответе Крона от исходного вопроса.
Это принимает входные данные в качестве аргументов командной строки. По сути, мы просто перебираем все комбинации размера 5, чтобы определить тип раздачи. Каждый тип руки был изменен, так что он начинается с цифры. («флеш-рояль» -> «0-рояль-флеш», «старшая карта» -> «9-я карта»). Это позволяет нам сортировать строки, которые были возвращены. Первая строка после сортировки - лучшая возможная рука. Таким образом, мы печатаем это после удаления всех чисел из строки.
источник
AS QS JS TS 9S 5H 5D
. Это будет стоить вам персонажа!Haskell
618 603 598 525 512 504 480464Карты взяты в качестве строки ввода. Я думаю, что играл в гольф до смерти, но с легкостью обыграю рубин и т. Д., Используя тот же трюк: если вы генерируете все перестановки, вы получаете прямые сортировки, которые вы хотите искать, и обратные сортировки, которые вы хотите для тестирования в своем роде.
Отредактированный для вставки «пары» и использования префиксов чисел после просмотра записи @ FDinoff, он также составлял функции карты, чтобы сбрить еще один символ.
источник
"one pair","two pair"
корочеu=" pair" ... "one"++u,"two++u
C ++,
622553 символачетыре ненужных перевода строки добавлены ниже для ясности.
Ситуация изменилась в версии для гольфа:
Версия 1: Изменены все числовые переменные
__int64
для одного объявления.Rev 1: гольф приращение и состояние
for
петельRev 0: изменены восьмеричные константы на десятичные.
Rev 0: Изменены
if
операторы для присвоений с условным оператором. Rev 1: переставлен далее в одно выражение дляt
. Это требует новой переменнойv
для одного из промежуточных значенийRev 0: удален подробный вывод. Только выводит лучшую общую руку.
Rev 0: Сжатие при выводе текста (сложно в C, потому что вы не можете объединять строки с помощью оператора +). Запись "flush" только один раз сэкономила мне 12 символов, но стоила мне 15, что в целом ухудшило меня на 3 символа. Поэтому я просто написал это 3 раза вместо этого.Rev 1: используетсяstd::string
вместо того,char[]
что предложено FDinoff, что делает возможным объединение с+
.Ungolfed версия, 714 некомментированных непробельных символов.
Обходит все 21 возможных рук, которые можно составить из 7 карт, и каждый раз отбрасывает 2 карты. Масти и ранг пяти выбранных карт суммируются в переменных f и p с различной восьмеричной цифрой для каждой масти / ранга. Различные битовые операции выполняются для определения типа руки, которая затем сохраняется в t (все 21 возможности выводятся в версии без заглавных букв). Наконец, выводится лучшая возможная рука.
Неуправляемый выход
источник
<string>
который поддерживает + для конкатенации строк. Что означает, что вы, вероятно, могли бы использовать<iostream>
и использовать.cout
Однако на самом деле я не знаю, приведет ли это к меньшему количеству символов." pair flush flush straight of a kind"
= 35 символов. Как только вы добавляете в#include
сбережения минимальные, то вам нужно учитывать дополнительные",=+
и объявления констант. Кроме того, я новичок в C ++ и борюсь с IDE и настройками компилятора (это вынуждает меня использоватьscanf_s
иprintf_s
вместо старых «небезопасных» версий, а помощь по его исправлению идет по кругу.)cout
Может немного помочь, это на мое сделать список, но, вероятно, для другой программы. Чтоcout
меня убивает , так это то, чтоusing namespace std
я не знаю, есть ли способ избежать написания всего этого.std::cout
чтобы обойтиusing namespace std
gets_s
&puts
, плюсstd::string
для конкатенации, что означает, что я должен преобразоватьchar*
в вывод. Гольф, с которым я писал, работает простоstring
или простоiostream.
причудливо, я должен включить обоих, чтобы использовать<<>>
операторов сcin/cout
&std::string
s. В целом, использование обоих#include
s работает на 5 байт хуже, хотя я могу объявитьh
какstd::string
и избежать отдельногоchar
объявления. Как и ожидалось, я не могу найти список того, чтоnamespace std
в помощь (или объяснение об операторе.)scanf
иgets
, за исключением игры в гольф, где программы все равно довольно небезопасны. Я мог бы сократить на 5 байт,-s,99
если бы мог использоватьgets
вместоgets_s
, но я не могу заставить компилятор позволить мне. Что меня удивляет, так это то, насколько небезопасен C / C ++ в целом! Несколько недель назад я был бы потрясен, обнаружив, что_int64 x=1<<y
дает неправильный ответ для y больше 31. Но сейчас я просто слегка раздражен. Увидев, что подписчики массива выходят за границы без сообщений об ошибках, я привык к этому. Есть ли способ включить проверку лучше?Perl (> = 5,14),
411403400397400Изменить : встроенный саб, который был вызван только один раз, сохраняя 8 символов.
Редактировать 2 : удалить a,
.""
который был оставлен после ранней попытки.Редактировать 3 : вместо временной переменной, которая сохраняет оригинал
$_
, используйте одну, чтобы сделать ее ненужной. Чистая прибыль 3 символа.Правка 4 : исправлена ошибка с обнаружением переполненного фулл-хауса (2x 3 в своем роде). стоит 3 чарса.
Не совсем победитель, но прямой детектор - интересная концепция, я думаю.
Расширенная версия:
источник
JavaScript 600
использование с nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
источник