Определить половинки покерных карт

20

Казино использует следующую колоду карт. ( *является одним из карточных мастей D,S , Cили H.)

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

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

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

После каждой ночи старые колоды сбрасывают и режут пополам, чтобы избежать повторного использования. В результате в казино есть большая комната, полная разрезанных половинок карт.

К сожалению, экономика плохая, а у казино финансовые проблемы. Кажется, что наиболее разумным способом сэкономить деньги является утилизация, поэтому владельцы казино решили склеить старые карты вместе. Поэтому они нанимают команду для создания машины, которая сделает это.

Вы являетесь частью команды, и ваша задача - помочь в идентификации карты.

Напишите программу или функцию, которая возьмет художественное изображение ASCII половины карты в форме строки и вернет строку с той картой, в которой она находится.

Ввод - строка 11x5, плюс символы разрыва строки (CR, LF или CRLF, вам нужна только одна). При необходимости вы можете использовать конечные пробелы в конце каждой строки ввода. На входе не будет никаких недопустимых символов (кроме_|-HSCD пробелов и переносов строк).

Половина карты будет выглядеть так:

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

которая должна быть идентифицирована как Королева Червей:

H12

Казино имеет ограниченный бюджет, так что это код гольф: выигрывает самая короткая программа.

user694733
источник
@Optimizer Что ж, мы все знаем, что казино - это слабые игроки общества :) Я добавил некоторые пояснения по поводу вклада.
user694733
какие методы ввода приемлемы?
tfitzger
2
@tfitzger Вы можете игнорировать любые недействительные / невозможные карты. Мы предполагаем, что есть только действительные карты. Таким образом, вам нужно принять к сведению только 13 упомянутых ранее макетов.
user694733
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---

Мы повторяем это дважды:

 _________
|         |
|  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 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 и оформите коммит 6a6dccd.

Эта программа работает почти так же, как и решение Martin's 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
источник
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 за помощь в гольфе.

mbomb007
источник
@ 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.
}

Предложения приветствуются как всегда!

Алекс А.
источник
Как насчет (⊃,≢)'HDCS'∩⍨¯11↓,⍨?
Адам
Короче, но больше байтов:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
Адам
3

J, 26 байт

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

Использование:

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

Чтение кода слева направо:

  • Мы получаем костюм из ввода как 5-й отдельный символ в нем ( 4{~.).
  • Count ( +/) число, которое встречается в общем количестве символов на входе ( [) и на входе без последних 9 символов ( _9}.[).
  • Наконец, мы объединяем suit ( ]) со строковым представлением результирующей суммы ( ":).
randomra
источник
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

Предложения приветствуются как всегда!

Алекс А.
источник
2

Bash + coreutils, 73

sed '$q;s/.*/&&/'|fold -1|sort|uniq -c|sed -nr 's/ +(\w+) ([C-S])/\2\1/p'
Цифровая травма
источник