스페이드 트릭을이기는 사람


19

스페이드 게임에서 누가 4 카드 트릭을 이길 지 결정하는 코드를 작성하십시오 . 가장 적은 바이트가 이깁니다.

입력은 TH QC JH 2H(Ten of Hearts, Queen of Clubs, Jack of Hearts, Two of Hearts) 와 같이 순서대로 재생 된 4 장의 카드를 나열하는 문자열입니다 . 카드는 정장 CDHS과에서 값의 두 문자로 제공됩니다 23456789TJQKA. 입력이 유효하고 카드가 고유하다는 것을 보장합니다.

트릭의 승자에 대해 숫자 1, 2, 3 또는 4를 출력해야합니다. 이 예 TH QC JH 2H에서 하트 잭이 트릭을 얻으므로 3을 출력해야합니다.

후행 줄 바꿈은 선택 사항을 제외하고 입력 및 출력은 설명과 정확히 일치해야합니다.

트릭을 이기기위한 스페이드 규칙은 다음과 같습니다. 우승 카드는 4 가지 중 가장 높은 카드이며 몇 가지주의 사항이 있습니다. 스페이드는 트럼프 슈트 이므로 스페이드는 스페이드를 능가하지 않습니다. 첫 번째 카드의 수트는 리드 수트 이며 해당 수트 또는 스페이드의 카드 만 트릭을 이길 수 있습니다. 동일한 수트의 카드는 값에 따라 다음과 같이 증가하는 순서대로 비교됩니다 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은 이미 거의 정렬되어 있습니다. 나는 교체해야 그냥 TA, KTAZ와 결과 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

@isaacg 당신의 권리. 재미있는 점은 .e28 솔루션 전에 27 솔루션을 가지고 있다는 것입니다 . 그러나 27 솔루션은 a로 끝났 )으므로 28 바이트도있었습니다. : oops :
Jakube

1
다른 두 문자를 저장하는 방법을 생각했습니다. Translate +@z1"KTA"to to "KTAZ"이지만 문자열을 사용하는 대신 J"KTAZ"처음과에서 직접 사용 +@z1J합니다 J.
isaacg

@isaacg 매우 영리합니다. 감사. Btw. X선택 의 세 번째 인수를 만드는 것에 대해 꽤 오래 생각 합니다 (a와 b가 문자열 인 경우에만). 그러나 (반전 된 b, ) 또는 (b shifted) 와 같은 것들에 좋을 것이라고 Xab)평가해야 한다면 확실하지 않습니다 . 당신의 선호는 무엇입니까? Xab_bXa"</\>"Xab+tbhb
Jakube

6

CJam, 34 33 바이트

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

연산

논리는 간단합니다. 나는 소송을 나타내는 두 번째 문자에 우선 순위를 부여하는 사용자 정의 정렬을 진행하고 있습니다. 여기서 스페이드는 가장 높은 우선 순위를 가지며 첫 번째로 던진 스위트를 가져옵니다. 나머지는 모두입니다 -1. 그런 다음 Twith AQwith K를 바꿔 어휘 정렬 을 수행하여 첫 번째 문자를 정렬합니다.

코드 설명

먼저, 카드 액면가의 어휘 순서가 무엇인지 봅시다 :

"23456789TJQKA"$

23456789AJKQT

따라서 모든 숫자가 올바른 위치에 있습니다. J올바른 위치에 있습니다. 우리는 교환 할 필요가 KQJA어휘 순서를 얻을 수 있습니다.

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

자바 스크립트 (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

펄, 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 개의 입력 문자 삼중 항과 하나의 duplet (예 : 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, chop은 일반적으로 이진 함수 (arity 2)이지만 하나의 입력에서만 호출되면 .split()문자열 메서드로 사용됩니다.

  • S: 일반적인 정렬 동작을 적용하여 번호가 낮은 카드를 높은 카드보다 먼저 정렬합니다.

  • ox"TJQKA"hN: 카드 의 첫 글자 ( x)의 문자열에서 색인 ( )으로 카드를 주문합니다 . 숫자가있는 카드의 경우 첫 글자를 찾지 못해 결과가 나타납니다 . Pyth의 정렬 기능이 안정적이므로 번호가 매겨진 카드의 순서는 영향을받지 않습니다."TJQKA"hN-1

  • o}@z1Z: 다음으로 첫 번째 카드 ( @z1) 의 수트가 해당 카드에 있는지 여부에 따라 주문합니다 . True뒤에 정렬 되기 때문에 False리드 슈트 카드를 뒷면 으로 보냅니다.

  • o}\SN: 이것은 이전과 동일하지만 문자 S가 카드 에 있는지 여부를 정렬하여 스페이드를 뒤쪽으로 보냅니다.

  • hxczde: 이렇게 정렬 된 마지막 카드를 추출하고 ( e) 카드 목록에서 색인을 찾은 다음 ( xczd) 1 ( h) 씩 증가 시켜 원하는 플레이어 위치를 지정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.