Кто выигрывает пиковый трюк


19

Напишите код, чтобы определить, кто выигрывает четырехкарточный трюк в игре « Пики» . Побеждает несколько байтов.

Входные данные представляют собой строку, в которой перечислены четыре карты, сыгранные в такой последовательности, как TH QC JH 2H(Десять Червей, Королева Трефов, Валет Червей, Двое Червей). Карта состоит из двух символов: масти из CDHSи стоимости из 23456789TJQKA. Вы гарантируете, что ввод действителен, и карты отличны.

Вы должны вывести число 1, 2, 3 или 4 для победителя трюка. В этом примере TH QC JH 2H, трюк сердец побеждает, поэтому вы должны вывести 3.

Ваш ввод и вывод должны быть точно такими, как описано, за исключением того, что завершающие символы новой строки являются необязательными.

Вот пиковые правила для победы в трюке. Выигрышная карта является самой высокой из четырех, с некоторыми оговорками. Пики - козырный костюм , поэтому любая лопата превосходит любую не лопату. Масти первой сыгранной карты являются главными , и выиграть могут только карты этой масти или пики. Карты одной масти сравниваются по их значениям, которые приведены в порядке возрастания 23456789TJQKA.

Тестовые случаи:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2

Ответы:


10

Pyth, 28 27 25 байт

J"KTAZ"hxcz)eo_XN+@z1JJcz

Попробуйте онлайн: демонстрация или набор тестов (первые 4 символа - это набор тестов)

Спасибо @isaacg за трюк, который спас 2 символа.

Основная идея состоит в том, чтобы модифицировать символы каждой руки таким образом, чтобы выигрышная рука имела максимальное значение.

Значения рук 23456789TJQKAуже почти отсортированы. Я просто должен заменить Tс A, Kс Tи Aс Z, в результате чего с 23456789AJQSZ.

Порядок костюмов CDHSдля самых не очень важных. S, самый мощный костюм, который уже является максимальным значением. Важно, чтобы костюм первой руки был вторым по значимости. Поэтому я перевожу этот костюм в K.

Все руки также должны быть прочитаны в обратном порядке, так как костюм более мощный, чем ценность.

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1

Я сдаюсь, хорошо сыграно: P
orlp

Я не думаю, .eчто это того стоит - использование oна 1 символ короче, как мне кажется.
Исаак

@isaacg Ваше право. Забавно, у меня было 27 решений, а не .e28. Но решение 27 заканчивалось на a )и поэтому также имело 28 байтов. : oops:
Якуб

1
Я придумал способ сохранить еще 2 символа: перевести с +@z1"KTA"на "KTAZ", но вместо использования строк использовать непосредственно J"KTAZ"в начале и +@z1Jдо J.
Исаак

@isaacg Очень умно. Благодарю. Btw. Я долго думал о том, чтобы сделать третий аргумент Xнеобязательным (только если a и b являются строками). Но я не совсем уверен, если Xab)следует оценить Xab_b(инвертированный b, было бы хорошо для таких вещей, как Xa"</\>") или Xab+tbhb(b сдвинут). Каковы ваши предпочтения?
января

6

CJam, 34 33 байта

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

Алгоритм

Логика проста. У меня есть особая сортировка, в которой я сначала отдаю приоритет второму персонажу, представляющему костюм. При этом Пики получают наивысший приоритет, а затем первый брошенный номер. Остальные все есть -1. Тогда я вроде на первый символ с перекачка Tс Aи Qс Kиметь лексическую сортировку.

Объяснение кода

Прежде всего, давайте посмотрим, каков лексический порядок номиналов карт:

"23456789TJQKA"$

23456789AJKQT

Итак, все номера в правильном положении. Jтакже в правильном положении. Нам нужно поменяться местами Kи Qи Jи Aполучить лексический порядок.

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

Попробуйте онлайн здесь


3

JavaScript (ES6), 112

Просканируйте список и верните позицию наибольшего найденного значения.

Запустите сниппет для тестирования (в Firefox)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>


3

Perl, 73 байта

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

Попробуй меня .

Преобразует имена карт так, чтобы порядок значений в игре соответствовал алфавитному порядку, затем выбирает самое высокое путем сортировки и ищет его в исходной строке для определения позиции.


2

Рубин, 59 + 2 = 61

С флагами командной строки naзапустите

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}

2

J, 47 байт

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

Использование:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

Метод:

  • Для каждого входного символа мы присваиваем значение, основанное на его позиции в 'S[second char of input]AKQJT9876543'строке. Не найденные символы получают значение last position + 1неявно. Дальнейшие символы имеют гораздо меньшее значение ( value=(16-position)!).
  • Вычислите сумму для 3-х входных триплетов и одного дуплета (например, TH_ QC_ 9S_и 8S).
  • Выберите основанный на 1 индекс максимального значения.

(К сожалению, J не может сравнивать символы или строки напрямую. Он может только проверять их равенство, что исключает некоторые другие подходы для этой задачи.)

Попробуйте это онлайн здесь.


2

C #, 237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

Как это работает: итерируйте каждую руку, чтобы вычислить «ценность» карты. Сохранить индекс с наибольшей ценностью. Значение карты определяется как ранг карты, умноженный на 0, если это не спейд или начальная масть, 1, если это начальная масть, и 9, если это лопатка, но не начальная масть. (9 выбран b / c 2 * 9 = 18> A = 14 и 9 - один символ)


1

Pyth, 36 33 байта

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

Довольно простой подход, использует сортировку с пользовательской ключевой функцией, а затем находит индекс с наибольшим значением.


Вы пытались избежать сортировки и просто нашли самое высокое значение? В JavaScript это оказалось короче
edc65

@ edc65 В Pyth нет операции, чтобы найти самое высокое значение, просто для сортировки. Но с помощью одного символа ( e) вы можете получить последний элемент, так что поиск наибольшего значения - это просто сортировка с последующим получением последнего элемента.
orlp

Downvoter, хочешь объяснить?
orlp

1

Pyth, 31 байт

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

Попробуй это здесь.

Как это устроено:

Правильный способ прочитать эту процедуру обратно вперед. Процедура сортирует нужную карту в конец списка, затем вытаскивает ее и находит ее индекс в исходном списке.

  • cz: Генерирует список строк карт. cchop, как правило, является двоичной функцией (arity 2), но при вызове только одного входа служит .split()строковым методом.

  • S: Применяется обычное поведение сортировки, при котором карты с меньшим номером сортируются раньше, чем карты с более высоким номером.

  • ox"TJQKA"hN: Это упорядочивает карты по индексу ( x) в строке "TJQKA"первой буквы карты ( hN). Для карточек с номерами первая буква не найдена, что дает результат -1. Поскольку функция сортировки Pyth стабильна, порядок пронумерованных карт не изменяется.

  • o}@z1Z: Затем мы определяем, соответствует ли масть первой сыгранной карты ( @z1) рассматриваемой карте. Так как Trueсортировка позади False, это отправляет карты ведущего костюма назад.

  • o}\SN: Это то же самое, что и ранее, но оно сортирует по тому, Sнаходится ли письмо на карточке, посылая пики обратно.

  • hxczde: Это извлекает последнюю карту, отсортированную таким образом ( e), находит ее индекс в списке карт ( xczd) и увеличивает на 1 ( h), давая желаемое местоположение игрока.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.