Ghi bàn tay của những trái tim


22

Hearts là một trò chơi đánh bài dành cho 4 người chơi. Mỗi thủ thuật được thực hiện bởi người chơi đã chơi bài cao nhất của bộ đồ hàng đầu. Ở cuối mỗi ván bài, người chơi phải chịu một số điểm phạt tùy thuộc vào thẻ phạt họ đã thực hiện; nhiệm vụ là xác định điểm số theo quy tắc Microsoft Hearts .

Đầu vào

Đầu vào là 4 danh sách (hoặc chuỗi phân cách, mảng, v.v.) hiển thị các thẻ phạt được thực hiện bởi mỗi trong số 4 người chơi. Các thẻ phạt là

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

mà chúng ta sẽ đại diện như

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

tương ứng.

Đầu ra

Đầu ra là 4 điểm phạt phát sinh bởi 4 người chơi (danh sách, chuỗi, mảng, v.v.). Ghi điểm như sau:

  • Mỗi trái tim ( , được biểu thị bằng số nguyên 1để 13bao gồm) phát sinh 1 điểm
  • Nữ hoàng của spades ( Q♠, đại diện bởi 0) phải chịu 13 điểm
  • Ngoại lệ: nếu một người chơi đã lấy tất cả các thẻ hình phạt (được gọi là bắn mặt trăng), thì anh ta phải chịu 0 điểm, trong khi tất cả những người chơi khác phải chịu 26 điểm.

Các trường hợp thử nghiệm

[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

Mã ngắn nhất trong byte thắng.

Câu trả lời:


3

CJam, 22 20 byte

Cảm ơn jimmy23013 vì đã lưu 2 byte.

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

Một khối không tên (chức năng), lấy danh sách 4 danh sách làm đầu vào và trả về danh sách điểm.

Hãy thử trực tuyến!

Giải trình

{      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 byte.
jimmy23013

@ jimmy23013 Ahhhh, 1b... Tôi đã cố gắng tìm một cách ngắn để biến [26]thành 26[]vào 0nhưng bằng cách nào đó điều đó đã không xảy ra với tôi. Cảm ơn bạn :)
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)

Hàm không tên lấy danh sách R làm đầu vào. Hoạt động bằng cách đếm số lượng phần tử >0và thêm 13 nếu bất kỳ phần tử nào trong mỗi vectơ là <1(tức là nữ hoàng của spades) và lưu trữ dưới dạng z.

Nếu bất kỳ yếu tố trong z>25, trả lại 26-z, khác trở lại z.

Hãy thử nó trên R-fiddle


1
Sẽ 26-zlàm việc?
u54112

@lastresort Có tất nhiên rồi. / facepalm
Billywob

4

C ++ 14, 158 byte

Như Lambda chưa được đặt tên:

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

Yêu cầu vector<vector<int>>và trả lạivector<int>

Ung dung:

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

Vài thử nghiệm cho bạn:

 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 byte

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

Đưa đầu vào là [2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]


Bạn có thể lưu 3 ký tự bằng cách sử dụng 12 * [0in a] thay vì [0,12] [0in a] không?
Costantino

@Costantino Tôi nghĩ bạn có ý nghĩa 12*(0in a).
mbomb007

print[[x,26-x][26in i]for x in i]ngắn hơn một 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;}

Hàm lấy một mảng các mảng, trả về một mảng các giá trị.


Marvel các ánh xạ mảng khác trong PHP: các vòng lặp với các mục được tham chiếu. Waaay ngắn hơn array_map.


3

Haskell, 62 59 56 byte

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

Sử dụng:

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

Tôi nghĩ bạn có thể viết fnhư f n=13^0^n.
xnor

@xnor Tôi nghĩ bạn đúng. Tiết kiệm 3 byte.
Angs

Tôi nghĩ rằng việc xác định f x|all(<26)x=x|0<1=map(26-)xvà sử dụng nó thay cho hàm lambda sẽ tiết kiệm một số byte.
Zgarb

@Zgarb đúng là bạn, tôi muốn nói rằng đó là 3 byte nữa.
Angs

2

05AB1E ,26 22 21 byte

Khoảng trắng lưu trữ phải được loại bỏ khỏi đầu vào để nó được hiểu là một mảng. Đoạn kết được lấy cảm hứng từ các câu trả lời khác khi sử dụng (26-x) khi người chơi thu thập tất cả các thẻ phạt.

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

Hãy thử trực tuyến!

Nó vẫn trông khá golf, với các hằng số trùng lặp và các câu điều kiện.

Phiên bản cũ, 26 byte

(Một byte cho mỗi điểm trong giá trị hình phạt tối đa)

Tôi quyết định giữ nó vì độ dài của nó phù hợp nhất với thử thách này theo ý kiến ​​của tôi :).

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

Hãy thử trực tuyến!


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]

Mã đầy đủ:

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)+1ngắn hơn 2 byte (1,13)[c==0]. 26*(s>25)ngắn hơn 3 byte (26,0)[s==26].
Mego

2

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

Đã lưu 2 byte nhờ @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], [], []]));

Phá vỡ

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^ctiết kiệm 2 byte.
Neil

1

Pip , 28 byte

27 byte mã, +1 cho -pcờ.

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

Lấy đầu vào trên dòng lệnh dưới dạng một chuỗi đại diện cho một danh sách lồng nhau, như "[[2 8 7 1] [3 4] [] [9 5 6 0 10 11 12 13]]"(trích dẫn không cần thiết trên TIO). Hãy thử trực tuyến!


1

Ruby, 59 byte

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

Hay cách khác,

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

Nếu chỉ một tay có bất kỳ thẻ nào, chúng tôi muốn hai bàn tay trắng có giá trị 26 và tay có thẻ nhận giá trị 0. Tôi thực hiện điều này bằng cách gọi mintrên tay - điều này trả về nilcho một mảng trống, và sau đó Tôi đưa ||nó vào 26. Trong các trường hợp khác, tôi đếm số lượng thẻ trong một tay và sau đó thêm 12 vào Queen of Spades.


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

Sử dụng:

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

Giải trình:

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

Tôi có thể sử dụng %toSet 26thay vì % contains 26Set's applyphương pháp là containsvà không nhận được-at-index như Seq' s

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.