Identifizieren Sie die Hälfte der Pokerkarten

20

Ein Casino verwendet das folgende Kartenspiel. ( *Ist eine der Karten - Anzüge D, S, Coder H.)

 _________    _________    _________    _________    _________
|         |  |         |  |         |  |         |  |         |
|         |  |         |  |    *    |  |  *   *  |  |  *   *  |
|         |  |    *    |  |         |  |         |  |         |
|    *    |  |         |  |    *    |  |         |  |    *    |
|         |  |    *    |  |         |  |         |  |         |
|         |  |         |  |    *    |  |  *   *  |  |  *   *  |
|_________|  |_________|  |_________|  |_________|  |_________|

 _________    _________    _________    _________    _________
|         |  |         |  |         |  |         |  |         |
|  *   *  |  |  *   *  |  |  *   *  |  |  *   *  |  |  *   *  |
|         |  |         |  |  *   *  |  |  *   *  |  |  *   *  |
|  *   *  |  |  * * *  |  |         |  |    *    |  |  *   *  |
|         |  |         |  |  *   *  |  |  *   *  |  |  *   *  |
|  *   *  |  |  *   *  |  |  *   *  |  |  *   *  |  |  *   *  |
|_________|  |_________|  |_________|  |_________|  |_________|

 _________    _________    _________
|         |  |         |  |         |
|  *   *  |  |  *   *  |  |  * * *  |
|  *   *  |  |  * * *  |  |  *   *  |
|  * * *  |  |  *   *  |  |  * * *  |
|  *   *  |  |  * * *  |  |  *   *  |
|  *   *  |  |  *   *  |  |  * * *  |
|_________|  |_________|  |_________|

Nach jeder Nacht werden alte Decks weggeworfen und halbiert, um eine Wiederverwendung zu vermeiden. Infolgedessen hat das Casino einen großen Raum voller geschnittener Kartenhälften.

Leider ist die Wirtschaft schlecht und das Casino steckt in finanziellen Schwierigkeiten. Das vernünftigste Mittel, um Geld zu sparen, scheint das Recycling zu sein, daher beschließen die Casinobesitzer, alte Karten wieder zusammenzubinden. Also stellen sie ein Team ein, um eine Maschine zu bauen, die dies erledigt.

Sie sind Teil des Teams, und Ihre Aufgabe ist es, die Karte zu identifizieren.

Schreiben Sie ein Programm oder eine Funktion, die ein ASCII-Art-Bild einer Kartenhälfte in Form einer Zeichenfolge erstellt und eine Zeichenfolge der jeweiligen Karte zurückgibt.

Die Eingabe ist eine 11x5-Zeichenfolge plus Zeilenumbruchzeichen (CR, LF oder CRLF, Sie müssen nur eine unterstützen). Bei Bedarf können Sie am Ende jeder Eingabezeile ein nachgestelltes Leerzeichen eingeben. Die Eingabe enthält keine ungültigen Zeichen (außer _|-HSCDLeerzeichen und Zeilenumbruch).

Eine Kartenhälfte sieht folgendermaßen aus:

 _________
|         |
|  H   H  |
|  H H H  |
---H---H---

die als die Königin der Herzen identifiziert werden sollte:

H12

Das Casino hat ein begrenztes Budget, also ist dies Codegolf: Das kürzeste Programm gewinnt.

user694733
quelle
@Optimizer Nun, wir alle wissen, dass Casinos arme Außenseiter der Gesellschaft sind :) Ich habe einige Erläuterungen zu Eingaben hinzugefügt.
user694733
Welche Eingabemethoden sind akzeptabel?
Tfitzger
2
@tfitzger Sie können alle ungültigen / unmöglichen Karten ignorieren. Wir gehen davon aus, dass es nur gültige Karten gibt. Sie müssen also nur die zuvor erwähnten 13 Layouts berücksichtigen.
user694733
2
Kann die Ausgabe ein Leerzeichen zwischen den beiden haben? Wie H 12?
mbomb007
1
@DA Wir haben vergessen zu erwähnen, dass die Casino-Manager an den Geschäftspraktiken der 1980er festhalten.
corsiKa

Antworten:

34

CJam, 16 15 13 12 Bytes

q2*A~<$e`3=(

Teste es hier.

Erläuterung

Die Grundidee ist, den String so zu manipulieren, dass die in CJam integrierte Lauflängencodierung für uns funktioniert.

Lassen Sie uns ein Beispiel durchgehen (das aus der Frage). Die Eingabezeichenfolge ist

 _________
|         |
|  H   H  |
|  H H H  |
---H---H---

Wir wiederholen das zweimal:

 _________
|         |
|  H   H  |
|  H H H  |
---H---H---
 _________
|         |
|  H   H  |
|  H H H  |
---H---H---

Und entferne die letzte Zeile:

 _________
|         |
|  H   H  |
|  H H H  |
---H---H---
 _________
|         |
|  H   H  |
|  H H H  |

Dann sortieren wir diese Zeichenfolge. Es wird jetzt eine Reihe von Zeilenumbrüchen am Anfang geben, und dann diese (um ein paar Leerzeichen gekürzt, um eine horizontale Bildlaufleiste zu vermeiden):

                                    ---------HHHHHHHHHHHH__________________||||||||||||

Während das Anzug-Zeichen variiert, wird es immer ein Großbuchstabe sein, der im vierten Durchgang der sortierten Zeichenfolge (unter Berücksichtigung der Zeilenumbrüche) zu finden ist. Wenn wir die Lauflänge codieren, erhalten wir

[8 '\n] [46 ' ] [9 '-] [12 'H] [18 '_] [12 '|]]

Also müssen wir nur das vierte Element auswählen und es umkehren.

Hier ist eine Aufschlüsselung des aktuellen Codes:

q              e# Read the input.
 2*            e# Repeat twice.
   A~<         e# Remove the last 11 characters, i.e. the last line.
      $        e# Flatten into a single string and sort its characters.
       e`      e# Run-length encode: turns the sorted string into 5 pairs of numbers
               e# and characters.
         3=    e# Select the one corresponding to the suit.
           (   e# Pull off the number so that its printed after the suit.
Martin Ender
quelle
7

Pyth (aktuelle Version), 16 Bytes

p/KsP*2.zJ@S{K2J

Probieren Sie es online aus: Pyth Compiler / Executor

Erläuterung:

       .z           read all lines from input
     *2             duplicate all lines
    P               remove the last line
   s                combine all lines to a big string
  K                 store in K

            {K      set(K), removes duplicate chars
           S        sort, this will result in the list [' ', '-', color, '_', '|']
          @   2     take the element at index 2
         J          and store it in J

p/K      J     J    print J + (count J in K)

Pyth 4.0, 13 Bytes

[email protected]*2.z2

Pyth hatte eine eingebaute Lauflängencodierung. Aber nur für kurze Zeit. Wenn jemand dies versuchen möchte: Klonen Sie das Pyth-Repo und überprüfen Sie das Commit 6a6dccd.

Dieses Programm funktioniert so ziemlich genauso wie Martins CJam-Lösung.

      sP*2.z        like in the 16 bytes solution
     S              sort
   .r               run-length-encoding
  @         2       element at index 2 
jk                  join by "" and print
Jakube
quelle
6

CJam, 22 Bytes

qN/)'--\s"_| "-_]s)\,)

Weitere Golfmöglichkeiten finden Sie hier. So funktioniert es:

qN/                       e# Read the entire input from STDIN and split it on new lines
   )'--                   e# Take out the last line and remove - from it
       \                  e# Stack contains the half HSDC now. We swap this with rest of
                          e# the input
        s                 e# join the rest of the input array to a single string
         "_| "-           e# Remove anything other than HSCD
               _]s        e# Copy this and convert everything on stack into a single
                          e# string. Now we have the total HSCD in the complete card
                  )       e# Take out the last of HSCD. This serves as first character of
                          e# the output
                   \,)    e# Swap and take length of rest of the HSCD. Increment it by 1
                          e# as we removed 1 in the previous step.

Probieren Sie es hier online aus

Optimierer
quelle
3

Python 2, 80 68 66 Bytes

Probieren Sie es hier aus

Duplizieren Sie die Eingabe, suchen Sie alle Buchstaben bis auf die letzte Zeile (die ersten Zeichen in der letzten Zeile dürfen keine Buchstaben sein) und drucken Sie dann den ersten Buchstaben und wie viele.

s=(input()*2)[:-9]
for c in"CDHS":
    if c in s:print c+`s.count(c)`

Eingang :' _________\n| |\n| H H |\n| H H H |\n---H---H---'

Ausgabe :H12

Vorherige Version, die Regex verwendet (68):

import re
r=re.findall('[C-S]',(input()*2)[:-9])
print r[0]+`len(r)`

Danke an Sp3000 für die Golfhilfe.

mbomb007
quelle
@ Sp3000 Das ist so kurz wie ich es mit dieser Methode bekommen könnte. Es ist 15 länger. i=input()*2;s="CDSH";r=[i[:-9].count(x)for x in s];n=sum(r);print s[r.index(n)]+`n`
mbomb007
Ah, ich konnte nicht herausfinden, wie ich den Anzug besser bekomme.
mbomb007
3

APL, 39 Bytes

Ich bin sicher, dass dies viel kürzer gemacht werden könnte, aber es ist ein Anfang.

f←{X←(∊⍵[⍳46]⍵)∩'HDCS'⋄((⊃X),0⍕⍴X)~' '}

Dadurch wird eine benannte monadische Funktion erstellt, die eine Eingabezeichenfolge akzeptiert und eine Zeichenfolge zurückgibt, die die Farbe und den Wert der Karte enthält. Sie können es online ausprobieren !

Erläuterung:

f ← {                         ⍝ Define the function f.
     X←                       ⍝ Assign X as
       (∊⍵[⍳46]⍵)             ⍝ the right input duplicated, no center line
                 ∩ 'HDCS'     ⍝ intersect 'HDCS'.
                              ⍝ X is now a vector like 'HHHHHH'.
     ((⊃X)                    ⍝ Return the first element of X
          ,                   ⍝ concatenated with
           0⍕⍴X)              ⍝ the length of X as a string
                ~' '          ⍝ without a space.
}

Vorschläge sind wie immer willkommen!

Alex A.
quelle
Wie wäre es (⊃,≢)'HDCS'∩⍨¯11↓,⍨?
Adám
Kürzere, aber mehr Bytes:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
Adám
3

J, 26 Bytes

(],[:":@(+/)]=[,_9}.[)4{~.

Verwendung:

   ((],[:":@(+/)]=[,_9}.[)4{~.) input
H12

Code von links nach rechts lesen:

  • Wir erhalten die Farbe aus der Eingabe als fünftes eindeutiges Zeichen ( 4{~.).
  • Count ( +/) die Anzahl der Zeichen, die insgesamt in der Eingabe ( [) vorkommen, und die Eingabe ohne die letzten 9 Zeichen (_9}.[ ).
  • Schließlich verketten wir die Farbe ( ]) mit der Stringdarstellung ( ) der resultierenden Summe ":.
randomra
quelle
3

Perl, 75 Bytes

@r=();foreach ((<>)[2,2,3,3,4]){push@r,$1 while(/([CDSH])/g)}print $r[0].@r

Ungolfed-Version

@r=(); # Collect matches in this array
foreach ((<>)               # Read stdin as a single array of lines
                            # Note that for a subroutine use @_ for (<>)
         [2,2,3,3,4]) {     # Look at the 3rd, 4th rows twice, 5th row once
    push @r, $1             # Collect individual character matches
        while (/([CDSH])/g) # As long as one of the suits matches
}
print $r[0]                 # Each element of array is matching letter
      .@r                   # Array reference in scalar context gives length
Ralph Marshall
quelle
2

Julia, 58 Bytes

s->(m=matchall(r"[A-Z]",s*s[1:46]);join([m[1],length(m)]))

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe verwendet und die Farbe und den Wert der Karte zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, zf=s->(...) .

Ungolfed + Erklärung:

function f(s)
    # Find all alphabetic characters in the input joined with itself
    # excluding the second center line, which begins at the 47th
    # character

    m = matchall(r"[A-Z]", s * s[1:46])

    # Take the first match and the number of matches as an array,
    # collapse the array into a string, and return it

    join([m[1], length(m)])
end

Vorschläge sind wie immer willkommen!

Alex A.
quelle
2

Bash + Coreutils, 73

sed '$q;s/.*/&&/'|fold -1|sort|uniq -c|sed -nr 's/ +(\w+) ([C-S])/\2\1/p'
Digitales Trauma
quelle