Визначте половинки покерних карт


20

Казино використовує наступну колоду карт. ( *Це одна з мастей карт D, S, Cабо H.)

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

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

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

Після кожної ночі старі колоди відкидають і розрізають навпіл, щоб уникнути повторного використання. Як результат, у казино є велика кімната, повна розрізаних половинок карт.

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

Ви є частиною команди, і ваше завдання - допомогти визначити карту.

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

Введення - це рядок розміром 11x5, плюс символи розриву рядків (CR, LF або CRLF, вам потрібно підтримувати лише один). Ви можете припустити пробіли пробілів в кінці кожного рядка введення, якщо необхідно. Вхід не міститиме жодних недійсних символів (окрім, _|-HSCDа також пробілу та розриву рядків).

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

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

яку слід визначити Королевою сердець:

H12

Казино має обмежений бюджет, тому це кодовий гольф: виграє найкоротша програма.


@Optimizer Ну, ми всі знаємо, що казино є поганими недоїдками суспільства :) Я додав роз'яснення щодо інформації.
user694733

які способи введення прийнятні?
tfitzger

2
@tfitzger Ви можете ігнорувати будь-які недійсні / неможливі карти. Ми припускаємо, що існують лише дійсні картки. Тож вам слід врахувати лише згадані раніше 13 макетів.
користувач694733

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

Пояснення:

       .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 repo та оформити комісію 6a6dccd.

Ця програма працює майже так само, як рішення 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)~' '}

Це створює іменовану монадичну функцію, яка приймає рядок введення і повертає рядок, що містить костюм і значення картки. Ви можете спробувати онлайн !

Пояснення:

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↓,⍨⍞
Adám

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

Недоліки + пояснення:

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

Пропозиції вітаються як завжди!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.