Maça hile kim kazanır


19

Maça oyununda kimin dört kart numarası kazandığını belirlemek için kod yazın . En az bayt kazanır.

Giriş, sırayla oynanan dört kartı listeleyen bir dizedir TH QC JH 2H(Ten of Hearts, Kulüplerin Kraliçesi, Hearts Jack, Two of Hearts). Bir kart iki karakterle verilir: bir takım elbise CDHSve bir değer 23456789TJQKA. Girişin geçerli ve kartların farklı olduğu garanti edilir.

Hile kazanan için 1, 2, 3 veya 4 sayısını çıkarmalısınız. Örnekte TH QC JH 2H, kalplerin krikosu hileyi kazanır, bu yüzden 3 çıktısı almalısınız.

Son satırların isteğe bağlı olması dışında, giriş ve çıktınız tam olarak açıklandığı gibi olmalıdır.

İşte bir numara kazanmak için Maça kuralları. Kazanan kart, bazı uyarılarla dördün en yüksek kartıdır. Maça koz kıyafetidir , bu nedenle herhangi bir maça küreksizliği geride bırakır. Oynanan ilk kartın takımı lider takımdır ve sadece o takımın veya maça kartlarının numaralarını kazanma hakkı vardır. Aynı türden kartlar, artan sırayla verilen değerleri ile karşılaştırılır 23456789TJQKA.

Test senaryoları:

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

Yanıtlar:


10

Pyth, 28 27 25 bayt

J"KTAZ"hxcz)eo_XN+@z1JJcz

Çevrimiçi deneyin: Gösteri veya Test Paketi (ilk 4 karakter test paketi yapısıdır)

2 karakter kaydeden bir numara için @isaacg'a teşekkürler.

Ana fikir, her elin karakterlerini, kazanan elin maksimum değere sahip olacak şekilde değiştirmektir.

Ellerin değerleri 23456789TJQKAzaten neredeyse sıralanmıştır. Sadece Tbununla A, Kbununla Tve Abununla Zsonuçlanmak zorundayım 23456789AJQSZ.

Takım elbise sırası CDHSen önemlisi için değil. S, zaten en yüksek değer olan en güçlü takım. Önemli olan, birinci elin elbisesine ikinci en güçlü değeri vermektir. Bu kıyafeti ben çeviriyorum K.

Takım elbise değerden daha güçlü olduğu için tüm ellerin de ters okunması gerekir.

                           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

Ben pes ettim, iyi oynadım: P
orlp

Ben .eşeyler buna değer olduğunu sanmıyorum - oanlamaya göre 1 karakter daha kısadır.
isaacg

@isaacg Hakkınız. Komik olan şey, 28 çözümden önce 27 çözüm buldum .e. Ancak 27 çözelti a ile sona erdi )ve bu nedenle de 28 bayt vardı. : oops:
Jakube

1
Ben başka bir 2 karakter kaydetmek için bir yol düşündüm: gelen +@z1"KTA"çevirmek "KTAZ", ancak dizeleri kullanmak yerine doğrudan J"KTAZ"başında ve +@z1Jiçin kullanın J.
isaacg

@isaacg Çok zeki. Teşekkürler. Btw. XIsteğe bağlı 3 argüman yapmak hakkında oldukça uzun bir süre düşünüyorum (Sadece a ve b dizeleri ise). Ama emin değilim, eğer Xab)değerlendirmek gerekirse Xab_b(ters b, gibi şeyler için iyi olurdu Xa"</\>") veya Xab+tbhb(b kaydırılmış). Tercihiniz nedir?
Jakube

6

CJam, 34 33 bayt

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

Algoritma

Mantık basit. Özel bir sıralama devam ediyor, ilk önce elbiseyi temsil eden ikinci karaktere öncelik veriyorum. Burada, Spades en yüksek önceliği ve daha sonra ilk atılan paketi alır. Gerisi hepsi -1. Sonra sözcüksel sıralama ile Tbirlikte Ave Qile ilk karakter Ksıralamak.

Kod açıklaması

Öncelikle, kartların yüz değerlerinin sözcüksel sırasının ne olduğunu görelim:

"23456789TJQKA"$

23456789AJKQT

Böylece, tüm sayılar doğru konumdadır. Jaynı zamanda doğru konumdadır. Biz takas gerekir Kve Qve Jve Asözcük sırasını alır.

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";

Buradan çevrimiçi deneyin


3

JavaScript (ES6), 112

Listeyi tarayın ve bulunan en yüksek değerin konumunu döndürün.

Test etmek için snippet'i çalıştırın (Firefox'ta)

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 bayt

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

Beni dene .

Kart adlarını, oyun değeri sırası alfabetik sıraya göre takip edecek şekilde dönüştürür, ardından sıralayarak en yüksek değeri alır ve orijinal dize içinde konum için arar.


2

Yakut, 59 + 2 = 61

Komut satırı bayrakları naile çalıştırın

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

2

J, 47 bayt

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

Kullanımı:

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

Yöntem:

  • Her girdi karakterleri için, 'S[second char of input]AKQJT9876543'dizedeki konumuna göre bir değer atarız . Bulunamayan karakterlerin değeri last position + 1dolaylı olarak alınır. Diğer karakterlerin değeri daha düşüktür ( value=(16-position)!).
  • 3 giriş-karakter üçlüsü ve bir çiftçinin (ör. TH_ QC_ 9S_Ve 8S) toplamını hesaplayın .
  • Maksimum değerin 1 tabanlı dizinini seçin.

(J maalesef karakterleri veya dizeleri doğrudan karşılaştıramaz. Sadece bu meydan okuma için diğer bazı yaklaşımları dışlayan eşitliklerini kontrol edebilir.)

Burada çevrimiçi deneyin.


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);}}}

Nasıl çalışır: Kartın "değerini" hesaplamak için her eli yineleyin .. en değerli endeksi saklayın. Bir kart değeri, bir kürek veya açılış takımı değilse, kartın sırası 0 ile çarpılır, açılış takımıysa 1 ve kürek ise açılış takım değilse 9'dur. (9 seçilen b / c 2 * 9 = 18> A = 14 ve 9 tek bir karakterdir)


1

Pyth, 36 33 bayt

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

Oldukça basit bir yaklaşım, özel bir anahtar işleviyle sıralama kullanır, ardından en yüksek değerin dizinini bulur.


Sıralamadan kaçınmaya çalıştınız ve sadece en yüksek değeri buldunuz mu? Daha kısa olduğu ortaya çıkan JavaScript içinde
edc65

@ edc65 Pyth'de sadece en yüksek değeri bulmak için hiçbir işlem yoktur. Ancak bir karakter ( e) ile son öğeyi elde edebilirsiniz, bu nedenle en yüksek değeri bulmak sadece sıralama ve son öğeyi almaktır.
orlp

Downvoter, açıklamak ister misin?
orlp

1

Pyth, 31 bayt

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

Burada deneyin.

Nasıl çalışır:

Bu prosedürü okumanın doğru yolu öne gelir. Yordam, istenen kartı listenin sonuna kadar sıralar, daha sonra çıkarır ve dizinini orijinal listede bulur.

  • cz: Kart dizelerinin listesini oluşturur. c, chop, normalde bir ikili fonksiyondur (arity 2), ancak yalnızca bir girdi çağrıldığında .split()dize yöntemi olarak işlev görür .

  • S: Bu, daha düşük numaralı kartları yüksek olanlardan önce sıralayan normal sıralama davranışını uygular.

  • ox"TJQKA"hN: Bu, kartları , kartın ( ) ilk harfinin xdizesindeki index ( ) 'e göre sıralar . Rakamlı kartlarda, sonucu veren ilk harf bulunmaz . Pyth'in sıralama işlevi sabit olduğundan, numaralı kartların sırası etkilenmez."TJQKA"hN-1

  • o}@z1Z: Ardından, oynanan ilk kartın ( @z1) takımının söz konusu kartta olup olmadığına karar veririz . Yana Truegeride türlü Falsebu arkasına kurşun takımdan kartları gönderir.

  • o}\SN: Bu, önceki sıralama ile aynıdır, ancak mektubun Skartta olup olmadığını sıralar ve arkaya maça gönderir.

  • hxczde: Bu şekilde sıralanan son kart çıkarılır ( e), dizin listesinde kartlar ( xczd) bulunur ve 1 ( h) arttırılır ve istenen oyuncu konumu verilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.