Створіть колоду карт


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").
  • Пишіть будь-якою мовою.
  • Гольф! Спробуйте створити цей вихід у найменшій кількості байтів.
  • Не має значення, в якому порядку знаходиться вихід.

2
@KevinCruijssen це правильно. Початкове запитання вказує числа 2 - 10 та масив рядків як вихід.
AJFaraday

15
Мені було просто цікаво, чи можна отримати 23456789, помноживши 2 менші числа ... тільки щоб виявити, що це просто!
матч

4
@match Оскільки порядок виходу не має значення, може бути , ви все ще можете створити його з меншими номерами, припинивши його 2або 4або що - небудь ще , так що це не просте більше.
Кевін Кройсейсен

5
Правила в коментарях не враховуються. Якщо ми не можемо надрукувати результат у STDOUT (і це велике значення, оскільки, оскільки він перекриває наші параметри за замовчуванням для вводу / виводу і не дозволяє мовам без функцій та рядкових масивів брати участь), це правило повинно бути чітко зазначено в специфікації виклику.
Денніс

7
Це не виключає рядкового подання такого масиву, який можна надрукувати в STDOUT. Якби не розділ коментарів, я б ніколи не здогадувався, що це заборонено.
Денніс

Відповіді:



24

Bash 43 34 байт

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

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



Я не вважав, що брекети є нестабільними. Спасибі.
glenn jackman

І тут я думав, "яку мову я знаю, що зручно прямувати продукти у списках рядків?" Я навіть не думав про старий добрий глобус!
aschepler

1
Технічно дуже розширення - це не глобальний зразок, це власний особливий синтаксис
glenn jackman

13

мозковий ебать , 200 197 байт

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

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

Використовується одна негативна комірка (+1 байт для виправлення), обгортаючи комірки (багато o 'байтів, щоб виправити) та 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

Ява 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
Розумний @mazzy Спасибі І вже редагував це, Олів'є. :)
Кевін Круїйсен

2
круто! Я вважаю, що можна видалити ще 2 байти - дужки у шаблоні. дивіться regex101.com/r/aDbz9C/1
mazzy

1
@mazzy О, навіть не знав, що $0це можливо на Java. TIL, спасибі :)
Кевін Кройсейсен

7

APL (Dyalog Unicode) , 29 байт

1 байт збережено завдяки Probie, використовуючи 1+⍳9замість1↓⍳10

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

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

Це повна програма. У посиланні TIO я включив бокс, щоб можна було розрізнити окремі елементи масиву.

Ось коробчастий вихід.

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

'JJ', 2 жартівника приєдналися до

, захопленої форми

∘.,⍨ матриця, створена шляхом об'єднання кожної комбінації

  • 'HCDS' цей рядок проти

  • 'AKJQ', цей рядок с

    • ⍕¨ рафіновані форми кожного з

      • 1+⍳9 числа 2..10 (1 плюс діапазон 1..9)

Я змінив відступ вашого списку в поясненні. З двома та трьома крапками це виглядало дещо дивно. Якщо це було призначено чомусь, сміливо відкатуйтесь.
Кевін Кройсейсен

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

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

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

enter image description here

Спочатку стек заповнюється 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


1
Це була моя точна відповідь, хоча я думаю, що я використав подвійні лапки замість одинарних лапок.
Джузеппе

Вибачте, я подвійно опублікував вашу відповідь? Я перевірив, але не знайшов жодної відповіді на R ...
digEmAll

О ні, я тільки що набрав все це в TIO, перш ніж побачити ваше :-)
Джузеппе

1
Так зовнішній, безумовно, шлях сюди! Хоча пробіл пропускається відповідно до специфікації, ви можете зберегти один байт за допомогою paste. @Giuseppe теж.
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

1
-3, використовуючи рядок для масиву для першої частини:2..10+'AJQK'[0..4]|%{"$_`H";"$_`S";"$_`D";"$_`C"};,'J'*2
colsw

1
круто! будь-яка ідея, як видалити `` ``?
маззи

1
наскільки я знаю, що це найдешевший спосіб розбити змінну в рядку, я роздивився цикл, але це на 2 символи дорожче, щоб зробити це таким чином.
colsw


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 байти, завдяки ов

Це досить ґрунтовна відповідь ...
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",/приєднати (скоротити скорочення) списку праворуч, використовуючи "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заяви для додавання джокерів.


Що станеться, якщо ви зробите другий аргумент для STRING_SPLIT порожнім рядком? Я не використовую MS-SQL, але в багатьох мовах це дасть вам усі символи в масиві.
AJFaraday

@AJFaraday Це було б зручно, але це не працює, ви отримуєте Procedure expects parameter 'separator' of type 'nchar(1)/nvarchar(1)'. Це також було б зручно для гри в гольф, якщо він за замовчуванням ставиться до коми, якщо ви вилучили другий параметр, але він також не підтримує це. Ще один предмет для GolfSQLмови, який я, мабуть, ніколи не
обійду

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-функції, але число рахунків було нижчим за допомогою циклу :(

Вихід (з використанням 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]буде коротше, ніж вибухнути?
Джо Кінг,

Ви абсолютно праві, візьмемо поради, дякую.
Франсіско Хан


2
@FranciscoHahn, вибач, я цього не помітив! Ось тоді версія 87 байт: Спробуйте в Інтернеті!
Ніч2

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


@EriktheOutgolfer Як ти це створив?
mbomb007

1
Я відкрив інструменти для розробників F12, вибрав текстове поле за допомогою наведення курсору, перейшов до консолі і, після того як я скопіював і вставив частину перед нульовим байтом, набрав $0.value+='\0'.
Erik the 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 bytes

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

Try it online!


1
'J';^:2,;&.>{_13<\'10';;/'23456789AJKQHCDS' slightly simpler but for 43. I feel like there's more to shave here... but I can't see how.
Jonah

@Jonah Yes, I also tried something similar and I'm sure my solution can be golfed further, but there are always new problems to be solved :)
Galen Ivanov

3

R, 67 66 bytes

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

Try it online!

Only one more byte than digEmAll's golfier solution. Inspired byGiuseppe's solution to this related challenge - the same Giuseppe who golfed one byte off by answer!

I'm posting separately since it's a slightly different approach taking advantage of the fact that 4 is not a divisor of 13 and that the output does not need to be in any particular order.


oh haha I didn't notice this, I commented this solution on the other one
Giuseppe

@Giuseppe I was very close to comment instead of posting myself. I guess I just couldn't resist the urge to answer :)
JayCe

iiiit's just as golfy as digemall's answer :-) try it online
Giuseppe

@I was just experimenting with that :) so both digemall and I can golf one byte thanks to you :)
JayCe

3

C (gcc), 126 137 133 bytes

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

Try it online!

+11 bytes to be more complete thanks to Jakob.

-4 bytes thanks to Zachary

Mostly abusing of preprocessor to compress the suits. Could probably be out-golfed, but is pretty efficient all things considered.


1
I would argue that c is not a "[...] weird 'function' [...]" but rather an array declaration stored in a macro. Such a form of output is to my knowledge not permitted by default.
Jonathan Frech

1
Except c is not an array, it would be an in-place literal. Each 'invokation' of c in the source will create a new copy of the array in the resulting executable (barring optimizations). Thus, the code char *a[] = c; char *b[] = c; create two deep copies of c. This behaviour is what you'd expect of a function as well.
LambdaBeta

1
If there was a challenge to output the integer zero, would you consider the C code c=0; a valid submission, viewing c as a function?
Jonathan Frech

1
no, but I would consider #define z 0 valid. The reasoning is that: c=0; c++; x=c; results in x == 1 so c doesn't act much like a function. Meanwhile #define z 0 c=z; c++; x=z; does result in x == 0 so z acts like a function.
LambdaBeta

1
I do not think that is a fair comparision as you first change the supposed function, then only change the supposed function's return value. z=0;/**/c=z;c++;x=z; results in x==0, thus z acts like a function.
Jonathan Frech

3

Javascript (ES6) 77 74 72 bytes

This is a complete program.

`J,J,${[..."A23456789JQK",10].map(c=>[..."SDHC"].map(s=>c+s))}`.split`,`

1
Nice. You can save a few bytes by splitting on commas instead of concatenating: BTJ,J,${[..."A23456789JQK","10"].map(c=>[..."SDHC"].map(s=>c+s))}BT.splitBT,BT (where BT is a backtick).
Rick Hitchcock

Awesome suggestion! Thanks.
MattH

3

C (gcc, clang), 138 bytes

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

Approach is to encode the sequences in character arrays.

Sample Output

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

Try it online!


Hint: you can use a single printf to get rid of all putchars.
Dennis


1
Regarding your method of output, the OP does not allow printing.
Jonathan Frech

Building on Jonathan Frech and Dennis 113 bytes
ceilingcat

3

Oracle SQL, 164 bytes

Not a golfing language but...

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

Try it online - SQL Fiddle


2
I love that someone answered this with Oracle SQL
AJFaraday

postgres nearly beats this with just a string 172 bytes, 'select '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''
dwana

@dwana That is not an array of strings (or, since this is SQL, a set of rows). You would need to split the string into rows (or columns) to meet the question's specifications. If you want to do that as a separate PostgreSQL solution then I would like to see that.
MT0

sorry, didn't see the array requirement
dwana

3

Lua, 156 127 138 129 bytes

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'

Try it online!

Based on Jo King's code. As he suggested in the comments, my original answer wasn't valid (I'm still learning how code golf works 😬), and linked a better and valid answer. Then I made it smaller.


Original solution (156 bytes):

r={}s="SDHC"c={"J","Q","K"}t=table.insert for x in s:gmatch"."do for y=1,13 do t(r,(y==1 and"A"or y>10 and c[y-10]or y)..x)end end for _=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

I just want to say that I'm new to this Code Golf stuff, so if I'm doing something wrong, feel free to tell me. I know this answer isn't one of the smallest, I just wanted to challenge myself.

If you have suggestions for reducing my code you can say too. :)


1
Welcome to the site!
Wheat Wizard

@WW thanks! Hahah :D
Visckmart

What happens with the table r? Either you need to print it to STDOUT, or change this to a function and return r
Jo King

I'm no expert with Lua, but here's a valid 142 byte anonymous function
Jo King


3

Perl 6,  43  42 bytes

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

Try it

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

Try it from Jo King

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
}


3

QBasic 4.5, 114 142 127 bytes

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

Release Notes:

  • V1.0 Initial deploy
  • V1.1 Misread the challenge requirements, so switched to a more expensive array r$. All the rest of the code is pretty much the same.
  • V1.2 Suggestions from @TaylorScott lead to a complete rewrite saving 15 bytes!

Sample output

If we add this snippet to our code, we can see what is put into 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

But how? Well, let me tell you:

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.

This does not meet the Array of strings requirement, and printing to STDOUT is explicitly forbidden
Taylor Scott

@TaylorScott Thanks for noticing. Fixed now, @ 30 bytes extra.
steenbergh

1
I think that you should be able to get the bytecount down by dropping the a$ and b$ vars and using a line something like r$(i)=MID$("JQKA2345678910",1+m,1-(m=12))+MID$("CDHS",(i-1)\13+1,1)
Taylor Scott

1
@TaylorScott Thanks! That reshuffling in the values-string is particularly clever. Nice!
steenbergh

This is longer than just PRINT "<output>"
Tornado547

3

Pyth, 26 25 bytes

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

Saved a byte thanks to hakr14.
Try it here

Explanation

+ 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 and +*2]\J are equivalent and both 6 bytes, but the latter is considered better form, as it allows for up to 10 copies to be added before any additional bytes are needed.
hakr14

@hakr14 True, but I'm not into code golf for the sake of writing the cleanest or most generalizable code.

+\J+\J can be replaced with + B\J to save a byte.
hakr14
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.