Skor satu tangan Hati

22

Hearts adalah permainan kartu pengambilan trik untuk 4 pemain. Setiap trik diambil oleh pemain yang memainkan kartu tertinggi dari suit terkemuka. Di akhir masing-masing tangan, para pemain mengeluarkan skor penalti tergantung pada kartu penalti yang mereka ambil; tugasnya adalah menentukan skor di bawah aturan Microsoft Hearts .

Memasukkan

Input adalah 4 daftar (atau string, array, dll. Terbatas) yang menunjukkan kartu penalti yang diambil oleh masing-masing dari 4 pemain. Kartu penalti adalah

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

yang akan kami wakili sebagai

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

masing-masing.

Keluaran

Output adalah 4 poin penalti yang dikeluarkan oleh 4 pemain (daftar, string, array, dll.). Skor adalah sebagai berikut:

  • Setiap hati ( , diwakili oleh bilangan bulat 1hingga 13inklusif) menimbulkan 1 poin
  • Ratu sekop ( Q♠, diwakili oleh 0) mengeluarkan 13 poin
  • Pengecualian: jika seorang pemain telah mengambil semua kartu penalti (disebut shooting the moon), maka dia mengeluarkan 0 poin, sementara semua pemain lain mengeluarkan 26 poin.

Uji kasus

[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

Kode terpendek dalam byte menang.

u54112
sumber

Jawaban:

3

CJam, 22 20 byte

Terima kasih kepada jimmy23013 untuk menghemat 2 byte.

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

Blok tanpa fungsi (fungsi), yang mengambil daftar 4 daftar sebagai input dan mengembalikan daftar skor.

Cobalah online!

Penjelasan

{      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.
Martin Ender
sumber
_26&1b. -2 byte.
jimmy23013
@ jimmy23013 Ahhhh, 1b... Saya sedang mencoba mencari cara singkat untuk berubah [26]menjadi 26dan []menjadi 0tetapi entah bagaimana itu tidak terjadi pada saya. Terima kasih :)
Martin Ender
8

R, 85 77 74 byte

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

Fungsi tanpa nama yang menggunakan daftar-R sebagai input. Bekerja dengan menghitung jumlah elemen >0dan menambahkan 13 jika ada elemen dalam setiap vektor <1(yaitu ratu sekop) dan simpan sebagai z.

Jika setiap elemen dalam zadalah >25, kembali 26-z, lain kembali z.

Cobalah R-biola

Billywob
sumber
1
Akan 26-zbekerja
u54112
@ lastresort Ya tentu saja. / facepalm
Billywob
4

C ++ 14, 158 byte

Seperti Lambda yang tidak disebutkan namanya:

[](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;}

Membutuhkan vector<vector<int>>dan mengembalikanvector<int>

Tidak Disatukan:

[](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;
}

Beberapa testcases untuk Anda:

 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}};
Karl Napf
sumber
4

Python 2, 75 72 71 byte

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

Mengambil input sebagai [2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]

TFeld
sumber
Bisakah Anda menyimpan 3 karakter dengan menggunakan 12 * [0in a] bukan [0,12] [0in a]?
Costantino
@ Costantino, saya pikir maksud Anda 12*(0in a).
mbomb007
print[[x,26-x][26in i]for x in i]lebih pendek satu byte.
mathmandan
3

PHP, 113 byte

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

fungsi mengambil array array, mengembalikan array nilai.


Kagumi pemetaan array lain di PHP: loop dengan item yang dirujuk. Waaay lebih pendek dari array_map.

Titus
sumber
3

Haskell, 62 59 56 byte

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

Pemakaian:

> f.map(sum.map((13^).(0^))) $ [[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], [], [], [1]]
[25,0,0,1]
Angs
sumber
Saya pikir Anda dapat menulis fsebagai f n=13^0^n.
xnor
@ xnor saya pikir Anda benar. Menghemat 3 byte.
Angs
Saya pikir mendefinisikan f x|all(<26)x=x|0<1=map(26-)xdan menggunakannya sebagai pengganti fungsi lambda menghemat beberapa byte.
Zgarb
@ Zgarb benar Anda, saya akan mengatakan itu 3 byte lagi.
Angs
2

05AB1E ,26 22 21 byte

Trailing whitespace harus dihapus dari input sehingga ditafsirkan sebagai array. Akhirannya terinspirasi dari jawaban lain ketika menggunakan (26-x) ketika seorang pemain mengumpulkan semua kartu penalti.

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

Cobalah online!

Itu masih terlihat cukup golf, dengan konstanta ganda dan pernyataan bersyarat.

Versi sebelumnya, 26 byte

(Satu byte untuk setiap titik dalam nilai penalti maksimal)

Saya memutuskan untuk menyimpannya karena panjangnya paling cocok dengan tantangan ini menurut saya :).

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

Cobalah online!

Osable
sumber
2

Python 3, 101 byte

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]

Kode lengkap:

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]
Jimmy Johnson
sumber
12*(c<1)+1lebih pendek 2 byte dari (1,13)[c==0]. 26*(s>25)lebih pendek 3 byte dari (26,0)[s==26].
Mego
2

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

Disimpan 2 byte berkat @Neil

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], [], []]));

Kerusakan

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
Lmis
sumber
c=>b*26^cmenghemat 2 byte.
Neil
1

Pip , 28 byte

27 byte kode, +1 untuk -pbendera.

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

Mengambil input pada baris perintah sebagai string yang mewakili daftar bersarang, seperti "[[2 8 7 1] [3 4] [] [9 5 6 0 10 11 12 13]]"(tanda kutip tidak diperlukan pada TIO). Cobalah online!

DLosc
sumber
1

Ruby, 59 byte

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

Atau, sebagai alternatif,

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

Jika hanya satu tangan yang memiliki kartu, kami ingin tangan kosong mendapatkan nilai 26, dan tangan dengan kartu mendapatkan nilai 0. Saya melakukan ini dengan memanggil mintangan - ini mengembalikan nilarray kosong, dan kemudian Saya ||memasukkannya menjadi 26. Dalam kasus lain, saya menghitung jumlah kartu di tangan dan kemudian menambahkan 12 ke Queen of Spades.

Lee W
sumber
0

Scala, 93 byte

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

Pemakaian:

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

Penjelasan:

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 %
}

Saya bisa menggunakan %toSet 26bukan % contains 26karena Set's applymetode adalah containsdan tidak mendapatkan-di-indeks seperti Seq' s

corvus_192
sumber