Помогите дилеру восстановить колоду


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' = клубы

Вы можете предположить, что на входе не будет дубликатов.

Ваша программа должна затем распечатать отсутствующие карты в колоде в STDOUT таким же образом, как вход («nX nX nX»), или распечатать «Нет отсутствующих карт», если все 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 A. Jпредставляет 11.
HyperNeutrino

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

Перебирает костюмы и ранги, собирая полную колоду, затем удаляет входные карты. Сохранить 1 байт, если Tразрешено вместо 10. Сохраните 11 байтов, если аргументы командной строки допустимы. Редактировать: 1 байт благодаря @ user202729.


Я считаю 200 байтов.
HyperNeutrino

@HyperNeutrino Поскольку я в Windows, я использую Блокнот, чтобы сохранить файл, что означает, что переводы строки стоят мне 2 байта вместо одного. Мне лень использовать другой редактор для сохранения байтов.
Нил

О, ладно, ладно. Я получаю 200 байтов, используя Sublime Text.
HyperNeutrino

@Neil В Windows вы можете использовать LF вместо CR LF, экономит 5 байт (комментарий HyperNeutrino выше), и он все еще работает.
user202729

Кроме того, вы можете перейти /vк CMD (+3 байта?), Чтобы EnableDelayedExpansionисключить callв цикле for. / Кажется, между вами (%c%)и do?
user202729

8

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

Получает все возможные карты как набор и вычитает входные карты.

-1 байт благодаря mbomb007, указывающему на дополнительный пробел в моем коде.
-1 байт благодаря mbomb007 для указывая некоторые игры в гольф , которые могут быть сделаны с Python 2 (-5 байт и +4 байта raw_в raw_input)
-7 байт, переключаясь на основе набора и набора вычитанием вместо списковых
-7 байт благодаря ValueInk за указание на то, что мне не нужны listнаборы
-2 байта, спасибо Datastream за то, что он указал, что простая запись всех значений более эффективна, чем та странная вещь, которую я имел ранее
-2 байта, благодаря ValueInk за указание что наборы могут принимать генераторы, поэтому мне не нужно помещать его в список понимания
-2 байта спасибо Datastream за то, что он указал, что я могу сыграть в гольф еще больше, если я снова переключусь на Python 3 ... (+2 для паренсов после печати, -4 для raw_)
-5 байтов благодаря Lulhum и мне за указание из-за того, что переключение обратно на Python 2 (!!!) может помочь мне сохранить байты (снова используя диапазон, используя backticks вместо str(, и +4 из-за raw_)


1
У вас есть дополнительное пространство, которое вы можете удалить, и вы можете использовать `d`вместо, str(d)если вы используете Python 2, в дополнение к удалению скобок для print.
mbomb007

@ mbomb007 Спасибо!
HyperNeutrino

for y in 'HDSC'также работает для получения всех персонажей. (Вам все еще нужна list('JQKA')другая часть.)
Value Ink

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

Согласен, похоже, что это сэкономит 2 байта из-за того, что 1не нужно добавлять. Кроме того, вы можете удалить внешние скобки для вашего первого понимания списка, потому что setконструктор прекрасно воспринимает объекты генератора.
Value Ink

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

CJam , 49 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 байта

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

Идея, лежащая в основе этого, заключается в разреженном массиве, хранящем вхождения карточек, с индексами, рассчитанными по значениям 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

PowerShell , 114 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.

Затем мы используем псевдо-троичный, ( , )[]чтобы выбрать, выводим ли мы 'No missing cards'или $a, основываясь на том, !!$aпревращается ли в логическое значение $falseили $true. Если $aпусто (то есть все карты в колоде находится на входе), то !!$aесть 0, поэтому "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

Ввод / вывод в виде списка с разделителями новой строки.

объяснение

  • 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(т. Е. Все карты были на входе), то предложение ||«или» выводит требуемое сообщение. В противном случае grep .совпадает со всеми строками, выводимыми из comm.

Попробуйте онлайн .


4

Python 2 , 104,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 спасибо, что указал на это. Я отредактировал свой ответ!
Киртана Прабхакаран

list('23456789JQKA')+['10']Умна. Я ломал голову над лучшим способом вычленить 10из списка одиночных символов в другом ответе на python, но это прекрасно работает.
Datastream



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 байта


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

Ungolfed читабельный

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

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'

Это использует тот факт, что неопределенные записи в массиве, сгенерированном посредством, map()приводятся к пустым строкам, когда join()'d.

демонстрация


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+

Это этап дедупликации, он разбивает строку на куски, состоящие из пробела и нескольких непробелов, и сохраняет только одно вхождение каждого чанка. Модификатор rзаставляет это работать справа налево, сохраняя затем последнее вхождение каждого чанка.

G1`

Мы оставляем только первую строчку, в которой сейчас находятся недостающие карточки.

^$
No missing cards

Если результат пустой, мы заменяем его на «Нет пропущенных карточек»


1

Python 3, 106 байт

Комбинация двух предыдущих ответов на 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")

Попробуйте онлайн!

Очень похоже на решение Python Кайла Гуллиона. Setdiff вместо - и лямбда для проверки пустой строки, тем не менее, усугубляют ситуацию.



1

Tcl , 270 228 символов

(Сокращено с некоторой помощью от Wît Wisarhd)

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-через-A. Он читает строку из stdin, которая, если задана как спецификация, как требуется, на самом деле является правильно сформированным списком Tcl. При чтении каждой карточки в словарь этой карточки вводится логическое значение 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 будет заполнен массивом, каждый из которых будет элементом, поэтому вы можете удалить разнесение ( ) целиком Попробуй
640KB

я понятия не имел, что $argvможет так работать, спасибо @gwaugh
Франциско Хан

О, кстати, вопрос, который говорит, что аргумент - это строка, разделенная пробелами, может устанавливать аргументы один за другим.
Франциско Хан

Если вы запустите его в командной строке, например: 'php deck.php 2S 5H JC', то вы будете использовать его так же, как если бы вы думали об этом как о строке, разделенной пробелом. Вы просто позволяете PHP разобрать это за вас. Это только пользовательский интерфейс TIO, который заставляет вас разделить их.
640KB

А ну понятно. Отредактирую, спасибо за -байты: D
Франциско Хан



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.