Допоможіть дилеру відновити колоду


19

Дилер неохайно і втратив інформацію про те, які картки містить його / її колода, а які картки відсутні, чи можете ви допомогти йому / їй?


Повна колода складається з 52 ігрових карт, а саме:

Кожен колір в колоді (серця, алмази, лопати, клуби) містить:

  • Числа [2 - 10]
  • Джек
  • Королева
  • Король
  • Туз

Завдання

Ваша програма буде читати вміст колоди з STDIN, поки не буде прочитаний новий рядок. Можна припустити, що вхід буде у формі "nX nX nX nX" тощо, де:

  • n - будь-яке число між [2 - 10] або "J", "Q", "K" або "A". (Ви можете вважати великим регістром лише для нечислових символів)
  • X - будь-яке з наступного: 'H', 'D', 'S', 'C' (Ви можете вважати лише великі регістри)

Де:

  • 'J' = Домкрати
  • 'Q' = Королева
  • 'К' = король
  • 'А' = туз

І

  • 'Н' = Серця
  • '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- десята літера алфавіту, але це не про що. :)
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 вище), і він все ще працює.
користувач202729

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

8

Пітон, 147 146 145 138 131 129 127 125 120 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 (!!!) може допомогти мені зберегти байти (повторно використовуючи діапазон, використовуючи задні підстановки замістьstr( , та +4 завдяки raw_)


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

@ mbomb007 Дякую!
HyperNeutrino

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')маніпуляції, що відбувається.
Datastream

Погоджено, схоже, що це заощадить 2 байти за рахунок того, що 1не потрібно додавати. Крім того, ви можете зняти зовнішні дужки для розуміння першого списку, оскільки 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

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)). Таким чином, кожен тип карт отримує унікальний індекс, який згодом можна перевірити на наявність у масиві «map».

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масивом). Цей масив подається у цикл, |%{}який встановлює helper, $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

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(тобто всі картки були на вході), тоді пункт ||"або" надсилає необхідне повідомлення. Інакше 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 дякую, що вказав на це. Я відредагував свою відповідь!
Keerthana Prabhakaran

list('23456789JQKA')+['10']Розумна. Я перекривав мій мозок для кращого способу розділити 10зі списку поодиноких знаків в іншій відповіді пітона, але це прекрасно працює.
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 Fixed
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'

Це використовує той факт, що невизначені записи в масиві, що генерується 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 байт

Поєднання двох попередніх відповідей пітона змішується з деякими шнурками розпакування рядків.

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

Спробуйте в Інтернеті!

Дуже схожий на рішення пітона Кайл Гулліонс. 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. Коли кожна картка читається, в словник цієї картки вводиться булева істина.

В кінці аналізатор пробирається через словник і додає будь-яку карту, яка не мала справжнього словника, до списку відсутніх карт. Якщо довжина списку відсутніх карток дорівнює нулю, виведіть "Без картки пропущених карт", інакше виведіть список карт, які відсутні.



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) закінчіть перший рядок a?> Замініть 'echo' на <? = 2) введення карт у звичайний командний рядок з пробілами заповнить $ argv як масив з кожним як елемент, так що ви можете видалити вибух ( ) повністю. Спробуйте
640 Кб

у мене не було поняття, яке $argvможе так працювати, дякую @gwaugh
Франциско Хан

О, btw @ gwaugh, питання запитало, що аргумент є рядком, розділеним пробілами, може встановлювати аргументи один за одним.
Франциско Хан

Якщо ви запускаєте його в командному рядку на зразок: 'php deck.php 2S 5H JC', це те саме використання, як якщо б ви думали про це як пробіл з обмеженим пробілом. Ви просто дозволяєте PHP проаналізувати це для вас. Ви можете розділити їх лише за допомогою інтерфейсу TIO.
640 Кб

О Я бачу. Відредагую, дякую за -байт: D
Франциско Хан



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