Identifikasi belahan kartu Poker

20

Kasino menggunakan setumpuk kartu berikut. ( *Adalah salah satu pakaian kartu D, S, Catau H.)

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

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

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

Setelah setiap malam, deck lama dibuang, dan dipotong menjadi dua untuk menghindari penggunaan kembali. Akibatnya, kasino memiliki ruang besar yang penuh dengan potongan kartu.

Sayangnya ekonomi buruk, dan kasino dalam kesulitan keuangan. Hal paling masuk akal untuk menghemat uang tampaknya adalah daur ulang, sehingga pemilik kasino memutuskan untuk merekatkan kembali kartu lama. Jadi mereka menyewa tim untuk membangun mesin yang akan melakukan ini.

Anda adalah bagian dari tim, dan tugas Anda adalah membantu mengidentifikasi kartu.

Tulis program atau fungsi yang akan mengambil gambar seni ASCII dari setengah kartu dalam bentuk string, dan akan mengembalikan string dari kartu apa itu.

Input adalah string 11x5, plus karakter pemisah baris (CR, LF atau CRLF, Anda hanya perlu mendukungnya). Anda dapat mengasumsikan spasi spasi di akhir setiap baris input, jika perlu. Input tidak akan berisi karakter yang tidak valid (selain dari _|-HSCDspasi dan pemisah baris).

Setengah kartu akan terlihat seperti ini:

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

yang harus diidentifikasi sebagai Ratu Hati:

H12

Kasino ini memiliki anggaran terbatas, jadi ini kode golf: program terpendek yang menang.

user694733
sumber
@Optimizer Yah, kita semua tahu kasino adalah underdog masyarakat yang buruk :) Saya menambahkan beberapa klarifikasi tentang input.
user694733
metode input apa yang dapat diterima?
tfitzger
2
@ tfitzger Anda dapat mengabaikan kartu yang tidak valid / tidak mungkin. Kami berasumsi bahwa hanya ada kartu yang valid. Jadi, Anda hanya perlu mempertimbangkan 13 tata letak yang disebutkan sebelumnya untuk dipertimbangkan.
user694733
2
Bisakah output memiliki ruang di antara keduanya? Suka H 12?
mbomb007
1
@DA kita lupa menyebutkan bahwa manajer kasino terjebak dengan praktik bisnis tahun 1980-an.
corsiKa

Jawaban:

34

CJam, 16 15 13 12 byte

q2*A~<$e`3=(

Uji di sini.

Penjelasan

Ide dasarnya adalah memanipulasi string sedemikian rupa sehingga kita dapat membuat enkode run-length run-in CJam bekerja untuk kita.

Mari kita lihat sebuah contoh (contoh dari pertanyaan). String input adalah

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

Kami ulangi itu dua kali:

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

Dan hapus baris terakhir:

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

Lalu kita urutkan string ini. Sekarang akan ada banyak baris baru di awal, dan kemudian ini (disingkat oleh beberapa ruang untuk menghindari scrollbar horizontal):

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

Meskipun karakter suit akan bervariasi, itu akan selalu menjadi huruf besar, ditemukan di run keempat dari string yang diurutkan (akuntansi untuk baris baru). Ketika kita menjalankan-panjang encode ini kita dapatkan

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

Jadi yang perlu kita lakukan adalah memilih elemen keempat dan membalikkannya.

Berikut ini adalah rincian kode aktual:

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

Pyth (versi terbaru), 16 byte

p/KsP*2.zJ@S{K2J

Cobalah secara online: Pyth Compiler / Executor

Penjelasan:

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

[email protected]*2.z2

Pyth memiliki build dalam run-length-encoding. Tetapi hanya untuk waktu yang singkat. Jika seseorang ingin mencoba ini: Klon repo Pyth dan checkout komit 6a6dccd.

Program ini bekerja hampir sama dengan solusi CJam Martin.

      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
sumber
6

CJam, 22 byte

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

Melihat lebih banyak opsi golf di sini. Inilah cara kerjanya:

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.

Cobalah online di sini

Pengoptimal
sumber
3

Python 2, 80 68 66 byte

Coba di sini

Gandakan input, temukan semua huruf di semua kecuali baris terakhir (pasangan pertama di baris terakhir tidak boleh huruf), lalu cetak huruf pertama dan berapa banyak.

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

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

Keluaran :H12

Versi sebelumnya yang menggunakan regex (68):

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

Terima kasih kepada Sp3000 untuk bantuan golf.

mbomb007
sumber
@ Sp3000 Ini sesingkat saya bisa mendapatkannya menggunakan metode itu. 15 lagi. 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, aku tidak tahu bagaimana cara mendapatkan jas itu lebih baik.
mbomb007
3

APL, 39 byte

Saya yakin ini bisa dibuat lebih pendek, tapi ini awal.

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

Ini menciptakan fungsi bernama monadik yang menerima string input dan mengembalikan string yang berisi nilai dan kartu yang sesuai. Anda dapat mencobanya secara online !

Penjelasan:

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

Saran diterima seperti biasa!

Alex A.
sumber
Bagaimana dengan (⊃,≢)'HDCS'∩⍨¯11↓,⍨?
Adám
Lebih pendek, tetapi lebih banyak byte:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
Adám
3

J, 26 byte

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

Pemakaian:

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

Membaca kode dari kiri ke kanan:

  • Kami mendapatkan setelan dari input sebagai karakter berbeda ke-5 di dalamnya ( 4{~.).
  • Hitung ( +/) jumlah karakter yang terjadi total dalam input ( [) dan input tanpa 9 karakter terakhir ( _9}.[).
  • Akhirnya kami menggabungkan setelan ( ]) ke representasi string jumlah yang dihasilkan ( ":).
randomra
sumber
3

Perl, 75 byte

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

Versi tidak disatukan

@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
sumber
2

Julia, 58 byte

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

Ini menciptakan fungsi tanpa nama yang mengambil string sebagai input dan mengembalikan setelan dan nilai kartu. Untuk menyebutnya, berikan nama, mis f=s->(...).

Penjelasan + tidak dikumpulkan:

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

Saran diterima seperti biasa!

Alex A.
sumber
2

Bash + coreutils, 73

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