Erziele eine Hand aus Herzen

22

Hearts ist ein trickreiches Kartenspiel für 4 Spieler. Jeder Stich wird von dem Spieler ausgeführt, der die höchste Karte der führenden Farbe gespielt hat. Am Ende jeder Hand erhalten die Spieler eine Strafpunktzahl, abhängig von den Strafkarten, die sie genommen haben. Die Aufgabe besteht darin, die Punktzahlen gemäß den Microsoft Hearts- Regeln zu ermitteln.

Eingang

Die Eingabe besteht aus 4 Listen (oder einer begrenzten Zeichenfolge, einem Array usw.) mit den Strafkarten, die von jedem der 4 Spieler gezogen wurden. Die Strafkarten sind

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

was wir als darstellen werden

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

beziehungsweise.

Ausgabe

Ausgabe sind die 4 Strafpunkte, die die 4 Spieler erhalten (Liste, Zeichenfolge, Array usw.). Die Wertung lautet wie folgt:

  • Jedes Herz ( dargestellt durch ganze Zahlen 1bis 13einschließlich) erhält 1 Punkt
  • Die Pik Dame ( Q♠vertreten durch 0) erhält 13 Punkte
  • Ausnahme: Hat ein Spieler alle Strafkarten (als Mondschießen bezeichnet) genommen, erhält er 0 Punkte, während alle anderen Spieler 26 Punkte erhalten.

Testfälle

[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

Kürzester Code in Bytes gewinnt.

u54112
quelle

Antworten:

3

CJam, 22 20 Bytes

Danke an jimmy23013 für das Speichern von 2 Bytes.

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

Ein unbenannter Block (Funktion), der eine Liste von 4 Listen als Eingabe verwendet und die Liste der Punkte zurückgibt.

Probieren Sie es online!

Erläuterung

{      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
quelle
_26&1b. -2 Bytes.
Jimmy23013
Ahhhh @ jimmy23013, 1b... Ich habe versucht , einen kurzen Weg zu finden, biegen Sie [26]in 26und []in , 0aber irgendwie , das nicht zu mir kommen. Vielen Dank :)
Martin Ender
8

R 85 77 74 Bytes

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

Unbenannte Funktion, die eine R-Liste als Eingabe verwendet. Zählt die Anzahl der Elemente >0und fügt 13 hinzu, wenn sich ein Element in jedem Vektor befindet <1(dh Pik Dame) und speichert als z.

Wenn ein Element in zist >25, kehre zurück 26-z, sonst kehre zurück z.

Probieren Sie es auf R-Geige

Billywob
quelle
1
Würde 26-zfunktionieren
u54112
@lastresort Ja natürlich. / facepalm
Billywob
4

C ++ 14, 158 Bytes

Als unbenannter Lambda:

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

Benötigt ein vector<vector<int>>und kehrt zurückvector<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;
}

Einige Testfälle für Sie:

 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
quelle
4

Python 2, 75 72 71 Bytes

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

Übernimmt die Eingabe als [2, 8, 7, 1], [3, 4], [], [9, 5, 6, 0, 10, 11, 12, 13]

TFeld
quelle
Könnten Sie 3 Zeichen mit 12 * [0in a] anstelle von [0,12] [0in a] speichern?
Costantino
@Costantino Ich denke du meinst 12*(0in a).
mbomb007
print[[x,26-x][26in i]for x in i]ist ein Byte kürzer.
Mathmandan
3

PHP, 113 Bytes

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

Funktion nimmt ein Array von Arrays, gibt ein Array von Werten zurück.


Bewundern Sie die anderen Array-Zuordnungen in PHP: Schleifen mit Elementen, auf die verwiesen wird. Waaay kürzer als array_map.

Titus
quelle
3

Haskell, 62 59 56 Bytes

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

Verwendung:

> 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
quelle
Ich denke du kannst schreiben fals f n=13^0^n.
Xnor
@ xnor ich denke du hast recht. Spart 3 Bytes.
Angs
Ich denke, das Definieren f x|all(<26)x=x|0<1=map(26-)xund Verwenden anstelle der Lambda-Funktion spart einige Bytes.
Zgarb
@Zgarb richtig, ich würde sagen, das sind noch 3 Bytes.
Angs
2

05AB1E ,26 22 21 Bytes

Das nachfolgende Leerzeichen muss aus der Eingabe entfernt werden, damit es als Array interpretiert wird. Das Ende wurde von den anderen Antworten bei Verwendung von (26-x) inspiriert, wenn ein Spieler alle Strafkarten gesammelt hat.

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

Probieren Sie es online!

Es sieht immer noch ziemlich gut aus, mit doppelten Konstanten und bedingten Anweisungen.

Frühere Version, 26 Bytes

(Ein Byte für jeden Punkt im maximalen Strafwert)

Ich habe beschlossen, es so zu belassen, wie es meiner Meinung nach am besten zu dieser Herausforderung passt :).

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

Probieren Sie es online!

Osable
quelle
2

Python 3, 101 Bytes

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]

Vollständiger Code:

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
quelle
12*(c<1)+1ist 2 Bytes kürzer als (1,13)[c==0]. 26*(s>25)ist 3 Bytes kürzer als (26,0)[s==26].
Mego
2

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

2 Bytes dank @Neil gespeichert

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

Nervenzusammenbruch

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
quelle
c=>b*26^cSpart 2 Bytes.
Neil
1

Pip , 28 Bytes

27 Byte Code, +1 für -pFlag.

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

Übernimmt die Eingabe in der Befehlszeile als Zeichenfolge, die eine verschachtelte Liste darstellt, z. B. "[[2 8 7 1] [3 4] [] [9 5 6 0 10 11 12 13]]"(Anführungszeichen werden in TIO nicht benötigt). Probieren Sie es online!

DLosc
quelle
1

Ruby, 59 Bytes

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

Oder alternativ,

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

Wenn nur eine Hand Karten hat, möchten wir, dass die leeren Hände einen Wert von 26 und die Hand mit Karten einen Wert von 0 erhalten. Ich rufe dazu mindie Hände an - dies ergibt nilein leeres Array und dann I ||it into 26. In anderen Fällen zähle ich die Anzahl der Karten in einer Hand und addiere dann 12 zur Pik Dame.

Lee W
quelle
0

Scala, 93 Bytes

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

Verwendung:

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

Erläuterung:

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

Ich könnte %toSet 26anstelle von verwenden, % contains 26weil Set's applyMethode ist containsund nicht wie Seq' s Get-at-Index

corvus_192
quelle