Poker kartlarının yarısını belirleme


20

Bir kumarhane aşağıdaki kart destesini kullanır. ( *Kart takım elbise biri D, S, Cya da H.)

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

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

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

Her geceden sonra eski güverteler atılır ve yeniden kullanılmasını önlemek için ikiye bölünür. Sonuç olarak, kumarhanede kesilmiş kart yarımlarıyla dolu büyük bir oda var.

Ne yazık ki ekonomi kötü ve kumarhane mali sıkıntı yaşıyor. Para biriktirmek için en makul şey geri dönüşüm gibi görünüyor, bu yüzden casino sahipleri eski kartları tekrar birleştirmeye karar veriyor. Bu yüzden bunu yapacak bir makine yapmak için bir ekip kiralıyorlar.

Ekibin bir parçasısınız ve işiniz kartı tanımlamaya yardımcı olmaktır.

Bir kartın yarısını ASCII sanat görüntüsünü dize biçiminde alacak ve kartın bir dizesini döndürecek bir program veya işlev yazın.

Girdi 11x5 dize artı satır sonu karakteridir (CR, LF veya CRLF, yalnızca birini desteklemeniz gerekir). Gerekirse, her bir giriş satırının sonunda sondaki boşluk olduğunu varsayabilirsiniz. Girdi geçersiz karakterler ( _|-HSCDboşluk ve satır sonu dışında herhangi bir karakter) içermeyecek .

Kartın yarısı şu şekilde görünecektir:

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

Kalplerin Kraliçesi olarak tanımlanması gereken:

H12

Casino sınırlı bir bütçedir, bu yüzden bu kod golf: en kısa program kazanır.


@Optimizer Hepimiz biliyoruz ki casinolar toplumun fakir köpekleri :) Girdi üzerine biraz açıklama ekledim.
user694733

hangi girdi yöntemleri kabul edilebilir?
tfitzger

2
@tfitzger Geçersiz / imkansız kartları göz ardı edebilirsiniz. Yalnızca geçerli kartlar olduğunu varsayıyoruz. Bu nedenle, yalnızca daha önce belirtilen 13 düzeni dikkate almanız gerekir.
user694733

2
Çıktının ikisi arasında bir boşluk olabilir mi? Gibi H 12mi?
mbomb007

1
@DA casino yöneticilerinin 1980'lerin iş uygulamalarına takılı kaldıklarını söylemeyi unuttuk.
corsiKa

Yanıtlar:


34

CJam, 16 15 13 12 bayt

q2*A~<$e`3=(

Burada test edin.

açıklama

Temel fikir, dizeyi, CJam'ın yerleşik çalışma uzunluğu kodlamasını bizim için çalıştırabilecek şekilde manipüle etmektir.

Bir örnek üzerinden geçelim (sorudan olanı). Giriş dizesi

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

Bunu iki kez tekrarlıyoruz:

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

Ve son satırı kaldırın:

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

Sonra bu dizeyi sıralarız. Artık başlangıçta bir sürü yeni satır olacak ve ardından bu (yatay bir kaydırma çubuğundan kaçınmak için birkaç boşlukla kısaltılacak):

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

Takım elbise karakteri değişecek olsa da, her zaman sıralanan dizenin dördüncü çalışmasında bulunan (yeni satırı hesaba katarak) bir büyük harf olacaktır. Bu uzunlukta kodladığımızda bunu elde ederiz

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

Tek yapmamız gereken dördüncü elementi seçmek ve tersine çevirmek.

Gerçek kodun dökümü:

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 (son sürüm), 16 bayt

p/KsP*2.zJ@S{K2J

Çevrimiçi deneyin: Pyth Derleyici / Yönetici

Açıklama:

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

jk@.rSsP*2.z2

Pyth, çalışma uzunluğu kodlamasında bir yapıya sahipti. Ama sadece kısa bir süre için. Birisi bunu denemek isterse: Pyth repo'yu klonlayın ve taahhüt 6a6dccd'yi kontrol edin.

Bu program Martin CJam çözümü ile hemen hemen aynı şekilde çalışır.

      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 bayt

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

Burada daha fazla golf seçeneğine bakmak. Nasıl çalışır:

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.

Buradan çevrimiçi deneyin


3

Python 2, 80 68 66 bayt

Burada deneyin

Girişi çoğaltın, son satır dışındaki tüm harfleri bulun (son satırdaki ilk çift karakterleri harf olamaz), sonra ilk harfi ve kaç tanesini yazdırın.

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

Giriş :' _________\n| |\n| H H |\n| H H H |\n---H---H---'

Çıktı :H12

Normal ifade (68) kullanan önceki sürüm:

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

Golf yardımı için Sp3000'e teşekkürler.


@ Sp3000 Bu yöntemi kullanarak alabildiğim kadar kısa. 15 daha uzun. 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, elbiseyi nasıl daha iyi hale getireceğimi bilemedim.
mbomb007

3

APL, 39 bayt

Eminim bu çok daha kısa yapılabilir, ama bu bir başlangıç.

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

Bu, bir giriş dizesini kabul eden ve kartın türünü ve değerini içeren bir dize döndüren adlandırılmış bir monadic işlevi oluşturur. Şunları yapabilirsiniz çevrimiçi denemek !

Açıklama:

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

Öneriler her zaman olduğu gibi bekliyoruz!



Daha kısa, ancak daha fazla bayt:5⌷{⍺,≢⍵}⌸¯11↓,⍨⍞
Adám

3

J, 26 bayt

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

Kullanımı:

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

Kodu soldan sağa okuma:

  • Elbiseyi girdiden 5. farklı karakter ( 4{~.) olarak alıyoruz .
  • (Sayısı +/) karakter girişi toplam oluşur numarası ( [son 9 karakter olmaksızın) ve giriş ( _9}.[).
  • Son olarak, suit ( ]) 'i sonuçtaki toplamın dize temsiline ( ":) birleştiririz.

3

Perl, 75 bayt

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

Ungolfed sürümü

@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

Julia, 58 bayt

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

Bu, dizeyi girdi olarak alan ve kartın türünü ve değerini döndüren adsız bir işlev oluşturur. Bunu aramak için bir ad verin, örn f=s->(...).

Ungolfed + açıklaması:

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

Öneriler her zaman olduğu gibi bekliyoruz!


2

Bash + coreutils, 73

sed '$q;s/.*/&&/'|fold -1|sort|uniq -c|sed -nr 's/ +(\w+) ([C-S])/\2\1/p'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.