Köprü El Puanlaması


13

Sözleşme köprüsünü çok ilginç kılan şeylerden biri son derece karmaşık "yapay" meta oyunudur. Bu el puanlama sistemi bunun küçük bir parçasıdır.

Köprü bir aldatıcı kart oyunudur. Her oyuncu 13 kartlık bir ele sahip olur ve oyun teklifle başlar . Teklif, oyunun geri kalanının nasıl oynayacağını belirler ve bu da oyunun önemli bir parçasıdır. Sizin ve eşinizin çok yüksek (veya çok düşük) teklif vermemesini sağlamak için, bu yapay puanlama sistemi, elinizin ne kadar iyi olduğunu söylemek için geliştirilmiştir.

puanlama

İşte örnek bir el:

S:KQT5
H:J72
D:965
C:AK8

S, H, D, C takımları temsil eder (maça, kupa, elmas ve kulüpler) ve geri kalanı bu takımlardaki kartlardır. Yani bu el bir maça kraliçesi (Q), maça kralı (K), on maça (T), beş maça, kupa krikosu, yedili kalp vb.

Puanlama sistemi aşağıdaki gibi çalışır:

  • Sahip olduğunuz her as (A) için 4 puan, her kral (K) için 3 puan, her kraliçe (Q) için 2 puan ve her kriko (J) için 1 puan alırsınız. Başka kart verilmez.
  • Bir takımda dördüncü sıradaki her kart size 1 puan kazandırır. Eğer altı kalbiniz varsa, 2 puan alırsınız.
  • Sadece 2 kartınız olan bir takım size 1 puan verir (bu bir doubleton). Sadece 1 kartınız olan bir takım size 2 puan verir (bu bir singleton). Belirli bir takımda kartınız yoksa 3 puan alırsınız (bu bir boşluktur). (Genellikle bunlar sadece partnerinizle bir takım elbise üzerinde anlaştıktan sonra sayılır, ancak bunları daha ilginç hale getirmek için dahil ediyorum.)

Yukarıdaki elin 13 puanı var.

Meydan okuma

Yukarıda gösterilen formatta bir köprü eli verildiğinde, elin kaç puan olduğunu hesaplayın. Takım elbise her zaman maça, kupa, karo ve kulüp sıralarında listelenecek ve kartlar her zaman A, K, Q, J, T, 9 - 2 şeklinde sıralanacaktır.

Örnek Girişler ve Çıkışlar

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

Bu , bayt en kısa kod kazanır.

Yanıtlar:


4

Jöle, 27 25 21 bayt

-3 bayt için @Dennis teşekkürler!

L_5.AḞW+“JQKA”i$€Sµ€S

Bu, girdiyi satır listesi olarak alır. Girdiyi çok satırlı bir dize olarak almak için a ṣ⁷µ.

Frekans noktalarının bir tablosunun yapılması:

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

eşit olduklarını görebiliriz abs(c-3.5)-.5, burada c kart sayısıdır. Her satır iki ekstra karakter içerdiğinden ve nokta sayısı her zaman bir tamsayı olduğundan, bu, floor(abs(l-5.5))l'nin satır uzunluğu olduğu yerdir.

Jelly'in indekslerinin 1 tabanlı olduğunu ve aynı zamanda vectorized fonksiyonların uyumsuz boyutlar üzerindeki davranışını unutmayın: daha uzun listenin ekstra elemanları etkilenmez. Yani [1] + [3,2,0,0]verir [4,2,0,0].

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

Burada deneyin .


3

ES6, 107 99 89 bayt

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)

2

Pyth, 27 25 24 bayt

sms+a5.5ldshMxL"JQKA"d.z

Her takım için değerleri ayrı ayrı hesaplıyoruz, sonra ekliyoruz.

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

Test takımı .


1

Retina, 77 59 bayt

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

Çizgi / çizgi çiftleri ile açıklama:

  • İlk satır biz karakterleri dönüştürmek AKQJT987655432için 5432111111111. Bu, her takım için bir toplamımız olduğu anlamına gelir. 0 1 2 3 4 5 6 7 ...Bu takımda kartlarımız varsa , toplam +3 +1 -1 -3 -4 -4 -4 -4 ...doğru skordan kapanır .
  • Bunu düzeltmek için 2 ve 3 satırlarında her satıra 3 ekleriz ve boşluktan önce çıkaracağımız değerler ekleriz. Çıkarılan bu değer, en fazla 3 olan kartların iki katı ve en az 4 kart varsa 1 kadardır.
  • 4. ve 5. satırlarda, basamakları ayırıcı boşluk hariç diğer her şeyi bırakarak tekil hale getiririz.
  • 6. ve 7. satırlarda tekli çıkarma yaparız.
  • 8. satırda 1sonucu veren 'ler sayılır .

Burada çevrimiçi deneyin.



1

Stax , 18 bayt

½Γ}♣▓="pì∩û╨▐M↨}╚-

Şimdiye kadar en kısa cevap, Jelly'i yendi (yakında yenilmeyi beklesem de ...)

Çevrimiçi çalıştırın ve hata ayıklayın!

açıklama

Açıklamak için ambalajsız sürümü kullanır.

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

Bu çeviri ile elde edilir

  • Bir takımda dördüncü sıradaki her kart size 1 puan kazandırır. Eğer altı kalbiniz varsa, 2 puan alırsınız.
  • Sadece 2 kartınız olan bir takım size 1 puan verir (bu bir doubleton). Sadece 1 kartınız olan bir takım size 2 puan verir (bu bir singleton). Belirli bir takımda kartınız yoksa 3 puan alırsınız (bu bir boşluktur).

için

  • Her takım için 3 ekstra puan kazan
  • Bir takımda dördüncü öncesi her kart size -1 puan verir, dördüncü sonrasında her kart size 1 puan verir, dördüncü kart 0 puan verir.

Daha sonra signum fonksiyonunun özelliğini kullanabiliriz.

Bunu yaparak, birkaç bayt tasarruf sağlayan kart sayısının açıkça kullanılmasını önleyebiliriz.

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.