Satıcının güverteyi yeniden inşa etmesine yardımcı olun


19

Krupiye destesinde hangi kartların bulunduğu ve hangi kartların eksik olduğu konusunda özensiz ve kaybolmuş, ona yardımcı olabilir misiniz?


Komple güverte 52 oyun kartından oluşur, yani:

Destedeki her renk (kalpler, elmaslar, maçalar, kulüpler) şunları içerir:

  • Sayılar [2 - 10]
  • Bir Jack
  • Kraliçe
  • Bir Kral
  • Bir as

Görev

Programınız, yeni satır okunana kadar STDIN'den deste içeriğini okuyacaktır. Girişin "nX nX nX nX" vb. Şeklinde olacağını varsayabilirsiniz: burada:

  • n - [2 - 10] veya 'J', 'Q', 'K' veya 'A' arasındaki herhangi bir sayı . (Büyük harfleri yalnızca sayısal olmayan karakterler için kabul edebilirsiniz)
  • X - aşağıdakilerden herhangi biri: 'H', 'D', 'S', 'C' (Yalnızca büyük harf kabul edebilirsiniz)

Nerede:

  • 'J' = Krikolar
  • 'Q' = Kraliçe
  • 'K' = Kral
  • 'A' = As

Ve

  • 'H' = Kalpler
  • 'D' = Elmaslar
  • 'S' = Maça
  • 'C' = Kulüpler

Girişte kopya olmayacağını varsayabilirsiniz.

Daha sonra programınız destedeki eksik kartları giriş ("nX nX nX") ile aynı şekilde STDOUT'a yazdırmalı veya 52 kartın tümü verildiyse 'Eksik kart yok' yazmalıdır. Kartların çıktı sıralamasında herhangi bir kısıtlama yoktur.

Örnek girdi:

9H AH 7C 3S 10S KD JS 9C 2H 8H 8C AC AS AD 7D 4D 2C JD 6S

Çıktı:

3H 4H 5H 6H 7H 10H JH QH KH 2D 3D 5D 6D 8D 9D 10D QD 2S 4S 5S 7S 8S 9S QS KS 3C 4C 5C 6C 10C JC QC HC

Mutlu golf!


3
TBunun yerine kullanabilir miyiz 10?
Arnauld

@Arnauld, satıcının bana verdiği tüm bilgilerden korkuyorum, bu yüzden '10' ile uğraşmak zorunda kalacaksınız yoksa huysuz olacak.
Sombrero Tavuk

@GillBates Yine de Jtemsil etmiyor mu 10?
Okx

@Okx 2 3 4 5 6 7 8 9 10 J Q K A. Jtemsil eder 11.
HyperNeutrino

@Okx J, alfabenin 10. harfidir, ancak bununla ilgili değildir. :)
mbomb007

Yanıtlar:


8

Windows Toplu İş (CMD), 205 204 bayt

@set/pc=
@set d=
@for %%s in (H D S C)do @for %%r in (2 3 4 5 6 7 8 9 10 J Q K A)do @call set d=%%d%% %%r%%s
@for %%c in (%c%)do @call set d=%%d: %%c=%%
@if "%d%"=="" set d= No missing cards
@echo%d%

Takım elbise üzerinde döngüler ve tam bir güverte inşa rütbe, daha sonra giriş kartlarını siler. Tİzin veriliyorsa 1 bayt kaydet 10. Komut satırı bağımsız değişkenleri kabul edilebilir girdiyse 11 bayt kaydedin. Düzenleme: @ user202729 sayesinde 1 bayt kaydedildi.


200 bayt sayıyorum.
HyperNeutrino

@HyperNeutrino Windows'dayken, dosyayı kaydetmek için Not Defteri'ni kullanıyorum, bu da yeni satırların bana bir yerine 2 bayta mal olduğu anlamına geliyor. Bayt kaydetmek için farklı bir düzenleyici kullanmak için çok tembelim.
Neil

Oh lol tamam. Sublime Text kullanarak 200 bayt alıyorum.
HyperNeutrino

@Neil Windows'ta CR LF yerine LF kullanabilirsiniz, 5 bayt kaydeder (yukarıdaki HyperNeutrino yorumu) ve yine de çalışır.
user202729

Ayrıca, for döngüsünde ortadan kaldırmak /viçin CMD'ye (+3 bayt?) Geçebilirsiniz . / Eğer arasında ek bir alan olduğunu görünüyor ve ? EnableDelayedExpansioncall(%c%)do
user202729

8

Python, 147 146 145 138 131 129 127 125 120 bayt

print(' '.join(set(`x`+y for x in range(2,11)+list('JQKA')for y in'HDSC')-set(raw_input().split()))or'No missing cards')

Tüm olası kartları set olarak alır ve giriş kartlarını çıkartır.

Kodumda fazladan bir boşluk gösteren mbomb007 sayesinde -1 bayt.
-1 Python 2 ile yapılabilir bir golf işaret için mbomb007 (-5 bayt ve + 4 bayt bayt sayesinde raw_de raw_input)
-7 setleri yerine Liste tanımlama grubu çıkarma kullanılarak geçerek bayt
-7 ValueInk sayesinde bayt listSuitlerin
-2 bayt'a ihtiyacım olmadığını belirtmek için Datastream sayesinde sadece tüm değerleri yazmanın, daha önce yaptığım garip şeyden daha fazla byte etkili olduğunu
belirtmek için ValueInk sayesinde Bu setler jeneratör alabilir, bu yüzden bir liste kavrayışına koymak zorunda değilim
Datastream sayesinde -2 bayt, Python 3'e tekrar geçersem daha da golf yapabileceğime işaret ettiği için ... (baskıdan sonra parens için +2, -4 için raw_)
Lulhum ve işaretleme için kendim -5 bayt Python 2'ye (!!!) geri dönerek baytları kaydetmeme yardımcı olabilir (aralığı tekrar kullanmak, yerine ters tırnaklar kullanmak str(ve +4 nedeniyle raw_)


1
Çıkarabileceğiniz fazladan bir alanınız var ve Python 2 `d`yerine str(d)parenleri kaldırmanın yanı sıra kullanabilirsiniz print.
mbomb007

@ mbomb007 Teşekkürler!
HyperNeutrino

for y in 'HDSC'oradaki tüm karakterleri almak için de çalışır. (Yine list('JQKA')de diğer kısım için hala ihtiyacın var .)
Değer Mürekkebi

1
'1 2 3 4 5 6 7 8 9 10 J Q K A'.split()Devam eden [d for d in range(2,11)]+list('JQKA')manipülasyonu yerine birkaç bayt kaydedebilir .
Veri Akışı

Anlaşılan, 1eklenmesi gerekmediği gerçeği nedeniyle 2 bayt tasarruf edecek gibi görünüyor . Ayrıca, ilk liste kavrama için dış köşeli parantezleri kaldırabilirsiniz çünkü setkurucu jeneratör nesnelerini gayet iyi alır.
Değer Mürekkebi

7

05AB1E , 39 bayt

ðIð¡YTŸ"JQKA"S«"CDHS"SâJsKðýDg>i“Noœ¶‡¶

Çevrimiçi deneyin!

açıklama

ðI                                       # push space and input
  ð¡                                     # split on spaces
    YTŸ                                  # push the range [2 ... 10]
       "JQKA"S«                          # append ['J','Q','K','A']
               "CDHS"Sâ                  # cartesian product with suits
                       J                 # join each card with its suit
                        sK               # remove any cards in input from the list of all cards
                          ðýDg>i         # if the length of the resulting list is 0
                                “Noœ¶‡¶  # push the string "No missing cards"
                                         # output top of stack

5

CJam , 49 47 bayt

B,2>"JQKA"+"HDSC"m*:slS/-S*"No missing cards"e|

Çevrimiçi deneyin!

açıklama

B,                    e# The range from 0 to 10
2>                    e# Slice after the first two elements, giving the range from 2 to 10
"JQKA"+               e# Concatenate with "JQKA", giving the array containing all ranks
"HDSC"                e# The string containing all suits
m*                    e# Take the Cartesian product
:s                    e# And cast each pair to a string. Now a full deck has been constructed
l                     e# Read a line of input
S/                    e# Split it on spaces
-                     e# Remove all cards from the deck that were in the input
S*                    e# Join the result with spaces
"No missing cards"    e# Push the string "No missing cards"
e|                    e# Take the logical OR of the result and the string, returning the
                      e#   first truthy value between the two. (empty arrays are falsy)

5

Jöle , 39 bayt

9R‘Ṿ€;“JQKA”p“CDHS”F€œ-ɠḲ¤Kȯ“¡¢ıḍĖ9ṭƥw»

Çevrimiçi deneyin!

Nasıl?

9R‘Ṿ€;“JQKA”p“CDHS”F€œ-ɠḲ¤Kȯ“¡¢ıḍĖ9ṭƥw» - Main link: no arguments
9R                                      - range(1,9)    [1,2,3,4,5,6,7,8,9]
  ‘                                     - increment     [2,3,4,5,6,7,8,9,10]
   Ṿ€                                   - uneval each  [['2'],['3'],['4'],['5'],['6'],['7'],['8'],['9'],['10']]
     ;“JQKA”                            - concatenate with char-list "JQKA" [['2'],['3'],['4'],['5'],['6'],['7'],['8'],['9'],['10'],['J'],['Q'],['K'],['A']]
            p“CDHS”                     - Cartesian product with char-list "CDHS" [[['2'],['C']],[['2'],['D']],...]
                   F€                   - flatten each [['2','C'],['2','S'],...]
                         ¤              - nilad followed by link(s) as a nilad
                       ɠ                -     read a line from STDIN
                        Ḳ               -     split on spaces
                     œ-                 - multi-set difference
                          K             - join with spaces
                            “¡¢ıḍĖ9ṭƥw» - compressed string "No missing cards"
                           ȯ            - logical or
                                        - implicit print

5

C #, 343 bayt

İlk kez benim golf biri değil, çok iyi bir yarışmacı gönderme. Eminim bunu daha fazla azaltabilirim.

Bunun arkasındaki fikir, kartların oluşumlarını saklayan seyrek bir dizi, farklı değerlerin ASCII değerleri ile hesaplanan indeksler ve birbirleriyle çarpılan takımlar (örneğin, bir maça ası (AS) indekste (65 *) alanda depolanacaktı. 83 = 5395)). Bu şekilde, her kart türü daha sonra "harita" dizisinde varlığını kontrol etmek için benzersiz bir dizin alır.

void M(string[]a){var c=new int[]
{50,51,52,53,54,55,56,57,49,74,81,75,65,72,68,83,67};var e=new 
int[9999];int i=0;int j=0;foreach(var s in a) e[s[0]*s[s.Length-
1]]++;int f=0;for(i=0;i<13;i++)for(j=13;j<17;j++)if(e[c[i]*c[j]]==0)
{f=1;Console.Write(((i<9)?(i+2)+"":(char)c[i]+"")+(char)c[j]+" 
");}if(f==0) Console.WriteLine("No missing cards");}

4

PowerShell , 114 111 110 bayt

param($n)('No missing cards',($a=(2..10+'JQKA'[0..3]|%{$i=$_;"CSHD"[0..3]|%{"$i$_"}}|?{$n-notmatch$_})))[!!$a]

Çevrimiçi deneyin!

Girdiyi $nboşlukla ayrılmış veya satırsonu ile ayrılmış bir dize olarak alır. Aralığından bir dizi oluşturur 2..10ile birleştirilmiş JQKA(dizinlenmiş [0..3]bir hale getirmek için chardizi). Bu dizi, |%{}yardımcıyı ayarlayan bir döngüye beslenir $ive sonuçları birlikte birleştirmek için takım elbise üzerinde döngüler oluşturur $i$_. Bu döngünün sonunda, gibi bir dizi dizimiz var ("2C", "2S", "2H", ... "AH", "AD"). Bu dizi, bir beslenir Where-Object( |?{}unsurları olarak filtreli) $_regex -notmatchgirişi $n. Bu filtrelemenin sonucu depolanır $a.

Sonra, bir sözde ve üçlü kullanmak ( , )[]seçmek isteyip biz çıkış 'No missing cards'veya $aolmamasına bağlı olarak, !!$abir Boolean dönüşlerde $falseveya $true. Eğer $aboş (Destedekibütün girişindeyken anlamına gelir), daha sonra !!$aise 0, böylece "No missing cards"seçilir. Bunun tam tersi $aseçildi. Her iki durumda da, boru hattında kalır ve çıktı örtüktür.


4

Bash + coreutils, 89

sort|comm -3 <(printf %s\\n {10,{2..9},A,J,K,Q}{C,D,H,S}) -|grep .||echo No missing cards

Yeni satırla sınırlandırılmış liste olarak G / Ç.

açıklama

  • sort STDIN'den satırsonu sınırlandırılmış girdiyi okur ve sıralar
  • Bu, comm
  • printf %s\\n {10,{2..9},A,J,K,Q}{C,D,H,S}tüm kart destesini oluşturmak için bir destek genişletmesidir. printfKendi satırına her kart yazdırır. Sipariş, çıktının boruya geçirildiği gibi olacak şekilde verilirsort
  • commtüm desteyi sıralı girişle karşılaştırır ve farkı çıktılar. -33. sütunun çıktısını bastırır (yaygın olanları)
  • commKaynağından gelen tüm çıktı alınır grep .. Hiçbir çıktı commalınmadıysa (yani tüm kartlar girdi içindeyse), ||"veya" yan tümcesi gerekli iletiyi verir. Aksi takdirde, grep .tüm satırların çıkışları eşleşir comm.

Çevrimiçi deneyin .


4

Python 2 , 104,93,130 , 114 bayt

r=input()
print' '.join(n+x for n in list('23456789JQKA')+['10']for x in'HDSC'if n+x not in r)or'No missing cards'

Çevrimiçi deneyin!

  • Aralığı kullanmak yerine listeyi kodlayan -10 bayt!
  • +37 bayt - cevapsız yazdırma Girişte tüm kartlar varsa 'Eksik kart yok'!
  • -16 bayt kod listesi kavrama değiştirerek!

1
"Eksik kart yok"
yazdırmıyor

1
@ L3viathan bunu gösterdiğin için teşekkürler. Cevabımı düzenledim!
Keerthana Prabhakaran

list('23456789JQKA')+['10']Zeki. Beynimi 10diğer python cevabındaki tek karakter listesinden ayırmanın daha iyi bir yolu için sarıyordum, ama güzel çalışıyor.
Veri Akışı

2

Yakut, 108 + 1 = 109 bayt

-pBayrağı kullanır .

a=[*?2..'10',?J,?Q,?K,?A].map{|i|%w"H D S C".map{|c|i+c}}.flatten-$_.split;$_=a==[]?"No missing cards":a*' '

2

PHP, 143 Bayt

foreach([H,D,S,C]as$c)foreach([2,3,4,5,6,7,8,9,10,J,Q,K,A]as$v)$r[]=$v.$c;echo join(" ",array_diff($r,explode(" ",$argn)))?:"No missing cards";

2

sed , 157 + 1 ( -rBayrak) = 170 158 bayt

x
s/$/;A2345678910JQK/
s/.+/&H&D&S&C;No missing cards/
:
s/(10|\w)(\w+)(.);/\1\3 \2\3;/
t
G
:s
s/(10.|[^ ;1]{2})(.*\n.*)\1/\2/
ts
s/[ ;]+/ /g
s/^ //
s/ N.+//

Çevrimiçi deneyin!

Bu, olası tüm kartları oluşturur ve daha sonra girişteki her kartı oluşturulan kartlardan kaldırır.


"Eksik kart yok"
yazdırmıyor

@ L3viathan Sabit
Kritixi Lithos

2

C # , 282 bayt


golfed

i=>{var o=new System.Collections.Generic.List<string>();string[] S={"H","D","S","C"},N="A 2 3 4 5 6 7 8 9 10 J Q K".Split(' ');foreach(var s in S){foreach(var n in N){if(!System.Linq.Enumerable.Contains(i,n+s)){o.Add(n+s);}}}return o.Count>0?string.Join(" ",o):"No missing cards";};

Ungolfed

i => {
    var o = new System.Collections.Generic.List<string>();
    string[] S = { "H", "D", "S", "C" }, N = "A 2 3 4 5 6 7 8 9 10 J Q K".Split(' ');

    foreach( var s in S ) {
        foreach( var n in N ) {
            if( !System.Linq.Enumerable.Contains( i, n + s ) ) {
                o.Add( n + s );
            }
        }
    }

    return o.Count > 0
        ? string.Join( " ", o )
        : "No missing cards";
};

Okunmamış okunabilir

i => {
    // Initialize a list to contain the list of cards missing
    var o = new System.Collections.Generic.List<string>();

    // Initialize the list of suits and numbers of cards
    string[] S = { "H", "D", "S", "C" }, N = "A 2 3 4 5 6 7 8 9 10 J Q K".Split(' ');

    // Cycle through the suits...
    foreach( var s in S ) {
        // ... and the numbers ...
        foreach( var n in N ) {
            // ... and check it the combo number + suite is missing
            if( !System.Linq.Enumerable.Contains( i, n + s ) ) {
                // If it's missing, add it to the list of missing cards
                o.Add( n + s );
            }
        }
    }

    // If the count of missing cards is greater than 0...
    return o.Count > 0
        // Build a 'space' separated string with the missing cards
        ? string.Join( " ", o )
        // Or output the missing cards string
        : "No missing cards";
};

Tam kod

using System;
using System.Collections.Generic;
using System.Linq;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, Int32> f = i => {
            var o = new List<string>();
            string[] S = { "H", "D", "S", "C" }, N = "A 2 3 4 5 6 7 8 9 10 J Q K".Split(' ');

            foreach( var s in S ) {
               foreach( var n in N ) {
                  if( !i.Contains( n + s ) ) {
                     o.Add( n + s );
                  }
               }
            }

            return o.Count > 0
               ? string.Join( " ", o )
               : "No missing cards";
         };

         List<String>
            testCases = new List<String>() {
                "9H AH 7C 3S 10S KD JS 9C 2H 8H 8C AC AS AD 7D 4D 2C JD 6S"
            };

         foreach( String testCase in testCases ) {
            Console.WriteLine( $"{test}\n{f( test.Split( ' ' ) )}" );
         }

         Console.ReadLine();
      }
   }
}

Salıverme

  • v1.0 - 282 bytes- İlk çözüm.

notlar

Eklenecek bir şey yok


1
Bu cevabınız için çok güzel bir format +1.
Rɪᴋᴇʀ

2

JavaScript (ES6), 117 114 111 bayt

s=>[...Array(52)].map((_,i)=>~s.search(c=('JQKA'[v=i>>2]||v-2)+'CDHS'[i&3])?_:c+' ').join``||'No missing cards'

Bu , dizideki tanımlanmamış girişlerinmap() boş dizeleri zorlandığı alanları join()'d.

gösteri


2

Retina , 76 bayt

^
A2345678910JQK¶ 
\G(10|.)
 $&H $&D $&S $&C
Dr` \S+
G1`
^$
No missing cards

Giriş / çıkış, boşlukla ayrılmış kartların bir listesidir. Çıktının önde gelen alanı vardır.

Çevrimiçi deneyin!

açıklama

Kodun çoğu destede olması gereken kartların tam listesini oluşturmakla ilgilidir:

^
A2345678910JQK¶ 
\G(10|.)
 $&H $&D $&S $&C

İlk olarak, girişe yeni bir satır ekliyoruz, tüm olası kart değerleriyle, bu satırın her karakteri (veya birkaç karakter 10) için o kartın tüm olası takımlarının listesini oluşturuyoruz.

Dr` \S+

Bu bir tekilleştirme aşamasıdır, dizeyi bir boşluk artı bazı boşluklar olmayan parçalara ayırır ve her bir parçanın yalnızca bir oluşumunu tutar. Değiştirici r, bunu sağdan sola çalıştırarak her bir parçanın son oluşumunu korur.

G1`

Sadece eksik kartları içeren ilk satırı saklıyoruz.

^$
No missing cards

Sonuç boşsa, yerine "Eksik kart yok" diyoruz


1

Python 3, 106 bayt

Önceki iki piton cevabının birleşimi, bazı dize açma shenanigansları ile karıştırılmıştır.

print(' '.join({x+y for x in[*'23456789JQKA','10']for y in'HDSC'}-{*input().split()})or'No missing cards')

1

Julia , 116 bayt

print(join(setdiff(["$x$y"for x=∪(2:10,"JQKA")for y="HDSC"],readline()|>split),' ')|>s->s>""?s:"No missing cards")

Çevrimiçi deneyin!

Kyle Gullions python çözümüne çok benzer. - yerine Setdiff ve boş dizeyi test etmek için lambda daha da kötüleştirir.



1

Tcl , 270 228 karakter

(Wît Wisarhd'ın yardımıyla biraz kısaldı)

foreach s {H D S C} {foreach c {2 3 4 5 6 7 8 9 J Q K A} {dict set d $c$s 0}}
gets stdin l
foreach c $l {dict set d $c 1}
set m {}
dict for {c h} $d {if {!$h} {lappend m $c}}
if {![llength $m]} {set m "No missing cards"}
puts $m

Çevrimiçi deneyin!

Açıklama:

Bu uygulama, HDSC ve 2-A-A kartezyen ürünü tarafından temsil edilen kartların her biri için bir boole bayrağı içeren bir sözlük oluşturur. İstendiği gibi spesifikasyon olarak verilirse, aslında iyi biçimlendirilmiş bir Tcl listesi olan stdin satırını okur. Her kart okundukça, söz konusu kartın sözlüğüne bir boolean true girilir.

Sonunda bir ayrıştırıcı sözlükte dolaşır ve sözlükte doğru olmayan herhangi bir kartı eksik kartlar listesine ekler. Eksik kartlar listesi uzunluğu sıfırsa, "Eksik kart yok" çıktısını alın, aksi takdirde eksik kartların listesini çıkarın.



1

PHP , 138 bayt

İle Ran -nve-d error_reporting=0

Kart destesi oluşturmak istediğim eski bir başvurudan bazı kodları yeniden kullanıyorum

kod

<?$r=[];foreach([A,J,Q,K,2,3,4,5,6,7,8,9,10]as$t)array_push($r,$t.H,$t.S,$t.D,$t.C);
echo join(" ", array_diff($r,explode(" ",$argv[1])));

Çevrimiçi deneyin!

açıklama

<?$r=[];   # Declare the array that will contain the full deck
# the next line will generate the arry with the full deck  
foreach([A,J,Q,K,2,3,4,5,6,7,8,9,10]as$t)array_push($r,$t.H,$t.S,$t.D,$t.C);
# explode the input string on each blank space and using array_diff to get the
# different elements withing both arrays. (and "echo" of course) 
echo join(" ", array_diff($r,explode(" ",$argv[1])));

Birkaç değişiklikle 120'ye kadar indirebilirsiniz. 1) ilk satırı bir?> İle sonlandırın '> echo'yu <? = 2 ile değiştirin) normal komut satırında boşluklar içeren kartlar girildiğinde $ argv öğesi her biri eleman olarak bir dizi olarak doldurulur, böylece patlamayı kaldırabilirsiniz ( ) Baştan sona. Deneyin
640KB

$argvböyle çalışabilir hiçbir ipucu yoktu , teşekkürler @gwaugh
Francisco Hahn

Oh btw @gweg argümanın boşluklarla ayrılmış bir dize olduğunu söylese de, argümanları birer birer ayarlayabilir.
Francisco Hahn

Komut satırında 'php deck.php 2S 5H JC' gibi çalıştırırsanız, onu boşlukla ayrılmış bir dize olarak düşünmek gibi kullanırsınız. Sadece PHP'nin sizin için ayrıştırmasına izin veriyorsunuz. Onları birbirinden ayırmanıza neden olan yalnızca TIO kullanıcı arayüzüdür.
640KB

Ah anlıyorum. Düzenleyecek, -bytes için teşekkürler: D
Francisco Hahn

1

C # (.NET Core) , 197 bayt

LINQ olmadan.

s=>{var w="";for(var j=0;j<52;){var u="";int t=j%13;u=t<1?"K":t<2?"A":t<11?t+"":t<12?"J":"Q";t=j++/13;u+=t<1?"H":t<2?"D":t<3?"S":"C";w+=s.IndexOf(u)<0?u+" ":"";}return w==""?"No missing cards":w;};

Çevrimiçi deneyin!



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.