Мне нравятся проблемы с карточными играми, поэтому я сделал это для итальянской карточной игры Scopa. Моя семья играет в эту игру с незапамятных времен. У него очень интересная система начисления очков, которая должна доставлять удовольствие игрой в гольф. Я отправлю ответ в R, чтобы начать веселье, которое, я уверен, люди улучшат.
Задача: выяснить количество очков, набранных в раунде Скопы, с учетом карт, которые игрок захватил во время раунда, в качестве входных данных.
В колоде Скопа 40 карт. Если вы используете международную колоду, вы удаляете 8, 9 и 10, оставляя A, 2,3,4,5,6,7, Q, J, K в каждой масти. 1 Есть два игрока или партнерства, и после каждого раунда все карты в конечном итоге захватываются одним или другим из двух игроков. Счет считается следующим (более подробная информация здесь ):
- Игрок с наибольшим количеством карт набирает 1 очко.
- Игрок с наибольшим количеством алмазов (или монет при использовании итальянской колоды) получает 1 очко.
- Игрок с 7 бриллиантами (или монетами), известной как сет-белло или красивая семерка, получает 1 очко.
- Игрок с самой высокой примирой набирает 1 очко. Первичная оценка игрока - это сумма очков карты наибольшего достоинства, которую игрок захватил в каждой масти (см. Таблицу ниже). Если у вас нет хотя бы одной карты в каждой масти, вы проиграете по умолчанию, даже если ваш счет превысит счет вашего оппонента. В чрезвычайно редком случае, когда ни один из игроков не имеет хотя бы одной карты в каждой масти, игрок с более высоким общим количеством очков получает очко. 2
Таблица начальных баллов
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Таким образом, игрок может набрать максимум 4 очка за раунд. 3 Если есть галстук, который возможен для карт, алмазов или первобытных очков , никто не набирает очки.
Важно понимать, что, поскольку каждая карта должна быть захвачена одним из двух игроков, вы можете определить, какие карты должен был взять другой игрок, даже если вы знаете только, какие карты взял один игрок. Вам нужно будет сделать это, чтобы правильно забить примиру .
Правила вызова
вход
Ваш код должен принимать в качестве входных данных карты, захваченные одним игроком во время раунда Скопа.
Входные данные должны быть в строковом формате, в котором один символ представляет ранг каждой карты, а один символ - ее масть. Это устраняет потенциальную лазейку для прохождения начальных оценок непосредственно в качестве входных данных. Преобразование карточных рангов в начальные баллы должно быть выполнено в программе. Однако вы можете использовать одну строку, разделенную пробелами или запятыми, массивом строк или любым другим форматом. Например, если вы решите кодировать ранги как76A5432QJK
и подходит, какDCHS
вы могли бы использовать входные данные, такие как['7D', '6H', 'QD', 'JS']
или'7D,6H,QD,JS'
.
Выход
Целое число от 0 до 4, представляющее счет игрока.
выигрыш
Самый короткий ответ в байтах побеждает!
Контрольные примеры
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
4 : 1 балл за> 20 карт, 1 балл за> 5 бриллиантов, 1 балл за 7 бриллиантов и 1 балл за 78 очков в примире (7,7,7,5, когда у противника 7,6,5, К за 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Набирает 0 : <= 20 карт, <= 5 бриллиантов, нет 7 бриллиантов, и только 69 баллов в примире (7,7,4,3, где у оппонента 7,7,6, К на 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Результаты 3 : 1 балл за> 20 карт, 1 балл за> 5 бриллиантов, 1 балл за 7 бриллиантов. Primiera будет 63 (7,7,7) и противник может только набрать 51 (7, Q, Q, Q) , но так как эта рука не имеет лопат она теряет точку по умолчанию.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Результаты 3 : <= 20 карт, 1 очко за> 5 бриллиантов, 1 очко за 7 бриллиантов. Primiera только баллы 51 (7, Q, Q, Q) , и противник может набрать 63 (7,7,7) , но так как рука оппонента не имеет алмазов эта рука выигрывает primiera точку по умолчанию.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Результаты 3 : <= 20 карт, 1 очко за> 5 бриллиантов, 1 очко за 7 бриллиантов. Несмотря на то, что у этой руки нет пиков, она все равно выигрывает примиру со счетом от 63 до 57 (7,7,7 против 7,6,6), потому что рука противника не имеет бриллиантов.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Баллы 2 : <= 20 карт, 1 балл за> 5 бриллиантов, 1 балл за 7 бриллиантов. В этой руке нет пиков, а в руке противника нет бриллиантов. Соперник побеждает примиру со счетом от 63 до 41 (7,7,7 против 7, Q, Q).
[]
(пустой массив)
Результаты 0
1: По крайней мере, в нашей семье Джек превосходит «Куин» в Скопе, но это не имеет значения для целей подсчета очков.
2: я играю в эту игру с детства и никогда не видел, чтобы это случилось, но ваш код лучше справится с этим делом!
3: есть бонусные баллы за «зачистки», набранные во время раунда, которые я игнорирую для этой задачи.
источник
Ответы:
Рубин,
156153 байтаПопробуйте онлайн!
Это использует
;865432000
для представления76A5432QJK
соответственно, и костюмы в нижнем регистре. (Выбор символов заключается в том, что вычитание 38 из каждого дает их первичное значение, но на самом деле мы никогда этого не делаем, потому что имеет значение только относительное различие.)Мы не проверяем, пропускает ли один из игроков костюм, потому что это не нужно - поскольку все карты считаются как 38 плюс их действительное значение, если кто-то пропускает костюм, наибольшее количество очков, которое он может получить, (21 + 38) * 3 = 177, что меньше (10 + 38) * 3 + 21 + 38 = 203 - наименьшее количество очков, которое может получить другой игрок. Мы не можем позволить двум игрокам пропустить неравное ненулевое количество мастей, потому что игрок может пропустить только 0, 1 или 2 масти, а если кто-то пропускает 2 масти, у него есть все карты двух других мастей.
источник
R,
320298265238229224211209179 байтЭто решение в основном благодаря @digEmAll, в форме функции.
Попробуйте онлайн!
Ниже приведены лучшие из моих старых посредственных попыток на 209 байтов.
редактирование: игра в гольф путем наложения алиасов на некоторые функции, а затем с помощью идеи Дурнкоба о добавлении константы к партитуре вместо проверки мастей.
следующее редактирование: избавился от некоторой избыточности, а затем включил некоторые улучшения от Джузеппе
следующее редактирование: -2 байта благодаря digEmAll
Я ужасен в этом, так что я уверен, что кто-то может улучшить это, если они хотят не торопиться. Я чувствую, что
sapply
иfunction
супер долго и могли бы избавиться от них , но я не могу понять, каким образом . Входные данные представляют собой двухсимвольные строки в стандартной записи.источник
JavaScript (ES6),
171163 байтаПринимает ввод как набор карточек, используя их стандартное представление.
Попробуйте онлайн!
комментарии
источник
05AB1E , 41 байт
Попробуйте онлайн или проверьте все контрольные примеры .
Костюмы
DCHS
соответственно представлены0123
. Звания7A65432KJQ
соответственно представлены0123456789
. Они считаются строками, а не целыми числами, как того требует задание (но в любом случае 05AB1E преобразует их в целые числа).Как и в других решениях, мы добавляем большую константу (14) к каждому баллу примиеры, чтобы сделать ненужной проверку пропущенных мастей.
источник
MS SQL Server 2017 , 525 байт
Попробуйте это на db <> fiddle .
источник
Сетчатка 0.8.2 , 334 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Создайте список всех 40 карт.
Уберите карты, которые держит игрок.
Замените каждый ранг по порядку сортировки, который на 9
7
и на 10 меньше его значения для других карт.Сортируйте карты по масти и рангу.
Подсчитайте количество карт в каждой масти, а также захватите карту с наивысшим рейтингом в каждой масти, дважды захватив самый высокий бриллиант.
Проверьте, был ли самый высокий алмаз 7.
Удалите все старшие карты, если в одной из мастей нет карт.
Конвертируйте старшие карты в их одинарный счет и сложите их вместе. Также конвертируйте общее количество карт и длины мастей в одинарные.
Наберите очки, если общее количество, алмазы или первобытность, выше.
Общая оценка.
источник
C # (интерактивный компилятор Visual C #) , 193 байта
Попробуйте онлайн!
источник
AWK , 235 байт
Попробуйте онлайн!
Соответствует карте 1234 (4 - ромбы), значения - 0123456789. Эта программа преобразует контрольные примеры в принятый формат:
Моей целью было просто превзойти ведущую реализацию Python: D
источник
Python 3 ,
249 245 239238 байт-4 байта благодаря @ovs
-6 байт благодаря @movatica
Попробуйте онлайн!
источник
int('0734569c00'[int(x[0])],13)
иif x[1]<'E'
может быть записана в видеif'E'>x[1]
all(s in''.join(C)for s in S)
может быть сокращено доnot S.strip(''.join(C))
экономии 6 байт