ポーカーカードの半分を識別する


20

カジノは、次のデッキのカードを使用します。(*カードのスーツの一つであるDSCまたはH。)

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

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

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

毎晩、古いデッキは破棄され、再利用を避けるために半分にカットされます。その結果、カジノにはカットされたカードの半分でいっぱいの大きな部屋があります。

残念ながら、経済は悪く、カジノは財政難に陥っています。お金を節約するための最も合理的なことはリサイクルのようであるため、カジノの所有者は古いカードを一緒にテープで戻すことにします。そこで彼らはチームを雇って、これを行うマシンを構築します。

あなたはチームの一員であり、あなたの仕事はカードの識別を支援することです。

カードの半分のASCIIアートイメージを文字列の形式で取得し、それがどのカードであるかの文字列を返すプログラムまたは関数を作成します。

入力は11x5の文字列に改行文字を加えたものです(CR、LF、またはCRLF、1つだけをサポートする必要があります)。必要に応じて、各入力行の末尾に末尾の空白を想定できます。入力には無効な文字(_|-HSCDスペースと改行以外)は含まれません。

カードの半分は次のようになります。

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

ハートの女王として識別されるべきです:

H12

カジノの予算は限られているため、これはコードゴルフです。最短のプログラムが勝ちます。


@Optimizerまあ、私たちは皆、カジノが社会の貧弱な弱者であることを知っています:)入力についていくつかの説明を追加しました。
-user694733

どのような入力方法が受け入れられますか?
tfitzger

2
@tfitzger無効または不可能なカードは無視できます。有効なカードのみがあると想定しています。そのため、前述の13のレイアウトのみを考慮に入れる必要があります。
user694733

2
出力には2つの間にスペースを入れることができますか?好きH 12
mbomb007

1
@DAは、カジノマネージャーが1980年代のビジネス慣行にこだわっていることを忘れていました。
corsiKa

回答:


34

CJam、16 15 13 12バイト

q2*A~<$e`3=(

ここでテストしてください。

説明

基本的な考え方は、CJamの組み込みのランレングスエンコーディングが機能するように文字列を操作することです。

例(質問からのもの)を見ていきましょう。入力文字列は

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

これを2回繰り返します。

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

そして最後の行を削除します:

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

次に、この文字列をソートします。これで、開始時に多数の改行が表示され、次にこれが表示されます(水平スクロールバーを避けるためにいくつかのスペースで短縮されます)。

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

スーツの文字はさまざまですが、常に大文字になり、ソートされた文字列の4回目の実行で検出されます(改行を考慮)。これをランレングスエンコードすると、

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

したがって、必要なのは、4番目の要素を選択して、それを逆にすることだけです。

実際のコードの内訳は次のとおりです。

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.

7

Pyth(最新バージョン)、16バイト

p/KsP*2.zJ@S{K2J

オンラインで試す:Pyth Compiler / Executor

説明:

       .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バイト

jk@.rSsP*2.z2

Pythにはrun-length-encodingが組み込まれています。しかし、短期間だけです。誰かがこれを試してみたい場合:Pythリポジトリのクローンを作成し、コミット6a6dccdをチェックアウトします。

このプログラムは、Martinの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

6

CJam、22バイト

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

ここでより多くのゴ​​ルフオプションを見てください。仕組みは次のとおりです。

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.

こちらからオンラインでお試しください


3

パイソン2、80の 68 66バイト

ここで試してみてください

入力を複製し、最後の行以外のすべての文字を見つけ(最後の行の最初の数文字は文字にすることはできません)、最初の文字とその数を出力します。

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

入力' _________\n| |\n| H H |\n| H H H |\n---H---H---'

出力H12

正規表現を使用する以前のバージョン(68):

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

ゴルフの手助けをしてくれたSp3000に感謝します。


@ Sp3000これは、そのメソッドを使用して取得できる限り短いものです。15長いです。i=input()*2;s="CDSH";r=[i[:-9].count(x)for x in s];n=sum(r);print s[r.index(n)]+`n`
mbomb007

ああ、私はスーツをより良くする方法を理解できませんでした。
mbomb007

3

APL、39バイト

これはもっと短くすることができると確信していますが、それは始まりです。

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

これにより、入力文字列を受け取り、カードのスーツと値を含む文字列を返す名前付きモナド関数が作成されます。オンラインで試すことができます

説明:

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

いつものように提案を歓迎します!



より短く、しかしより多くのバイト:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
アダム

3

J、26バイト

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

使用法:

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

コードを左から右に読む:

  • 入力から5番目の別個の文字としてスーツを取得します(4{~.)。
  • +/入力([)および最後の9文字のない入力()で文字が出現する数をカウント()し_9}.[ます。
  • 最後に、スーツ(])を結果の合計の文字列表現(":)に連結します。

3

Perl、75バイト

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

ゴルフされていないバージョン

@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

2

ジュリア、58バイト

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

これにより、入力として文字列を受け取り、カードのスーツと値を返す名前のない関数が作成されます。呼び出すには、名前を付けf=s->(...)ます。

Ungolfed +説明:

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

いつものように提案を歓迎します!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.