ディーラーがデッキを再構築するのを手伝います


19

ディーラーはずさんで、自分のデッキにどんなカードが入っているのか、どのカードが欠けているのかわからなくなりました。


完全なデッキは、52枚のトランプで構成されています。

デッキの各色(ハート、ダイヤモンド、スペード、クラブ)には以下が含まれます。

  • 数字[2-10]
  • ジャック
  • 女王
  • 王様
  • エース

仕事

プログラムは、改行が読み取られるまで、STDINからデッキの内容を読み取ります。入力は「nX nX nX nX」などの形式になると想定できます。ここで、

  • n-[2-10]の間の任意の数、または「J」、「Q」、「K」または「A」のいずれか。(数字以外の文字についてのみ大文字と見なすことができます)
  • X-次のいずれか:「H」、「D」、「S」、「C」(大文字のみと仮定できます)

どこで:

  • 「J」=ジャック
  • 「Q」=クイーン
  • 「K」=キング
  • 'A' =エース

そして

  • 「H」=ハート
  • 'D' =ダイヤモンド
  • 'S' =スペード
  • 「C」=クラブ

入力に重複がないと仮定できます。

プログラムは、入力と同じ方法( "nX nX nX")でデッキの欠落カードをSTDOUTに印刷するか、52枚すべてのカードが提供されている場合は「欠落カードなし」を印刷する必要があります。カードの出力の順序に制約はありません。

入力例:

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

出力:

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

ハッピーゴルフ!


3
T代わりに使用でき10ますか?
アーナルド

@Arnauldディーラーから提供された情報はこれだけだと思う​​ので、「10」に固執する必要があります。さもないと、彼は気分が悪くなります。
ソンブレロチキン

しかし、@ GillBatesはをJ表しません10か?
Okx

@Okx 2 3 4 5 6 7 8 9 10 J Q K AJを表し11ます。
ハイパーニュートリノ

@Okx Jはアルファベットの10番目の文字ですが、それはこれが何であるかではありません。:)
mbomb007

回答:


8

Windowsバッチ(CMD)、205 204バイト

@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%

スーツをループし、ランク付けして完全なデッキを構築し、入力カードを削除します。のT代わりに許可されている場合は1バイトを保存します10。コマンドライン引数が受け入れ可能な入力である場合、11バイトを節約します。編集:@ user202729のおかげで1バイトを保存しました。


200バイトを数えます。
ハイパーニュートリノ

@HyperNeutrino Windowsを使用しているときは、メモ帳を使用してファイルを保存します。つまり、改行では1バイトではなく2バイトかかります。バイトを節約するために別のエディターを使用するのは面倒です。
ニール

ああ、大丈夫。Sublime Textを使用して200バイトを取得します。
ハイパーニュートリノ

@Neil Windowsでは、CR LFの代わりにLFを使用でき、5バイトを節約し(上記のHyperNeutrinoコメント)、それでも動作します。
user202729

また、forループで排除するため/vにCMD(+3バイト?)に渡すことができます。/ との間に余分なスペースがあるようです。EnableDelayedExpansioncall(%c%)do
user202729

8

パイソン、147 146 145 138 131 129 127 125 120バイト

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')

すべての可能なカードをセットとして取得し、入力カードを減算します。

コード内の余分なスペースを指摘しているmbomb007のおかげで-1バイト。
Python 2で実行できるゴルフを指摘してくれたmbomb007のおかげで-1バイト(raw_inで-5バイトと+4バイトraw_input
-7リストの内包表記の代わりにセットとセット減算を使用して切り替えることで
-7バイトValueInkのおかげで-7バイト私はlistスイートに必要ないことを指摘するために
-2バイトのDatastreamのおかげで、すべての値を書き込むだけで以前の奇妙なものよりもバイト効率が高いことを
指摘しました-ValueInkの指摘のおかげでそのセットはジェネレーターを取ることができるので、リスト内包表記に入れる必要はありません
再度Python 3に切り替えると、さらにゴルフができることを指摘してくれたDatastreamのおかげで-2バイト...(印刷後の括弧の場合は+2、印刷の場合は-4 raw_
-5 Python 2(!!!)に切り替えることでバイトを節約できます(範囲を再度使用し、の代わりにバックティックを使用し、のstr(ために+4を使用raw_


1
削除できる余分なスペースがあり、Python 2を使用する場合の`d`代わりにstr(d)、の括弧を削除することに加えて使用できますprint
mbomb007

@ mbomb007ありがとう!
ハイパーニュートリノ

for y in 'HDSC'そこにすべてのキャラクターを入れるためにも機能します。(list('JQKA')ただし、まだ他の部分が必要です。)
バリューインク

1
'1 2 3 4 5 6 7 8 9 10 J Q K A'.split()あなたが行っている[d for d in range(2,11)]+list('JQKA')操作の代わりに数バイトを節約するかもしれません。
ストリーム

同意1したので、追加する必要がないという事実のために2バイト節約するようです。また、setコンストラクターはジェネレーターオブジェクトを適切に取り込むため、最初のリストの理解のために外側の括弧を削除できます。
バリューインク

7

05AB1E、39バイト

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

オンラインでお試しください!

説明

ð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

CJam49 47バイト

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

オンラインでお試しください!

説明

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

ゼリー、39 バイト

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

オンラインでお試しください!

どうやって?

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バイト

私のゴルフの1つを初めて投稿しましたが、あまり良い候補ではありません。これをもっと減らすことができると確信しています。

その背後にある考え方は、異なる値とスーツのASCII値によって計算されたインデックスを互いに乗算したインデックスを持つカードの出現を格納するスパース配列です(たとえば、スペードのエース(AS)はインデックス(65 *の領域に格納されます) 83 = 5395))。この方法で、各タイプのカードは一意のインデックスを取得します。このインデックスは、後で「マップ」配列に存在するかどうかを確認できます。

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

PowerShell114 111 110バイト

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

オンラインでお試しください!

入力$nをスペース区切りまたは改行区切りの文字列として受け取ります。範囲からアレイ構築2..10と連結JQKA(で索引付け[0..3]、それにするchar配列)。その配列は、|%{}ヘルパーを設定するループに送られ$i、スーツをループして結果をで連結します$i$_。このループの最後に、などの文字列の配列があります("2C", "2S", "2H", ... "AH", "AD")。その配列は入力を正規表現するそれらの要素としてフィルタでWhere-Object|?{})に供給されます。そのフィルタリングの結果はに保存されます。$_-notmatch$n$a

次に、擬似3項を使用して、ブールまたはのどちらになるかによって、( , )[]出力'No missing cards'またはを選択します。が空の場合(デッキ内のすべてのカードが入力にあることを意味します)、はであるため、が選択されます。選択される場合も同様です。どちらの場合でも、それはパイプラインに残り、出力は暗黙的です。$a!!$a$false$true$a!!$a0"No missing cards"$a


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

改行区切りリストとしてのI / O。

説明

  • sort STDINから改行区切りの入力を読み取り、ソートします
  • これはにパイプされます comm
  • printf %s\\n {10,{2..9},A,J,K,Q}{C,D,H,S}カードの完全なデッキを生成するブレース拡張です。printf独自の行に各カードを印刷します。順序は、出力がパイプされた場合と同じになるように指定されますsort
  • comm完全なデッキをソートされた入力と比較し、差を出力します。 -3列3(一般的なもの)の出力を抑制します
  • からの出力全体commがにパイプされgrep .ます。からの出力がない場合comm(つまり、すべてのカードが入力にあった場合)、||「or」節は必要なメッセージを出力します。そうでない場合、はgrep .からのすべての行出力に一致しcommます。

オンラインでお試しください


4

パイソン2104,93,130、114のバイト

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'

オンラインでお試しください!

  • 範囲を使用する代わりにリストをハードコーディングして-10バイト!
  • +37バイト-入力にすべてのカードが存在する場合、「見当たらないカード」の印刷が失敗しました!
  • コードをリスト内包表記に変更して、-16バイト!

1
「行方不明カードなし」
-L3viathan

1
@ L3viathanそれを指摘してくれてありがとう。回答を編集しました!
Keerthana Prabhakaran

list('23456789JQKA')+['10']賢いです。私は10他のPythonの答えの単一の文字のリストから分割するためのより良い方法を求めて頭を悩ませていましたが、それは美しく機能します。
ストリーム

2

ルビー、108 + 1 = 109バイト

-pフラグを使用します。

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

sed、157 + 1(-rフラグ)= 170 158バイト

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.+//

オンラインでお試しください!

これにより、可能なすべてのカードが生成され、生成されたカードから入力内の各カードが削除されます。


「行方不明カードなし」
-L3viathan

@ L3viathan修正
Kritixi Lithos

2

C#、282バイト


ゴルフ

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";};

非ゴルフ

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";
};

読めないゴルフ

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";
};

完全なコード

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();
      }
   }
}

リリース

  • v1.0の - 282 bytes-初期ソリューション。

ノート

追加するものはありません


1
これはあなたの答え、+ 1にとって非常に良いフォーマットです。
Rɪᴋᴇʀ

2

JavaScript(ES6)、117 114 111バイト

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

これは、によって生成された配列内の未定義のエントリが'dのmap()ときに空の文字列に強制されるという事実を利用してますjoin()

デモ


2

網膜、76バイト

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

入力/出力はスペースで区切られたカードのリストです。出力には先行スペースがあります。

オンラインでお試しください!

説明

ほとんどのコードは、デッキにあるべきカードの完全なリストを作成することを扱っています。

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

まず、入力に改行を追加し、可能なすべてのカードの値を指定します。次に、この行の各文字(または文字のカップル10)について、そのカードのすべての可能なスーツのリストを作成します。

Dr` \S+

これは重複排除の段階であり、文字列をスペースといくつかの非スペースで構成されるチャンクに分割し、各チャンクのオカレンスを1つだけ保持します。修飾子rは、これを右から左へ動作させ、各チャンクの最後の出現を保持します。

G1`

最初の行のみを保持しますが、現在は行方不明のカードが含まれています。

^$
No missing cards

結果が空の場合、「カードがない」と置き換えます


1

Python 3、106バイト

以前の2つのpythonの回答と、いくつかの文字列展開シェナンガンの組み合わせ。

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

1

ジュリア、116バイト

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

オンラインでお試しください!

Kyle Gullions pythonソリューションに非常に似ています。-の代わりにSetdiffと空の文字列をテストするラムダがそれを悪化させます。



1

Tcl270 228文字

(WîtWisarhdの助けを借りて短縮)

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

オンラインでお試しください!

説明:

この実装は、HDSCと2-through-Aのデカルト積で表される各カードのブールフラグで構成される辞書を構築します。stdinから行を読み取ります。要求された仕様として指定されている場合、実際には整形式のTclリストです。各カードが読み取られると、ブール値のtrueがそのカードの辞書に入力されます。

最後に、パーサーはディクショナリをループし、ディクショナリにtrueを持たないカードを欠落しているカードのリストに追加します。不足しているカードのリストの長さがゼロの場合、「不足しているカードはありません」を出力し、そうでない場合は、不足しているカードのリストを出力します。



1

PHP、138バイト

-n-d error_reporting=0

カードのデッキを作成するように要求した古い提出物のコードを再利用します

コード

<?$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])));

オンラインでお試しください!

説明

<?$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])));

数回の調整で、120まで下げることができます。1)最初の行を?>で終了し、 'echo'を<?=に置き換えます。2)スペースを使用して通常のコマンドラインにカードを入力すると、$ argvが要素として配列として設定されるため、explode( )完全に。試してください
640KB

私は全く分からなかった$argv@gwaugh、そのようおかげで作業することができます
フランシスコ・ハーン

ああ、@ gwaughの質問では、引数はスペースで区切られた文字列で、引数を1つずつ設定できると言われました。
フランシスコハーン

「php deck.php 2S 5H JC」のようなコマンドラインで実行すると、スペースで区切られた文字列と考えるのと同じ使用方法になります。PHPに解析させるだけです。TIOのUIのみが、それらを別々に配置します。
640KB

ああなるほど。-bytes:Dに感謝します
フランシスコ・ハーン



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.