Создать колоду карт

32

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

[
  "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", 
  "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", 
  "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", 
  "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", 
  "J", "J"
]

Он составлен таким образом:

  • Есть четыре костюма; сердца, пики, алмазы и булавы (H, S, D, C).
  • У каждой масти есть одна карта для чисел от 2 до 10, плюс 4 карты с картинками: туз, валет, дама и король (A, J, Q, K).
  • Для каждой комбинации масти и значения в массиве должен быть один элемент, который представляет собой строку и состоит из значения, за которым следует масть (пробел между ними разрешен).
  • Кроме того, есть две карты Джокера ('J').
  • Пишите на любом понравившемся вам языке.
  • Гольф это! Попробуйте создать этот вывод в наименьшем количестве байтов.
  • Неважно, в каком порядке вывод.
AJFaraday
источник
2
@KevinCruijssen это правильно. Начальный вопрос указывает числа от 2 до 10 и массив строк в качестве вывода.
AJFaraday
15
Мне было просто интересно, если бы вы могли получить 23456789, умножив 2 меньших числа ... только чтобы обнаружить, что это главное!
матч
4
@match Поскольку порядок выхода не имеет значения, может быть , вы все еще можете создать его с меньшими номерами, прекратив его 2или 4или что - нибудь еще , так что это не простое больше.
Кевин Круйссен
5
Правила в комментариях не учитываются. Если мы не можем напечатать результат в STDOUT (и это очень важно, если, поскольку он переопределяет наши значения по умолчанию для ввода-вывода и препятствует участию языков без функций и строковых массивов), это правило должно быть явно указано в спецификации вызова.
Деннис
7
Это не исключает строковое представление такого массива, который может быть напечатан в STDOUT. Если бы не раздел комментариев, я бы никогда не догадался, что это не разрешено.
Деннис

Ответы:

29

JavaScript (ES6), 62 60 байт

f=n=>n>51?'JJ':[('JQKA'[k=n>>2]||k-2)+'CDHS'[n&3],...f(-~n)]

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

Arnauld
источник
Плавные ходы !!!
Код Whisperer
Я не знал, что существует распространенный синтаксис, пока я не прочитал это - очень круто
logic8
24

Bash 43 34 байта

d=({A,J,Q,K,{2..10}}{H,S,D,C} J J)

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

Гленн Джекман
источник
1
На 9 байт короче
цифровая травма
Я не думал, что фигурные скобки были вложенными. Спасибо.
Гленн Джекман
И тут я подумал: «На каком языке я знаю, что удобно направлять продукты в списках строк?» Я даже не думал о старом добром шарике!
aschepler
1
Технически расширение скобок - это не шаблон
глобуса
13

брейкфук , 200 197 байт

+[[<+>->++<]>]+<++++<<+++[->+++>+++++>+>+<<<<]>+.<<.>>.--<<<[->>+++<<]>>+>[<<.>.-.+>.<<.<<[>>>+.>.<<.<+<-]>[-<+>>>+<<]>>.>.<<.>+++++++++.>.<<.>+.>.<<.>++++++.>.,++++[-<-------->]>[[-<+>]>]<<[<]>>>]

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

Использует одну отрицательную ячейку (+1 байт для исправления), упаковку ячеек (много байтов для исправления) и 0 для EOF (+2 байта для устранения зависимости).

Выходы

J J 10H 2H 3H 4H 5H 6H 7H 8H 9H AH JH KH QH 10S 2S 3S 4S 5S 6S 7S 8S 9S AS JS KS QS 10D 2D 3D 4D 5D 6D 7D 8D 9D AD JD KD QD 10C 2C 3C 4C 5C 6C 7C 8C 9C AC JC KC QC

Объяснение:

+[[<+>->++<]>]  Sets the tape to powers of 2 
          TAPE: 1 2 4 8 16 32 64 128 0 0'
+<++++<<+++[->+++>+++++>+>+<<<<]   Uses the 64 and the 128 to generate the suit letters
          TAPE: 1 2 4 8 16 32 0' 73 83 68 67
                                 I  S  D  C
>+.<<.>>.--<<     Prints the Jokers
<[->>+++<<]>>+>   Uses the 16 to create 49
          TAPE: 1 2 4 8 0 32 49 72' 83 68 67
                                 H   S  D  C
[  Loop over the suits
   <<.>.-.+>.<<.<<      Print the 10 card with a leading space
          TAPE: 1 2 4 8' 0 32 49 Suit
   [>>>+.>.<<.<+<-]  Use the 8 to print the other 8 number cards
          TAPE: 1 2 4 0' 8 32 57 Suit
   >[-<+>>>+<<]      Move the 8 back into place while also adding it to the 57
          TAPE: 1 2 4 8 0' 32 65 Suit

   >>.>.<<.         Print the Ace
   >+++++++++.>.<<. Print the Jack
   >+.>.<<.         Print the King
   >++++++.>.<<.    Print the Queen
          TAPE: 1 2 4 8 0 32 81' Suit
   >>,    Clear the current suit
   ++++[-<-------->]    Subtract 32 to get back to 49 (reusing the space is longer than just subtracting 32)
          TAPE: 1 2 4 8 0 32 49 0' MoreSuits?
   >[[-<+>]>]<<[<]>>>   Shift all the remaining suits over one
          TAPE: 1 2 4 8 0 32 49 Suit?'
] End on the character of the next suit and repeat
Джо Кинг
источник
Это более чем в 2,5 раза короче моего решения. Отлично сработано.
Случайный парень
11

05AB1E , 28 27 25 24 23 байта

2TŸ.•-Ÿ•S«.•ôì•âJ„jjS«u

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

-1 байт благодаря @Emigna, удаляющему Sпосле "HSDC", потому что âделает это неявно.

Объяснение:

2TŸ           # Push list in the range [2,10]: [2,3,4,5,6,7,8,9,10]
   .•-Ÿ•      # Push compressed string "ajqk"
        S     # Convert it to a list of characters: ["a","j","q","k"]
         «    # Merge the two lists together: [2,3,4,5,6,7,8,9,10,"a","j","q","k"]
.•ôì•         # Push compressed string "cdhs"
â             # Cartesian product of each (pair each character of both lists):
              #  [[2,"a"],[2,"d"],[2,"h"],...,["k","d"],["k","h"],["k","s"]]
J             # Join each pair together to a single string:
              #  ["2a","2d","2h",...,"kd","kh","ks"]
jjS          # Push string "jj", and convert it to a list of characters: ["j","j"]
    «         # Merge both lists together:
              #  ["2a","2d","2h",...,"kd","kh","ks","j","j"]
     u        # Convert everything to uppercase:
              #  ["2A","2D","2H",...,"KD","KH","KS","J","J"]
              # (and output the result implicitly)

Посмотрите эту подсказку 05AB1E (раздел Как сжимать строки, не являющиеся частью словаря? ), Чтобы понять, почему .•-Ÿ•есть "ajqk"и .•ôì•есть "cdhs".

Кевин Круйссен
источник
9

брейкфук , 550 504 байта

++++++++++[>+++>+++++>+++++++<<<-]>++>->[>+>+>+>+<<<<-]>----->++++.<<<<.>>>>.<<<<.>>>>>--->+++++++++++++<<<<<.-.+>>>>.<<<<<.>.-.+>>>>+.<<<<<.>.-.+>>>>++++.-----<<<<<.>.-.+>>>>>.<<<<<<.>>++++++++[-<+.>>>>.<<<<<.>.>>>>+.<<<<<.>.>>>>++++.-----<<<<<.>.>>>>>.<<<<<<.>>]>.>>.<<<<<.>>>>.>.<<<<<.>>>>+.>.<<<<<.>>>>++++++.>.<<<<<.>>>.>>+.<<<<<.>>>>.>.<<<<<.>>>>------.>.<<<<<.>>>>-.>.<<<<<.>>>.>>++++.<<<<<.>>>>.>.<<<<<.>>>>+.>.<<<<<.>>>>++++++.>.<<<<<.>>>.>>>.<<<<<<.>>>>.>>.<<<<<<.>>>>------.>>.<<<<<<.>>>>-.>>.

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

Старый ответ, также онлайн!

Случайный парень
источник
8

Java 10, 153 151 125 77 75 байт

v->("AJQK2345678910".replaceAll("1?.","$0H,$0S,$0D,$0C,")+"J,J").split(",")

-28 байт благодаря @ OlivierGrégoire .
-50 байт благодаря @mazzy .

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

Объяснение:

v->                      // Method with empty unused parameter and String-array return-type
  "AJQK2345678910"
   .replaceAll("1?.",    //  Replace every loose character (or "10" as single char)
     "$0H,$0S,$0D,$0C,") //  with "cH,cS,cD,cC,", where c is the character
   +"J,J")               //  Append "J,J"
  .split(",")            //  And split everything by commas
Кевин Круйссен
источник
3
попробуйте "AJQK2345678910".replace("1?.","$0H,$0S,$0D,$0C,")+"J,J"разделить это.
Маззи
1
Smart @mazzy Спасибо. И уже редактировал это, Оливье. :)
Кевин Круйссен
2
прохладный! Я считаю, что можно удалить еще 2 байта - скобки в шаблоне. см. regex101.com/r/aDbz9C/1
mazzy
1
@ mazzy О, я даже не знал, что $0это возможно на Яве. ТИЛ, спасибо. :)
Кевин Круйссен
7

APL (Dyalog Unicode) , 29 байт

1 байт сохранен благодаря Проби, используя 1+⍳9вместо1↓⍳10

'JJ',,'HCDS'∘.,⍨'AKJQ',⍕¨1+⍳9

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

Это полная программа. В ссылке TIO я включил бокс, чтобы можно было различать отдельные элементы массива.

Вот коробочный вывод.

┌─┬─┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬───┬───┬───┬───┐
JJAHACADASKHKCKDKSJHJCJDJSQHQCQDQS2H2C2D2S3H3C3D3S4H4C4D4S5H5C5D5S6H6C6D6S7H7C7D7S8H8C8D8S9H9C9D9S10H10C10D10S
└─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┴───┴───┴───┘

'JJ', 2 джокера соединены с

, восторженная форма

∘.,⍨ матрица, созданная путем объединения каждой комбинации

  • 'HCDS' эта строка против

  • 'AKJQ', эта строка с

    • ⍕¨ Стригированные формы каждого из

      • 1+⍳9 числа 2..10 (1 плюс диапазон 1..9)
Kritixi Lithos
источник
Я изменил отступ вашего списка в объяснении. Это выглядело немного странно с двумя и тремя точками. Если это было задумано по какой-то причине, не стесняйтесь откатываться.
Кевин Круйссен
@KevinCruijssen Спасибо, я не мог понять, как это сделать, поэтому я использовал несколько пулевых точек, ха-ха
Kritixi Lithos
Да, я так и думал, поэтому я изменил это. :) Вам нужно умножить четыре ведущих пробела перед тем, -чтобы сделать отступ.
Кевин Круйссен
7

Befunge-98 (FBBI) , 75 байт

j4d*1-2k:d%4+1g:'0-!#v_>,d/1g,' ,!#v_3
CHSDA234567890JQK@;1'< ^,;,k2"J J" <

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

Структура программы

введите описание изображения здесь

Сначала стек заполняется 0символами s и jне перепрыгивает через инициализацию. Инициализация толкает 4 * 13 = 52, что является счетчиком программы. В следующих итерациях трейлинг 3заставляет указатель перепрыгнуть через эту часть.

1-2k:d%4+1g,d/1g,' ,!#v_  Main loop

1-                        decrement counter
  2k:                     duplicate counter three times
     d%                   counter mod 13 ...
       4+                 ... + 4 is the position of the card in the Data section
         1g,              get the card from row 1 and print it
            d/            counter / 13 is the position of the suit in the Data section
              1g,         get the suit from row 1 and print it
                 ' ,      print a space as seperator
                    !     negate the counter (0 for non-zero, 1 for 0)
                       _  If the counter is 0, move West ...
                     #v   ... and move to the termination
                          otherwise, continue with the next iteration

Код, который печатает 10:

'0-!#v_>    Checks if Card is '0'

'0-         subtract the '0' from the card
   !        negate (1 for '0', 0 for all other cards)
      _     If card was '0', move West
    #v        and go South to print '10'
            Else continue to go East

  ;1'< ^,;  Prints '10'

     <      Go West
   1'       Push '1'
  ;         Jump to ...
         ;  ... the next semicolon
        ,   Print '1'
       ^    Go back to the main loop
            The '0' will be printed by the main loop

Прекращение:

@; ... ;,k2"J J" <

                 <  Go West
           "J J"    Push "J J"
        ,k2         Print it
       ;            Jump to ...
 ;                  ... the next semicolon
@                   terminate the program
овс
источник
7

R 65 байт

c(outer(c('A',2:10,J<-'J','Q','K'),c('S','D','H','C'),paste),J,J)

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

-2 байта благодаря предложениям @Giuseppe и @JayCe

digEmAll
источник
1
Это был мой точный ответ, хотя я думаю, что я использовал двойные кавычки вместо одинарных кавычек.
Джузеппе
Извините, я дважды опубликовал ваш ответ? Я проверил, но не смог найти ответ R ...
digEmAll
О, нет, я только что сам набрал все это в TIO, прежде чем увидеть ваш :-)
Джузеппе
1
Да, внешний это определенно способ пойти сюда! Хотя пробел предоставляется в соответствии со спецификацией, вы можете сохранить один байт с помощью paste. @ Джузеппе тоже.
JayCe
Я указал на это в ответе JayCe, но вы можете установить его x<-'J'внутри, outerа затем повторно использовать xв качестве переменной в крайнем c()операторе, чтобы сбрить байт: попробуйте онлайн!
Джузеппе
6

Powershell, 63 61 59 56 байт

-3 байта: спасибо ConnorLSW

2..10+'AJQK'[0..3]|%{"$_`H";"$_`S";"$_`D";"$_`C"};,'J'*2
Mazzy
источник
1
-3 используя строку для массива для первой части:2..10+'AJQK'[0..4]|%{"$_`H";"$_`S";"$_`D";"$_`C"};,'J'*2
colsw
1
прохладный! Любая идея, как удалить `` ``?
Маззи
1
Насколько я знаю, это самый дешевый способ разбить переменную в строке, я посмотрел на цикл, но это обходится на 2 символа дороже.
Colsw
6

Perl 5 , 41 байт

sub{J,J,map<"$_"{S,D,H,C}>,A,2..10,J,Q,K}

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

Дом Гастингс
источник
1
Это научило меня чему-то действительно интересному в болтовне. Ницца.
AmbroseChapel
5

Python 3 , 67 64 байта

print(*[a+b for a in['10',*'A23456789JQK']for b in'CHSD'],*'JJ')

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


Python 2 , 78 76 74 68 байт

print['1'*(a<'1')+a+b for a in'A234567890JQK'for b in'CHSD']+['J']*2

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

Alt:

Python 2 , 68 байт

print[a+b for a in['10']+list('A23456789JQK')for b in'CHSD']+['J']*2

print['1'[a>'0':]+a+b for a in'A234567890JQK'for b in'CHSD']+['J']*2

Сохраненный

  • -3 байта, благодаря овсам
TFeld
источник
Это довольно подробный ответ ...
AJFaraday
Если нам не нужно использовать print, мы не можем сделать это [*[a+b for a in['10',*'A23456789JQK']for b in'CHSD'],*'JJ']в 59 байтах. Решению на Haskell не нужно выводить на stdout, зачем Python?
Энрико Борба
5

K (нгн / к) , 30 байтов

"JJ",/("AKQJ",$2+!9),'/:"SHDC"

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

!9 это список 0 1 ... 8

2+!9 это список 2 3 ... 10

$ нанизывать

, конкатенация

,'/:объединять каждый с каждым правом, то есть декартово произведение; обычно это ,/:\:или, ,\:/:но справа у нас есть только скаляры ( "SHDC"), поэтому мы можем использовать 'вместо\:

"JJ",/объединить (concat уменьшить) список справа, используя в "JJ"качестве начального значения для сокращения

СПП
источник
5

MS-SQL, 137 байт

SELECT v.value+s.value
FROM STRING_SPLIT('A-2-3-4-5-6-7-8-9-10-J-Q-K','-')v,STRING_SPLIT('H-S-D-C--','-')s
WHERE s.value>''OR v.value='J'

Массив значений в SQL возвращается как отдельные строки запроса. Использует STRING_SPLITфункцию, представленную в SQL 2016 .

Он включает джокеров, добавляя две масти «пустых строк», чтобы воспользоваться существующим «J» для Джека, а затем отфильтровывать ненужные нам строки. Короче, чем использование UNION ALLутверждений для добавления джокеров.

BradC
источник
Что произойдет, если вы сделаете второй аргумент для STRING_SPLIT пустой строкой? Я не использую MS-SQL, но во многих языках он даст вам все символы в массиве.
AJFaraday
@AJFaraday Это было бы удобно, но это не работает, понимаешь Procedure expects parameter 'separator' of type 'nchar(1)/nvarchar(1)'. Это также было бы удобно для игры в гольф, если по умолчанию используется запятая, если вы пропустили второй параметр, но он также не поддерживает это. Еще один предмет для GolfSQLязыка, о котором я, вероятно, никогда не уйду писать :)
BradC
4

Рубин , 61 байт

->{[*0..52,52].map{|x|['JAKQ'[w=x%13]||w-2,'SDHC'[x/13]]*''}}

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

гигабайт
источник
Это умение использовать J как для Джека, так и для Джокера :-)
Марти Нил,
Разве вы не можете сэкономить 4 байта, пропуская ->{... }? Он работает сам по себе и не нуждается в параметрах, поэтому он не должен быть лямбда
Piccolo
4

C # .NET, 114 байт

o=>(new System.Text.RegularExpressions.Regex("1?.").Replace("AJQK2345678910","$0H,$0S,$0D,$0C,")+"J,J").Split(',')

Порт моего Java-ответа (кредит @mazzy ) .

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


Интересная альтернатива 119 байтов от @Corak .

using System.Linq;o=>new[]{"J","J"}.Concat(from s in"SDCH"from n in"A234567890JQK"select(n=='0'?"10":n+"")+s).ToArray()

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

Если System.Collections.Generic.IEnumerable<string>вместо вместо string[]приемлемый вывод, трейлинг .ToArray()может быть отброшен, так что он становится 109 байтов .

Объяснение:

using System.Linq;       // Required import for the `from .. in ..` and `select` parts
o=>                      // Method with empty unused parameter and string-array return-type
  new[]{"J","J"}         //  Return a string-array containing two times "J"
   .Concat(              //  And add:
     from s in"SDCH"     //   Loop over the suits
       from n in"A234567890JQK"
                         //    Inner loop over the cards
         select(n=='0'?  //     If the current card item is '0'
                 "10"    //      Use 10 instead
                :        //     Else:
                 n+"")   //      Simply use the card item as is
                      +s)//     And append the suit
   .ToArray()            //  Convert the IEnumerable to an array
Кевин Круйссен
источник
4

PHP, 108 99 97 байт

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

Попробуйте онлайн! (Изменить 1)

Код

<?php $r=[J,J];foreach([A,J,Q,K,2,3,4,5,6,7,8,9,10]as$t)
$r=array_merge($r,[H.$t,S.$t,D.$t,C.$t]);

Пытался использовать чисто php-функции, но bytecount был ниже с циклом :(

Выход (используя print_r)

Array
(
[0] => J
[1] => J
[2] => HA
[3] => SA
[4] => DA
[5] => CA
[6] => HJ
[7] => SJ
[8] => DJ
[9] => CJ
[10] => HQ
[11] => SQ
[12] => DQ
[13] => CQ
[14] => HK
[15] => SK
[16] => DK
[17] => CK
[18] => H2
[19] => S2
[20] => D2
[21] => C2
[22] => H3
[23] => S3
[24] => D3
[25] => C3
[26] => H4
[27] => S4
[28] => D4
[29] => C4
[30] => H5
[31] => S5
[32] => D5
[33] => C5
[34] => H6
[35] => S6
[36] => D6
[37] => C6
[38] => H7
[39] => S7
[40] => D7
[41] => C7
[42] => H8
[43] => S8
[44] => D8
[45] => C8
[46] => H9
[47] => S9
[48] => D9
[49] => C9
[50] => H10
[51] => S10
[52] => D10
[53] => C10
)

редактировать

Благодаря @JoKing, предлагая изменения explode(" ","H$t S$t D$t C$t")для[H.$t,S.$t,D.$t,C.$t]

Франциско Хан
источник
Не [H.$t,S.$t,D.$t,C.$t]будет короче, чем взорваться?
Джо Кинг,
Вы абсолютно правы, приму ваш совет, спасибо.
Франсиско Хан
1
73 байта: попробуйте онлайн!
Night2
2
@FranciscoHahn, прости, я этого не заметил! Вот 87-байтовая версия: попробуйте онлайн!
Night2
1
@ Nigth2 Я понятия не имел, что ты можешь так использовать array_push($arr, $item1,$item2,$item3...$itemN), хороший
Франциско Хан,
4

SMBF , 169 байт

представляет буквенный NUL-байт \x00.

<[.<]␀J J HA HK HQ HJ H01 H9 H8 H7 H6 H5 H4 H3 H2 SA SK SQ SJ S01 S9 S8 S7 S6 S5 S4 S3 S2 DA DK DQ DJ D01 D9 D8 D7 D6 D5 D4 D3 D2 CA CK CQ CJ C01 C9 C8 C7 C6 C5 C4 C3 C2

Это наивное решение.

Поскольку эта программа содержит байт NUL, нет простого способа использовать TIO. Запустите это в интерпретаторе Python, используя

data = bytearray(b'<[.<]\x00J J HA HK HQ HJ H01 H9 H8 H7 H6 H5 H4 H3 H2 SA SK SQ SJ S01 S9 S8 S7 S6 S5 S4 S3 S2 DA DK DQ DJ D01 D9 D8 D7 D6 D5 D4 D3 D2 CA CK CQ CJ C01 C9 C8 C7 C6 C5 C4 C3 C2')
mbomb007
источник
TIO
Эрик Outgolfer
@EriktheOutgolfer Как ты это сделал?
mbomb007
1
Я открыл инструменты разработчика F12, выделил текстовое поле при наведении курсора, подошел к консоли и, после того как скопировал и вставил деталь перед нулевым байтом, набрал $0.value+='\0'.
Эрик Outgolfer
4

Japt, 32 30 26 байт

'J²¬c"JQKA"¬c9õÄ)ï+"CHSD"q

Попробуй это

'J²¬c"JQKA"¬c9õÄ)ï+"CHSD"q
'J                             :Literal "J"
  ²                            :Repeat twice
   ¬                           :Split
    c                          :Concatenate
     "JQKA"¬                   :  Split "JQKA"
            c                  :  Concatenate
             9õ                :    Range [1,9]
               Ä               :    Add 1 to each
                )              :  End concatenation
                 ï             :  Cartesian Product
                   "CHSD"q     :    Split "CHSD"
                  +            :  Join each pair to a string
мохнатый
источник
3

Пакет, 118 байт

@for %%s in (C D H S)do @(for /l %%r in (2,1,10)do @echo %%r%%s)&for %%r in (J Q K A)do @echo %%r%%s
@echo J
@echo J
Нил
источник
3

J , 41 байт

'J';^:2,'HCDS',&.>/~(":&.>2+i.9),;/'AJQK'

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

Гален Иванов
источник
1
'J';^:2,;&.>{_13<\'10';;/'23456789AJKQHCDS'немного проще, но для 43. Я чувствую, что побриться здесь есть еще ... но я не понимаю, как.
Иона
@Jonah Да, я тоже пробовал что-то подобное, и я уверен, что мое решение может быть улучшено, но всегда есть новые проблемы, которые нужно решить :)
Гален Иванов
3

R , 67 66 байт

c(paste(rep(c('A',2:10,J<-'J','Q','K'),4),c('S','D','H','C')),J,J)

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

Только на один байт больше, чем решение digEmAll для игры в гольф . Вдохновленный решением Джузеппе для этой связанной задачи - тот самый Джузеппе, который отыграл один байт в ответ!

Я публикую отдельно, поскольку это немного другой подход, использующий преимущество того факта, что 4 не является делителем 13 и что вывод не обязательно должен быть в каком-то определенном порядке.

Jayce
источник
о, ха-ха, я не заметил этого, я прокомментировал это решение на другом
Джузеппе
@Giuseppe Я был очень близок к комментариям вместо того, чтобы публиковать сообщения. Я думаю, я просто не мог устоять перед желанием ответить :)
JayCe
iiiit - это как игра в гольф, как и ответ digemall :-) попробуйте онлайн
Джузеппе
@ Я просто экспериментировал с этим :), так что и digemall, и я можем сыграть в гольф по одному байту благодаря тебе :)
JayCe
3

C (gcc) , 126 137 133 байта

#define S(X)"A"X,"2"X,"3"X,"4"X,"5"X,"6"X,"7"X,"8"X,"9"X,"10"X,"J"X,"Q"X,"K"X,
#define c (char*[54]){S("S")S("D")S("H")S("C")"J","J"}

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

+11 байт, чтобы быть более полным благодаря Якобу.

-4 байта благодаря Захари

В основном злоупотребление препроцессором для сжатия костюмов. Вероятно, может быть вне игры в гольф, но довольно эффективно, учитывая все обстоятельства.

LambdaBeta
источник
1
Я бы сказал, что cэто не «[...] странная« функция »[...]», а декларация массива, хранящаяся в макросе. Насколько мне известно, такая форма вывода не разрешена по умолчанию.
Джонатан Фрех
1
За исключением того, что c не является массивом, это был бы литерал на месте. Каждый «вызов» cв источнике создаст новую копию массива в результирующем исполняемом файле (без оптимизации). Таким образом, код char *a[] = c; char *b[] = c;создает две глубокие копии c. Это поведение - то, что вы ожидаете от функции.
LambdaBeta
1
Если возникла проблема с выводом целого нуля, считаете ли вы код C c=0;допустимым представлением, рассматривая его cкак функцию?
Джонатан Фрех
1
нет, но я бы посчитал #define z 0действительным. Смысл заключается в том , что: c=0; c++; x=c;приводит к x == 1так cне действует так же, как функция. В то же #define z 0 c=z; c++; x=z;время приводит к тому, x == 0что zдействует как функция.
LambdaBeta
1
Я не думаю, что это справедливое сравнение, поскольку вы сначала изменяете предполагаемую функцию, а затем меняете только возвращаемое значение предполагаемой функции. z=0;/**/c=z;c++;x=z;приводит x==0, таким образом, zдействует как функция.
Джонатан Фрех
3

Javascript (ES6) 77 74 72 байта

Это полная программа.

`J,J,${[..."A23456789JQK",10].map(c=>[..."SDHC"].map(s=>c+s))}`.split`,`
Matth
источник
1
Ницца. Вы можете сэкономить несколько байтов, разделяя их запятыми вместо конкатенации: BTJ,J,${[..."A23456789JQK","10"].map(c=>[..."SDHC"].map(s=>c+s))}BT.splitBT,BT (где BT - обратный удар).
Рик Хичкок
Потрясающее предложение! Спасибо.
MattH
3

C (gcc, clang), 138 байтов

#define p(c)putchar(c)
int main(){for(char*q,*r="CDHS";*r;r++)for(q="A234567890JQK";*q;q++)(48==*q)&&p(49),p(*q),p(*r),p(32);puts("J J");}

Подход заключается в кодировании последовательностей в символьных массивах.

Пример вывода

AC AD AH AS 2C 2D 2H 2S 3C 3D 3H 3S 4C 4D 4H 4S 5C 5D 5H 5S 6C 6D 6H 6S 7C 7D 7H 7S 8C 8D 8H 8S 9C 9D 9H 9S 10C 10D 10H 10S JC JD JH JS QC QD QH QS KC KD KH KS J J

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

Брюс Люккенхофф
источник
Подсказка: вы можете использовать один, printfчтобы избавиться от всех putcharс.
Деннис
1
127 байтов .
Джонатан Фрех
1
Что касается вашего метода вывода, OP не позволяет печатать .
Джонатан Фрех
Опираясь на Джонатана Фреха и Денниса 113 байтов
потолочный кот
3

Oracle SQL, 164 байта

Не язык игры в гольф, но ...

SELECT CASE WHEN LEVEL>52THEN'J'ELSE DECODE(MOD(LEVEL,13),1,'A',11,'J',12,'Q',0,'K',MOD(LEVEL,13))||SUBSTR('HDSC',CEIL(LEVEL/13),1)END FROM DUAL CONNECT BY LEVEL<55

Попробуйте онлайн - SQL Fiddle

mt0
источник
2
Мне нравится, что кто-то ответил на это с Oracle SQL
AJFaraday
Postgres почти превосходит это с помощью только строки 172 байта, «выберите» AS, 2S, 3S, 4S, 5S, 6S, 7S, 8S, 9S, 10S, JS, QS, KS, AD, 2D, 3D, 4D, 5D, 6D, 7D, 8D, 9D, 10D, JD, КТ, КД, АГИ, 2H, 3H, 4H, 5H, 6H, 7H, 8H, 9H, 10H, JH, QH, KH, и переменный ток, 2C, 3C, 4C, 5C, 6C, 7C, 8C, 9C, 10C, JC, QC, KC, J, J ''
dwana
@dwana Это не массив строк (или, поскольку это SQL, набор строк). Вам нужно будет разбить строку на строки (или столбцы), чтобы удовлетворить спецификации вопроса. Если вы хотите сделать это как отдельное решение PostgreSQL, я бы хотел увидеть это.
MT0
извините, не видел требования к массиву
dwana
3

Луа ,156 127 138 129 байт

loadstring'r={"J","J"}for x=1,52 do p=x%4+1r[#r+1]=({"A",2,3,4,5,6,7,8,9,10,"J","Q","K"})[x%13+1]..("SDHC"):sub(p,p)end return r'

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

Основано на коде Джо Кинга. Как он предложил в комментариях, мой первоначальный ответ был недействительным (я все еще изучаю, как работает code golf 😬), и связал лучший и правильный ответ. Затем я сделал его меньше.


Исходное решение (156 байт):

r = {} s = "SDHC" c = {"J", "Q", "K"} t = table.insert для x в s: gmatch "." do для y = 1,13 do t (r, (y == 1 и "A" или y> 10 и c [y-10] или y) .. x) end end для _ = 1,2 do t (r, "J") end
r={} -- initializes the result table
s="SDHC" -- initializes the suits' string, it's better to be a string because we're just looping through it
c={"J","Q","K"} -- initializes some of the special cards

t=table.insert -- stores the table.insert call inside the 't' variable

for x in s:gmatch"."do -- loops through the suits, calling each one 'x'
  for y=1,13 do -- 'y' is the current card

    t(r,(y==1 and"A"or y>10 and c[y-10]or y)..x) -- adds the card accompanied by the suit to the result ('r') table
      -- y==1 and"A"or y>10 and c[y-10]or y  means if we're at the first card, it's an "A", else if we're past the 10th card, it's a special card, else, it's the number itself

  end
end
for _=1,2 do t(r, "J")end -- loop 2 times, adding a "J" to the result table

Я просто хочу сказать, что я новичок в этом материале Code Golf, поэтому, если я делаю что-то не так, не стесняйтесь говорить мне. Я знаю, что этот ответ не один из самых маленьких, я просто хотел бросить вызов себе.

Если у вас есть предложения по сокращению моего кода, вы можете сказать тоже. :)

Visckmart
источник
1
Добро пожаловать на сайт!
Волшебник Пшеницы
@WW спасибо! Ха-ха: D
Visckmart
Что происходит со столом r? Либо вам нужно распечатать его в STDOUT, либо заменить его на функцию и вернутьсяr
Джо Кинг,
Я не специалист по Lua, но вот действительная анонимная функция
Джо Кинг,
138 байтов
Джо Кинг,
3

Perl 6 ,  43  42 байта

{|(|(2..10),|<A J Q K>X~ <S D H C>),|<J J>}

Попытайся

{|(|(^9+2),|<A J Q K>X~ <S D H C>),|<J J>}

Попробуйте это от Джо Кинга

Expanded:

{  # bare block lambda

    |(  # flatten into outer list

        |(  # flatten into left-side list for X~
          ^9 + 2
          # 0+2 ..^ 9+2
          #   2 ..^ 11
          #   2 ..  10
        ),
        |   # flatten into left-side list for X~

          < A J Q K >

      X~    # cross using &infix:« ~ » (string concatenation)

        <S D H C>

    ),
    |< J J > # flatten two `J`s into outer list
}
Брэд Гилберт b2gills
источник
41 байт
Джо Кинг
3

QBasic 4.5, 114 142 127 байтов

dim r$(54)
FOR i=1TO 52
m=i MOD 13
r$(i)=MID$("JQKA2345678910",1+m,1-(m=12))+MID$("CDHS",(i-1)\13+1,1)
NEXT
r$(53)="J
r$(54)="J

Примечания к выпуску:

  • V1.0 Начальное развертывание
  • V1.1 Неправильно истолкованы требования вызова, поэтому перешли на более дорогой массив r$. Весь остальной код практически одинаков.
  • V1.2 Предложения от @TaylorScott приводят к полной перезаписи, сохраняя 15 байтов!

Образец вывода

Если мы добавим этот фрагмент в наш код, мы увидим, что помещено в r$:

for i = 1 to ubound(r$)
?r$(i)
next

QC
KC
AC
2C
3C
4C
5C
6C
7C
8C
9C
10C
JC
QD
KD
AD
[... snip ...]
6S
7S
8S
9S
10S
JS
J
J

Но как? Ну, позвольте мне сказать вам:

dim r$(54)          ' create a 54-slot array for our results
FOR i=1TO 52        ' Loop through the numbers 1-52 in var i
m=i MOD 13          ' Take i mod 13 to select a value (saved as m)
                    ' , and (not saved) i intdiv 13 to get a suit
r$(i)=              ' assigns to slot i in the result array
  MID$("JQKA2345678910"  ' a substring from the string with all the values
  ,1+m                   ' from position 1-13 (13 % 13 = 0, but QBasic strings are 1-based.
                         ' Hence the + 1)
  ,1-(m=12))             ' taking 1 char by default, and 2 for the Ten
                         ' Note that m=12 evaluates to 0 for 0-11, and to -1 for 12
  + MID$("CDHS",(i-1)\13+1,1)  ' and take 1 char from the suits-string
NEXT
r$(53)="J           ' Then append 2 jokers
r$(54)="J           ' These strings are auto-closed by the QBasic compiler.
steenbergh
источник
Это не соответствует требованию «Массив строк», и печать в STDOUTявном виде запрещена
Тейлор Скотт
@TaylorScott Спасибо, что заметили. Исправлено сейчас, @ 30 байт дополнительно.
Стинберг
1
Я думаю , что вы должны быть в состоянии получить ByteCount вниз опуская a$и b$вары и используя линии что - то вродеr$(i)=MID$("JQKA2345678910",1+m,1-(m=12))+MID$("CDHS",(i-1)\13+1,1)
Taylor Scott
1
@TaylorScott Спасибо! Это перестановка в строке значений особенно умна. Ницца!
Стинберг
Это дольше, чем простоPRINT "<output>"
Торнадо547
3

Pyth, 26 25 байт

+ B\JsM*+tSTc"JQKA"1"CDHS

Сохраненный байт благодаря hakr14.
Попробуй здесь

объяснение

+ B\JsM*+tSTc"JQKA"1"CDHS
         tST                Get the range from 2 to 10...
        +   c"JQKA"1        ... plus the list ['J', 'Q', 'K', 'A'].
       *            "CDHS   Take the Cartesian product with the suits.
     sM                     Stick the ranks and suits together.
+ B\J                       Add the jokers.

источник
+\J+\Jи +*2]\Jэквивалентны и оба 6 байтов, но последний считается лучшей формой, поскольку он позволяет добавить до 10 копий, прежде чем потребуются дополнительные байты.
hakr14
@ hakr14 Верно, но я не увлекаюсь кодовым гольфом ради написания самого чистого или наиболее обобщаемого кода.
+\J+\Jможно заменить на, + B\Jчтобы сохранить байт.
hakr14