Bir elin kalbini puanla


22

Hearts , 4 oyuncu için hileli bir kart oyunudur. Her numara, birinci takımın en yüksek kartını oynayan oyuncu tarafından alınır. Her elin sonunda, oyuncular almış oldukları ceza kartlarına bağlı olarak bir penaltı puanı alırlar; Görev, Microsoft Hearts kuralları uyarınca puanları belirlemektir .

Giriş

Giriş, 4 oyuncunun her biri tarafından alınan ceza kartlarını gösteren 4 listedir (veya sınırlandırılmış dize, dizi vb.). Ceza kartları

2♥, 3♥, 4♥, 5♥, 6♥, 7♥, 8♥, 9♥, 10♥, J♥, Q♥, K♥, A♥, Q♠

olarak temsil edeceğimiz

2,  3,  4,   5,  6,  7,  8,  9,  10,  11, 12,  13,  1,  0

sırasıyla.

Çıktı

Çıktı, 4 oyuncunun (liste, dizi, dizi vb.) Aldığı 4 penaltı puanıdır. Puanlama aşağıdaki gibidir:

  • Her kalp ( dahil olan tamsayılar 1ile temsil edilir 13) 1 puan alır
  • Maça kızı ( Q♠, ile temsil edilen 0) 13 puan kazanıyor
  • İstisna: Eğer bir oyuncu bütün ceza kartlarını aldıysa (ayın vuruşu denir), o zaman 0 puan alır, diğer tüm oyuncular 26 puan alır.

Test durumları

[2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]     -->  4,  2,  0, 20
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1]   --> 25,  0,  0,  1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], [], [] -->  0, 26, 26, 26

Bayt cinsinden en kısa kod kazanır.

Yanıtlar:


3

CJam, 22 20 bayt

2 bayt tasarrufu için jimmy23013'e teşekkürler.

{{XD?}f%1fb_26&1bf^}

Giriş olarak 4 listenin bir listesini alan ve puanların listesini döndüren adsız bir blok (işlev).

Çevrimiçi deneyin!

açıklama

{      e# For each card...
  XD?  e#   Choose 1 if it's positive and 13 if it's zero.
}f%
1fb    e# Sum each hand.
_26&   e# Get the set intersection of the scores with 26. This gives [26]
       e# if someone shot the moon, and [] otherwise.
1b     e# Treat as base-1 digits, which gives 26 if someone shot the moon
       e# and zero otherwise.
f^     e# XOR each result with this number. This swaps zeros and 26s when 
       e# someone shot the moon and does nothing otherwise.

_26&1b. -2 bayt.
jimmy23013 14:16

@ jimmy23013 Ahhhh, 1b... Ben çevirmek için kısa bir yol bulmaya çalışıyordu [26]içine 26ve []içine 0aklıma olmadığını ama her nasılsa. Teşekkür ederim :)
Martin Ender

8

R, 85 77 74 bayt

function(x,z=sapply(x,function(x)sum(x>0)+any(x<1)*13))abs(z-any(z>25)*26)

Giriş olarak bir R listesi alan adsız işlev. Eleman sayısını sayarak çalışır >0ve eğer her vektör içindeki herhangi bir eleman <1(örneğin maça kızı) ve sakladığında 13 ekler z.

Eğer içindeki herhangi bir element zise >25, return 26-z, return z.

R-kiddle'da dene


1
Çalışır 26-zmı?
u54112

@lastresort Tabii ki evet. / facepalm
Billywob

4

C ++ 14, 158 bayt

İsimsiz Lambda olarak:

[](auto c){typename decltype(c)::value_type r;int b=0;for(auto d:c){int q=0;for(auto i:d)q+=i?1:13;r.push_back(q);b+=q==26;}if(b)for(int&x:r)x=26-x;return r;}

Gerektirir vector<vector<int>>ve döndürürvector<int>

Ungolfed:

[](auto c){
 typename decltype(c)::value_type r;   //result vector
 int b=0;                              //flag if one has all cards
 for(auto d:c){                        //over all decks
  int q=0;                             //count points
  for(auto i:d) q+=i?1:13;             //+13 for queen, +1 else
  r.push_back(q);                      //add to result
  b+=q==26;                            //possibly activate flag
 }
 if(b) for(int&x:r) x=26-x;            //if flag is set, mirror the results
 return r;
}

Sizin için birkaç test penceresi:

 auto r = std::vector<std::vector<int>>{{2,8,7,1},{3,4},{},{9,5,6,0,10,11,12,13}};
 auto s = std::vector<std::vector<int>>{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0},{},{},{}};
 auto t = std::vector<std::vector<int>>{{},{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0},{},{1}};

4

Python 2, 75 72 71 bayt

i=[len(a)+12*(0in a)for a in input()]
print[[x,26-x][26in i]for x in i]

Girişi alır [2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]


[0,12] [0in a] yerine 12 * [0in a] kullanarak 3 karakter kaydedebilir misiniz?
Costantino

@Costantino Ben demek istediğini düşünüyorum 12*(0in a).
mbomb007

print[[x,26-x][26in i]for x in i]bir bayt daha kısa.
mathmandan

3

PHP, 113 bayt

function h($a){foreach($a as&$b)$b=count($b)+12*in_array(0,$b);if(max($a)>25)foreach($a as&$n)$n=26-$n;return$a;}

işlev bir dizi dizisi alır, bir dizi değer döndürür.


Diğer dizi eşlemelerini PHP'de hayret edin: başvurulan öğelerle döngüler Waaay daha kısa array_map.


3

Haskell, 62 59 56 bayt

f x|all(<26)x=x|0<1=map(26-)x
f.map(sum.map((13^).(0^)))

Kullanımı:

> f.map(sum.map((13^).(0^))) $ [[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1]]
[25,0,0,1]

Ben yazabilirsiniz düşünüyorum folarak f n=13^0^n.
xnor

@xnor Bence haklısın. 3 bayt kaydeder.
Angs,

Bence f x|all(<26)x=x|0<1=map(26-)xonu tanımlayıp lambda işlevi yerine kullanmak bazı baytları kurtarıyor.
Zgarb

@Zgarb haklısın, ben başka 3 bayt olduğunu söyleyebilirim.
Angs,

2

05AB1E ,26 22 21 bayt

İzleyen boşluk, girişten kaldırılmalıdır, böylece bir dizi olarak yorumlanır. Bir oyuncu tüm ceza kartlarını topladığında (26-x) kullanıldığında son diğer cevaplardan esinlenmiştir.

vy0å12*yg+})D26©åi(®+

v                    For each array
 y                   Push array on the stack
  0å                 Generate a boolean array indicating whether the queen of spades is at the same index in the original array
    12*              Multiply by 12 the value of the queen of spades
       yg+           Add the length of the array; the queen of spades gets her last point from this part
          }          End for
           )         Push an array of all evaluated scores
            D26©å    1 if there is a 26, 0 otherwise
                 i   If there is a 26
                  (®+ Mirror the array: for each element yield 26-element
                      Implicit end if
                      Implicitly print the score array

Çevrimiçi deneyin!

Yinelenen sabitler ve şartlı ifadelerle hala oldukça golf tutkunu görünüyor.

Eski sürüm, 26 bayt

(Maksimum ceza değerindeki her nokta için bir bayt)

Uzunluğunu bence bu zorluğa en uygun şekilde tutmaya karar verdim.

vyD0å12*sg+})D26©QDOi_®*ë\

Çevrimiçi deneyin!


2

Python 3, 101 bayt

def s(a):r=[sum([(1,13)[c==0]for c in h])for h in a];s=(r,[(26,0)[s==26]for s in r]);return s[26in r]

Tam kod:

def score(hands):
    result = [sum([(1, 13)[card == 0] for card in hand]) for hand in hands]
    results = (result, [(26, 0)[score == 26] for score in result])
    return results[26 in result]

12*(c<1)+12 bayttan daha kısa (1,13)[c==0]. 26*(s>25)3 bayttan daha kısa (26,0)[s==26].
Mego

2

JavaScript (ES6), 82 80 77 72 70 69 67 bayt

@Neil sayesinde 2 bayt kaydedildi

f = 
s=>s.map(c=>c.map(t=>r+=t?1:13,r=0)|(b|=r>25,r),b=0).map(c=>b*26^c)

console.log(f.toString().length)
console.log(f([[2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]]));
console.log(f([[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1] ]));
console.log(f([[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [1], [] ]));
console.log(f([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], [], []]));
console.log(f([[],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0], [], []]));

Yıkmak

s=>s.map(                              // for each hand
 c=>c.map(                             // for each card
  t=>r+=t?1:13,                        // add value of card
 r=0)|(
  b=b|r>25,r                           // set flag if any hand scores 26 points
 ),
 b=0)
.map(c=>b?                             // for every card if a hand scored 26
  c?0:26                               // set every 0 hand to 26 and the 26 hand to 0
:c)                                    // otherwise do nothing

c=>b*26^c2 bayt kaydeder.
Neil

1

Pip , 28 bayt

27 baytlık kod, -pbayrak için +1 .

Y{$+1+12*!*a}M Va26Ny?26-yy

Komut satırında girişi, iç içe geçmiş bir listeyi temsil eden bir dize olarak alır "[[2 8 7 1] [3 4] [] [9 5 6 0 10 11 12 13]]"( örneğin , TIO'da gerekli değildir). Çevrimiçi deneyin!


1

Ruby, 59 bayt

->a{a.map{|h|a.max.size>13?h.min||26:h.size+12*h.count(0)}}

Veya alternatif olarak,

->a{a.map{|h|a.count([])>2?h.min||26:h.size+12*h.count(0)}}

Sadece bir elinizde kart varsa, boş ellerin 26 değerini almasını ve kartların elinin 0 değerini almasını istiyoruz. Bunu minellere çağırarak yapıyorum - bu nilboş bir dizi için döner ve sonra Ben ||diğer durumlarda 26'da içine, bir elinde kart sayısını saymak ve sonra maça Queen 12 ekleyin.


0

Scala, 93 bayt

a=>{val% =a.map(_.map{case 0=>13;case _=>1}sum)
if(%toSet 26)%map{case 0=>26;case _=>0}else%}

Kullanımı:

val f:(Seq[Seq[Int]]=>Seq[Int])=...
f(Seq(Seq(2, 8, 7, 1), Seq(3, 4), Seq(), Seq(9, 5, 6, 0, 10, 11, 12, 13)))

Açıklama:

a=>{           //define an anonymou function with a parameter a
  val% =         //define % as...
    a.map(         //map each element of a...
      _.map{         //to each of the card
        case 0=>13     //replaced with its value
        case _=>1
      }
      sum            //and the sum of the values
    )
  if(            //if
    %toSet 26      //one player has all cards
  )
    %map{          //return % with...
      case 0=>26     //each 0 replaced with 26
      case _=>0      //and everything else (aka the 26) replaced 0
    }
  else           //else
    %              //return %
}

Bunun %toSet 26yerine kullanabilirim % contains 26çünkü Set's applymetodu ' s ' containsgibi bir indeks olsunSeq

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.