Хто виграє трюк Піка


19

Напишіть код, щоб визначити, хто виграє трюк з чотирма картками в грі Spades . Виграє найменше байт.

Вхід - це рядок, в якому перераховані чотири карти, які граються в такій послідовності 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


Я не думаю, що .eматеріал того вартий - використання oна 1 символу коротше, як я вважаю.
isaacg

@isaacg Ваше право. Найсмішніше, що перед рішенням у мене було 27 .eрішень. Але рішення 27 закінчилося а )і, отже, мало 28 байт. : oops:
Jakube

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

@isaacg Дуже розумний. Спасибі. Btw. Я досить довго замислювався над тим, щоб зробити 3-й аргумент Xнеобов’язковим (Тільки якщо a і b є рядками). Але я не дуже впевнений, якщо Xab)варто оцінити Xab_b(перевернутий b, було б добре для таких матеріалів, як Xa"</\>") або Xab+tbhb(b зміщено). Які ваші уподобання?
Jakube

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: Це створює список рядків карт. c, нарізка, як правило, є двійковою функцією (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.