Zidentyfikuj połówki kart pokera

20

Kasyno korzysta z następującej talii kart. ( *To jeden z kombinezony karty D, S, Club H).

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

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

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

Po każdej nocy stare talie są odrzucane i krojone na pół, aby uniknąć ponownego użycia. W rezultacie kasyno ma duży pokój pełen ciętych połówek kart.

Niestety gospodarka jest zła, a kasyno ma kłopoty finansowe. Najbardziej rozsądną rzeczą, by zaoszczędzić pieniądze, jest recykling, więc właściciele kasyn decydują się skleić stare karty razem. Zatrudniają zespół, aby zbudował maszynę, która to zrobi.

Jesteś częścią zespołu, a Twoim zadaniem jest pomoc w identyfikacji karty.

Napisz program lub funkcję, która weźmie obraz ASCII karty w połowie w postaci łańcucha i zwróci ciąg tej karty.

Dane wejściowe to ciąg znaków 11 x 5 plus znaki podziału linii (CR, LF lub CRLF, wystarczy tylko jeden). W razie potrzeby możesz założyć końcowe białe znaki na końcu każdej linii wprowadzania. Dane wejściowe nie będą zawierały żadnych nieprawidłowych znaków (żadnych innych niż _|-HSCDspacja i podział wiersza).

Połowa karty będzie wyglądać następująco:

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

które powinny zostać określone jako Królowa Kier:

H12

Kasyno ma ograniczony budżet, więc jest to golf golfowy: wygrywa najkrótszy program.

użytkownik694733
źródło
@Optimizer Cóż, wszyscy wiemy, że kasyna są biednymi słabszymi społeczeństwami :) Dodałem trochę wyjaśnień na temat wkładu.
user694733
jakie metody wprowadzania danych są dopuszczalne?
tfitzger
2
@tfitzger Możesz zignorować wszelkie nieprawidłowe / niemożliwe karty. Zakładamy, że są tylko ważne karty. Musisz wziąć pod uwagę tylko wspomniane wcześniej 13 układów.
user694733
2
Czy na wyjściu może być spacja między nimi? Jak H 12?
mbomb007
1
@DA zapomnieliśmy wspomnieć, że menedżerowie kasyn utknęli w praktykach biznesowych z lat 80.
corsiKa

Odpowiedzi:

34

CJam, 16 15 13 12 bajtów

q2*A~<$e`3=(

Sprawdź to tutaj.

Wyjaśnienie

Podstawową ideą jest takie manipulowanie łańcuchem, abyśmy mogli sprawić, że wbudowane w CJam kodowanie długości pracy będzie dla nas działać.

Przejdźmy przez przykład (ten z pytania). Łańcuch wejściowy to

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

Powtarzamy to dwa razy:

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

I usuń ostatni wiersz:

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

Następnie sortujemy ten ciąg. Na początku będzie zawierał kilka nowych linii, a następnie to (skrócone o kilka spacji, aby uniknąć poziomego paska przewijania):

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

Podczas gdy znak koloru będzie się różnić, zawsze będzie to duża litera, znaleziona w czwartym przebiegu posortowanego łańcucha (uwzględniającego nowy wiersz). Kiedy to zakodujemy, otrzymujemy

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

Więc wszystko, co musimy zrobić, to wybrać czwarty element i odwrócić go.

Oto podział rzeczywistego kodu:

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
źródło
7

Pyth (najnowsza wersja), 16 bajtów

p/KsP*2.zJ@S{K2J

Wypróbuj online: Pyth Compiler / Executor

Wyjaśnienie:

       .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 bajtów

[email protected]*2.z2

Pyth miał wbudowane kodowanie długości przebiegu. Ale tylko przez krótki czas. Jeśli ktoś chce tego spróbować: Sklonuj repozytorium Pyth i sprawdź zatwierdzenie 6a6dccd.

Ten program działa prawie tak samo, jak rozwiązanie Martina CJam.

      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
źródło
6

CJam, 22 bajty

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

Patrząc na więcej opcji golfa tutaj. Oto jak to działa:

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.

Wypróbuj online tutaj

Optymalizator
źródło
3

Python 2, 80 68 66 bajtów

Wypróbuj tutaj

Zduplikuj dane wejściowe, znajdź wszystkie litery we wszystkich oprócz ostatniego wiersza (pierwsza para znaków w ostatnim wierszu nie może być literami), a następnie wydrukuj pierwszą literę i liczbę.

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

Wejście :' _________\n| |\n| H H |\n| H H H |\n---H---H---'

Wyjście :H12

Poprzednia wersja korzystająca z wyrażenia regularnego (68):

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

Dzięki Sp3000 za pomoc w golfie.

mbomb007
źródło
@ Sp3000 To jest tak krótkie, jak tylko mogłem uzyskać za pomocą tej metody. Jest 15 dłużej. i=input()*2;s="CDSH";r=[i[:-9].count(x)for x in s];n=sum(r);print s[r.index(n)]+`n`
mbomb007
Ach, nie mogłem wymyślić, jak uzyskać lepszy garnitur.
mbomb007
3

APL, 39 bajtów

Jestem pewien, że można to znacznie skrócić, ale to dopiero początek.

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

Tworzy to nazwaną funkcję monadyczną, która akceptuje ciąg wejściowy i zwraca ciąg zawierający kolor i wartość karty. Możesz spróbować online !

Wyjaśnienie:

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

Sugestie są jak zawsze mile widziane!

Alex A.
źródło
Krótsze, ale więcej bajtów:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
Adám
3

J, 26 bajtów

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

Stosowanie:

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

Czytanie kodu od lewej do prawej:

  • Uzyskujemy kolor z danych wejściowych jako 5. odrębny znak w nim ( 4{~.).
  • Count ( +/) liczba, jaką ten znak występuje łącznie w input ( [) i wejściu bez ostatnich 9 znaków ( _9}.[).
  • Na koniec łączymy suit ( ]) z reprezentacją ciągu wynikowej sumy ( ":).
randomra
źródło
3

Perl, 75 bajtów

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

Wersja bez golfa

@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
źródło
2

Julia, 58 bajtów

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

Tworzy to nienazwaną funkcję, która pobiera ciąg znaków jako dane wejściowe i zwraca kolor karty oraz jej wartość. Aby to nazwać, nadaj mu nazwę, np f=s->(...).

Niegolfowane + wyjaśnienie:

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

Sugestie są jak zawsze mile widziane!

Alex A.
źródło
2

Bash + coreutils, 73

sed '$q;s/.*/&&/'|fold -1|sort|uniq -c|sed -nr 's/ +(\w+) ([C-S])/\2\1/p'
Cyfrowa trauma
źródło