Golf (6 Karten) Golf!


10

Golf Golf!

Dies ist meine erste Herausforderung, also sei bitte sanft! Die Herausforderung besteht darin, ein Programm zu schreiben, das die richtige Punktzahl für ein Layout im Kartenspiel "Golf" ausgibt.

Das Kartenspiel Golf hat viele Variationen. Die Hausregeln, die ich verwende, folgen mit einem kleinen Unterschied den Standardregeln für Six-Card-Golf von Pagat. Hier gibt es bereits eine ähnliche Herausforderung , aber ich denke, diese ist interessanter, da Sie die Ausrichtung der Karten berücksichtigen müssen.

Jeder Spieler hat ein 2x3 Kartenlayout. Am Ende jeder Runde werden alle Karten aufgedeckt und wie folgt gewertet:

  • Jedes Ass zählt 1 Punkt.
  • Jeweils zwei zählen minus zwei Punkte.
  • Jede Zahlenkarte von 3 bis 10 erhält einen Nennwert.
  • Jeder Jack oder jede Queen erhält 10 Punkte.
  • Jeder König erhält null Punkte.
  • Ein Paar gleicher Karten in derselben Spalte erhält null Punkte für die Spalte (auch wenn die gleichen Karten zwei sind).
  • Ein Satz von drei gleichen Karten in derselben Reihe erhält null Punkte für die Reihe (selbst wenn die gleichen Karten zwei sind).

Eingang

Die Eingabe kann eine Zeichenfolge oder ein Array beliebiger Art sein.

Ausgabe

Eine Ganzzahl, die die Punktzahl der Golfhand darstellt.

Beispiele

Diese Beispiele verwenden die Notation, A23456789TJQKaber Sie müssen diese Notation in Ihrer Antwort nicht verwenden.

Layout
AK3
J23

Score
9
-----------------------    
Layout
25Q
25J

Score
20
-----------------------        
Layout
T82
T8A

Score
-1
-----------------------        
Layout
QQQ
234

Score
5
-----------------------        
Layout
TJQ
QTJ

Score
60
-----------------------
Layout
888
382

Score
1
-----------------------
Layout
888
888

Score
0

Dies ist Code Golf, also gewinnt die kürzeste Antwort in Bytes!


6
Sollte das erste Beispiel nicht 9 Punkte bringen?
Jonathan Allan

2
Schöne erste Herausforderung! Als kleine Anmerkung sind die Teile "(auch wenn die gleichen Karten zwei sind)" unnötig und bei dieser Herausforderung etwas verwirrend, da die resultierende Punktzahl nicht mit den Punktzahlen anderer Spieler verglichen wird. Stattdessen möchten Sie möglicherweise klarstellen, dass die Punktzahlen für alle Spalten und Zeilen die einzelnen Bewertungen der Karten in der jeweiligen Spalte oder Zeile überschreiben.
Erik der Outgolfer

1
"... oder Array jeglicher Art" - muss der Inhalt Zeichen sein (oder können wir die Zuordnung von Zeichen zu Werten umgehen)?
Jonathan Allan

@ JonathanAllan Hm, es heißt "Diese Beispiele verwenden die Notation, A23456789TJQKaber Sie müssen diese Notation nicht in Ihrer Antwort verwenden."
Erik der Outgolfer

2
Ich würde vorschlagen, einen Testfall mit einer Spalte UND einer Zeile hinzuzufügen, die gleich ist, wie JJJ 2J2-> -4.
Jonathan Allan

Antworten:


5

Gelee , 9 Bytes

n/aEÐḟẎḞS

Probieren Sie es online aus!

-1 danke an Jonathan Allan .

[[A, B, C], [D, E, F]]AF(1,- -2,3,4,5,6,7,8,9,10,10.1,10.2,0)EIN,2,3,4,5,6,7,8,9,T.,J.,Q.,K.


4

Haskell , 107 103 98 Bytes

f m=sum[min 10k|r<-m,o<-m,any(/=r!!0)r,(j,x)<-zip o r,j/=x,(k,c)<-zip[-2..]"2 KA 3456789TJQ",c==x]

Probieren Sie es online aus!

Nutzt die Tatsache, dass es nur zwei Zeilen gibt. Wir iterieren doppelt über die Zeilen und nehmen eine Zeile rund eine Zeile o. Wenn es sich um dieselbe Zeile handelt, ist das Ergebnis immer Null (aufgrund der Übereinstimmung der "Spalten"), sodass wir nur die beiden Iterationen berücksichtigen, in denen rund oauf unterschiedliche Zeilen verweisen. Ich stelle die Zeilen auf Null, indem ich zuerst prüfe, ob Einträge in der Zeile nicht den ersten entsprechen. Wenn die Zeile alle gleich ist, ist dies falsch und die Liste ist leer mit einer Summe von 0. Andernfalls zippe ich diese Zeile mit der anderen und iteriere über die Paare, die nicht gleich sind (dies setzt gleiche Spalten in einer ähnlichen Null auf Null) Weise). Schließlich indiziere ich eine Liste von Kartenrängen, beginnend mit -2 Auffüllen mit Leerzeichen nach Bedarf, um jeden Rang seiner Punktzahl zuzuordnen. Ich muss nur benutzenmin 10 Diesen Index zu klemmen, um Buben und Königinnen herzustellen, kostet 10 statt 11 und 12.

EDIT: danke an @xnor für das Entfernen von 4 Bytes! Ich wusste nicht, dass Sie Bezeichner direkt nach Zahlenliteralen setzen können, was wirklich cool ist!

EDIT2: Nochmals vielen Dank an @xnor für weitere 5 Bytes! Tolle Idee, so über die Zeilen zu iterieren


1
Schöne Lösung! Zwei kleinere Optimierungen: Sie brauchen nicht den Raum nach 10, und es ist kürzer die wegzulassen @(a:_)und stattdessen schreiben r!!0zu a.
xnor

1
Ein anderer Gedanke: Da a%aund b%bNull sind, sieht es aus wie Sie definieren können fdirekt durch Iteration über Linienpaare wie folgt .
xnor

3

Holzkohle , 50 Bytes

F²⊞υS≔⁰ζF⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ≡ι2≧⁻²ζA≦⊕ζKω≧⁺∨ΣιχζIζ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

F²⊞υS

Lesen Sie das Layout in ein Array.

≔⁰ζ

Initialisieren Sie die Punktzahl auf Null.

F⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ

Filtern Sie nach der Eingabe und entfernen Sie Zeichen, die allen Zeichen in der Zeile oder Spalte entsprechen.

≡ι

Schalten Sie jedes verbleibende Zeichen um.

2≧⁻²ζ

2Partituren -2.

A≦⊕ζ

APartituren 1. (Diese 4 Bytes könnten entfernt werden, wenn 1sie zur Bezeichnung verwendet würden 1, aber meiner Meinung nach ist dies ein Missbrauch des Eingabeformats.)

Tu nichts für K.

≧⁺∨Σιχζ

Andernfalls erhalten Ziffern ihren Wert und andere Buchstaben Punkte 10.

Iζ

Wandeln Sie die Summe für den impliziten Druck in einen String um.


2

J , 39 28 Bytes

[:+/@,]<.@*]+:&(1=#@~.)"1/|:

Probieren Sie es online aus!

Dank an Erik the Outgolfer und Jonathan Allen für die Idee der Eingabecodierung.

Erläuterung

Eine sehr "J" -Lösung. Ich erkläre anhand eines Beispiels ...

Nehmen wir die Eingabe:

AK3
J23

und wenden Sie diese Codierung an:

┌─┬──┬─┬─┬─┬─┬─┬─┬─┬──┬────┬────┬─┐
│A│2 │3│4│5│6│7│8│9│T │J   │Q   │K│
├─┼──┼─┼─┼─┼─┼─┼─┼─┼──┼────┼────┼─┤
│1│_2│3│4│5│6│7│8│9│10│10.1│10.2│0│
└─┴──┴─┴─┴─┴─┴─┴─┴─┴──┴────┴────┴─┘

welches produziert:

   1  0 3
10.1 _2 3

Schauen wir uns den ersten Teil der Lösung an und lassen Sie zunächst einige Details offen:

] (...)"1/ |:

Dies besagt, dass Sie die Eingabe ]und ihre Transponierung nehmen |:und eine "Multiplikationstabelle" aller Kombinationen erstellen, außer dass wir anstelle der Multiplikation das Verb in Klammern anwenden. Der Rangbezeichner "1stellt sicher, dass alle Kombinationen von Zeilen aus beiden Argumenten übernommen werden. Da die Zeilen der Transponierten jedoch die Spalten der ursprünglichen Matrix sind, bedeutet dies, dass alle Kombinationen von Zeilen und Spalten verwendet werden. Das heißt, wir machen:

  Rows                            Cols
┌─────────┐                     ┌──────┐
│1 0 3    │                     │1 10.1│
├─────────┤  "times" table      ├──────┤
│10.1 _2 3│                     │0 _2  │
└─────────┘                     ├──────┤
                                │3 3   │
                                └──────┘

which produces:

┌───────────────────────┬─────────────────────┬────────────────────┐
│┌─────┬────┬──────┐    │┌─────┬────┬────┐    │┌─────┬────┬───┐    │
││1 0 3│verb│1 10.1│    ││1 0 3│verb│0 _2│    ││1 0 3│verb│3 3│    │
│└─────┴────┴──────┘    │└─────┴────┴────┘    │└─────┴────┴───┘    │
├───────────────────────┼─────────────────────┼────────────────────┤
│┌─────────┬────┬──────┐│┌─────────┬────┬────┐│┌─────────┬────┬───┐│
││10.1 _2 3│verb│1 10.1│││10.1 _2 3│verb│0 _2│││10.1 _2 3│verb│3 3││
│└─────────┴────┴──────┘│└─────────┴────┴────┘│└─────────┴────┴───┘│
└───────────────────────┴─────────────────────┴────────────────────┘

Nun gilt das, was verbwir für jede dieser Kombinationen anwenden, +:&(1=#@~.)und dieses Verb gibt false zurück, wenn "eines der Argumente aus einem einzelnen wiederholten Element besteht" und andernfalls true. Dies geschieht ~., indem der Knoten oder die Einheit genommen wird , gefragt wird, ob seine Länge eins ist 1=#, und das Nor des Ergebnisses genommen wird +:.

Das heißt, dies gibt eine boolesche Maske mit derselben Form wie die Eingabematrix zurück, jedoch mit Nullen für jedes Element in einer Zeile oder Spalte aller gleichen Elemente.

1 1 0
1 1 0

Jetzt multiplizieren wir einfach die ursprüngliche Matrix mit dieser Maske und ergreifen das Wort ]<.@*:

1   0 0
10 _2 0

und dann das Ergebnis davon abflachen und summieren: +/@,

9

2

JavaScript (ES6),  97 95  93 Byte

Nimmt die Eingabe als Array von 2 Arrays mit 3 Zeichen auf.

a=>a.map((r,i)=>r.map((c,j)=>t-=c!=a[i^1][j]&r!=c+[,c,c]?{K:[],2:2,A:-1}[c]||-c||~9:0),t=0)|t

Probieren Sie es online aus!

Kommentiert

a =>                        // a[] = input
  a.map((r, i) =>           // for each row r[] at position i:
    r.map((c, j) =>         //   for each card c at position j in r[]:
      t -=                  //     update t:
        c != a[i ^ 1][j] &  //       if c is not equal to the sibling card in the other row
        r != c + [, c, c] ? //       and r is not made of 3 times the same card:
          { K: [],          //         add 0 point for a King (but [] is truthy)
            2: 2,           //         subtract 2 points for a Two
            A: -1           //         add 1 point for an Ace
          }[c]              //
          || -c             //         or add the face value
          || ~9             //         or add 10 points (Jack or Queen)
        :                   //       else:
          0                 //         add nothing
    ),                      //   end of inner map()
    t = 0                   //   start with t = 0
  ) | t                     // end of outer map; return t


0

PHP , 145 109 Bytes

Nachdem A23456789TJQKich die Standardcodierung für Eingaben verwendet hatte und kein gutes Ergebnis erzielt hatte, wechselte ich zu dieser Codierung, ähnlich wie bei anderen Antworten:

A |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  T |    J |    Q | K
1 | -2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10.1 | 10.2 | 0

Die Eingabe ist ein zweidimensionales Array in diesem Format : [[1,0,3],[10.1,-2,3]]. Überprüft grundsätzlich die Zeile (mitmin und max) und die Spalte für jede Karte, um nicht gleiche Werte zu enthalten, und addiert dann den Kartenwert zur Gesamtpunktzahl und druckt am Ende einen ganzzahligen Teil der Gesamtpunktzahl.

function($a){for(;$x++<2;)for($i=3;$i--;)min($r=$a[$x-1])-max($r)&&$r[$i]-$a[$x%2][$i]&&$s+=$r[$i];echo$s^0;}

Probieren Sie es online aus! (Hinweis: TIO für PHP ist momentan aufgrund eines falschen Versions-Upgrades defekt, sollte aber wieder in Ordnung sein.)


0

Python 3 , 79 Bytes

lambda d:sum([({*a}!={x}!={y})*int(x)for a,b in(d,d[::-1])for x,y in zip(a,b)])

Probieren Sie es online aus!

1,- -2,3,4,5,6,7,8,9,10,10.1,10.2,0


Python 3 , 118 Bytes

Besser lesbares Eingabeformat

lambda d:sum([({*a}!={x}!={y})*[10,10,10,1,0,-2,int(x,36)]['TJQAK2'.find(x)]for a,b in(d,d[::-1])for x,y in zip(a,b)])

Probieren Sie es online aus!


0

Kotlin , 159 Bytes

Lambda verwendet 1.3456789TJQ0 als Eingabe. Der äußere Code verwendet A23456789TJQK als Eingabe, konvertiert das Ass, die Zwei und den König, damit die Mathematik funktioniert, und zeigt die Karten und die Punktzahl an.

{d:List<String>->Int
var s=0
for(r in 0..1)for(c in 0..2)if((d[r][0]!=d[r][1]||d[r][1]!=d[r][2])&&d[0][c]!=d[1][c]){
val n=d[r][c]-'0'
s+=if(n>9)
10
else
n}
s}

Probieren Sie es online aus!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.