识别一半的扑克牌


20

赌场使用以下纸牌。(*是卡服的一个DSCH。)

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

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

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

每晚之后,旧甲板将被丢弃,并切成两半以避免重复使用。结果,赌场有一个大房间,里面满是切牌一半。

不幸的是,经济不景气,赌场陷入财务困境。节省金钱的最合理的方法似乎是回收利用,因此赌场所有者决定将旧卡重新粘在一起。因此,他们雇用了一个团队来制造一台可以做到这一点的机器。

您是团队的一员,您的工作是帮助识别卡。

编写一个程序或函数,该程序或函数以字符串形式获取一张卡片一半的ASCII艺术图像,并返回一张卡片的字符串。

输入的是11x5的字符串,加上换行符(CR,LF或CRLF,只需要支持一个)。如有必要,您可以在每个输入行的末尾假定尾随空格。输入内容将不包含任何无效字符(除了_|-HSCD空格和换行符以外的任何字符)。

半张卡片如下所示:

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

应该被确定为红心皇后:

H12

赌场的预算有限,所以这就是代码高尔夫:最短的程序获胜。


@Optimizer好吧,我们都知道赌场是社会的可怜的弱者:)我在输入中添加了一些说明。
user694733 2015年

哪些输入方法可以接受?
tfitzger'5

2
@tfitzger您可以忽略任何无效/不可能的卡。我们假设只有有效的卡。因此,您只需考虑前面提到的13种布局。
user694733 2015年

2
输出之间可以有空格吗?喜欢H 12吗?
mbomb007

1
@DA我们忘了提到他们的赌场经理一直坚持1980年代的商业惯例。
corsiKa 2015年

Answers:


34

CJam,16 15 13 12字节

q2*A~<$e`3=(

在这里测试。

说明

基本思想是操纵字符串,以便我们可以使CJam的内置游程长度编码对我们有用。

让我们来看一个示例(问题中的一个示例)。输入字符串是

 _________
|         |
|  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  |
---H---H---
 _________
|         |
|  H   H  |
|  H H H  |

然后,我们对该字符串进行排序。现在,它在开始时会有很多换行符,然后再换行(缩短一些空格以避免水平滚动条):

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

尽管西装字符会有所不同,但它始终是一个大写字母,可以在已排序字符串的第四行中找到(占换行符)。当我们进行游程编码时,我们得到

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

因此,我们要做的就是挑选第四个元素并将其反转。

这是实际代码的细分:

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编译器/执行器

说明:

       .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具有游程长度编码功能。但是只是短时间。如果有人想尝试此操作:克隆Pyth存储库并检出commit 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

Python 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)~' '}

这将创建一个命名的monadic函数,该函数接受输入字符串并返回包含卡的衣服和值的字符串。您可以在线尝试

说明:

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}.[)的输入中的字符总数进行计数()。
  • 最后,我们将suit(])连接到结果和的字符串表示形式(":)。

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->(...)

取消+说明:

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

一如既往地欢迎提出建议!


2

Bash + coreutils,73岁

sed '$q;s/.*/&&/'|fold -1|sort|uniq -c|sed -nr 's/ +(\w+) ([C-S])/\2\1/p'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.