[Question]
  [
# Introduction
Long ago, when I used to code card games with usual playing cards, I used to specify a number for each card and call a function with some number to get a card. This somewhat inspired me to make this challenge. 
So for the people unaware of the playing cards, a deck of cards consist of 52 cards (13 in each of the four suits, i.e, Hearts, Diamonds, Spades, Clubs). In each suit, there are 13 cards - firstly the cards numbered from 2-10, then the Jack(J), Queen(Q), King(K) and the Ace(A). This is the order
# Challenge
The challenge is to take an integer between 1-52 as input and display the card at that position. But, your output must be in words. Also, order must be maintained, i.e, first 13 cards will be of Hearts, then Diamonds, then Spades and finally Clubs.
For example, if someone chooses the number `30`.The card would then belong to the third suit, i.e, the Spades. Also, it would be the fourth card in the suit, which means the number 5. Hence your output in words must be: `five of spades` and it should **always follow this format**, i.e, first the card, followed by an `of` and the name of the suit at the end, with required spaces in between.
# Input And Output
**The input will be** **an integer** between 1-52 (both inclusive). Note that here counting starts from 1. **You may choose to start from 0**. However, **you must maintain the order** of the cards which is mentioned above. Your output should be the card at that position written in words. You do not need to handle invalid inputs. Also, your output may be in lower-case or in upper-case. 
Given below is the list of all the possible inputs and their outputs:
```
1 -> two of hearts
2 -> three of hearts
3 -> four of hearts
4 -> five of hearts
5 -> six of hearts
6 -> seven of hearts
7 -> eight of hearts
8 -> nine of hearts
9 -> ten of hearts
10 -> jack of hearts
11 -> queen of hearts
12 -> king of hearts
13 -> ace of hearts
14 -> two of diamonds
15 -> three of diamonds
16 -> four of diamonds
17 -> five of diamonds
18 -> six of diamonds
19 -> seven of diamonds
20 -> eight of diamonds
21 -> nine of diamonds
22 -> ten of diamonds
23 -> jack of diamonds
24 -> queen of diamonds
25 -> king of diamonds
26 -> ace of diamonds
27 -> two of spades
28 -> three of spades
29 -> four of spades
30 -> five of spades
31 -> six of spades
32 -> seven of spades
33 -> eight of spades
34 -> nine of spades
35 -> ten of spades
36 -> jack of spades
37 -> queen of spades
38 -> king of spades
39 -> ace of spades
40 -> two of clubs
41 -> three of clubs
42 -> four of clubs
43 -> five of clubs
44 -> six of clubs
45 -> seven of clubs
46 -> eight of clubs
47 -> nine of clubs
48 -> ten of clubs
49 -> jack of clubs
50 -> queen of clubs
51 -> king of clubs
52 -> ace of clubs
```
# Scoring
This is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'"), so the shortest code wins.
  
[Answer]
# [Python 3](https://docs.python.org/3/), ~~115~~ 90 bytes
```
from unicodedata import*
lambda n:name(chr(n%13+n%13//11+[6,0,4,2][-n//13]*8+127137))[13:]
```
An unnamed function returning the string in uppercase.
**[Try it online!](https://tio.run/##HYlBDoIwEADP8oq9GFoowaUqhkQ/ghwqtNDEbkmtB19fxcskM7N@4uJJJnO9p6dyj0kBdaScZuMSGO1RlhvqGrHsz@IgjqIZ@op@QQ7FpcSmRdly3qPshswE7@BNdvSTnlRUYN3qQyyS8QGifkWwBEHRrBmKk@RdtluDpci2JyCvbrkA8zfO0xc "Python 3 ‚Äì Try It Online")**
### How?
Unicode characters have names. The names of some of these are like "PLAYING CARD TWO OF SPADES", hence we can get the characters of the Unicode character representing the required card and strip off the first 13 characters to get our output.
The Unicode characters of interest are within a block like so:
```
            0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
U+1F0Ax     x   As  2s  3s  4s  5s  6s  7s  8s  9s  Ts  Js  x   Qs  Ks  x
U+1F0Bx     x   Ah  2h  3h  4h  5h  6h  7h  8h  9h  Th  Jh  x   Qh  Kh  x
U+1F0Cx     x   Ad  2d  3d  4d  5d  6d  7d  8d  9d  Td  Jd  x   Qd  Kd  x
U+1F0Dx     x   Ac  2c  3c  4c  5c  6c  7c  8c  9c  Tc  Jc  x   Qc  Kc  x                           
```
Where the `x` are not characters we are after (the four in the `C` column are "knights"; three in `F` are "jokers"; one in `0` is generic; the rest are reserved characters).
As such we can add *some* value to 0x1F0A1 = 127137 (As) to find the card we want.
The value to add is only complicated by three things:
1. We need to reorder the suits (from s,h,d,c to h,d,s,c)
2. We need to reorder the ranks from (A,2,...,K to 2,...,K,A)
3. We need to avoid the columns without cards of interest.
Using the one-indexing option allows the use of negative integer division to index into an array of row-wise offsets for the suit re-ordering with `[6,0,4,2][-n//13]*8+` (effectively `[48,0,32,16][-n//13]`), we can then also place the aces into the correct locations with `n%13+` and then avoid the knights in column `C` with `n%13//11+` (effectively `(n%13>10)+`).
[Answer]
# [Perl6/Rakudo](https://perl6.org/) 70 bytes
Index 0
Using `perl6 -pe`, and with no dictionary compression:
```
chr('üÇ±üÉÅüÇ°üÉë'.ords[$_/13]+($_+1)%13*1.091).uniname.substr(13)
```
It just looks up the card in Unicode (starting from the Ace), asks for the name and uses that. This is a similar route (though I didn't know it at the time!) to [Jonathan Aitken's Python answer](https://codegolf.stackexchange.com/a/158092/14710) - only I index from all 4 aces rather than 4 offsets from the Ace of Spades, and I multiply by 1.091 to make the index round away from the Knight entry in Unicode. 
See all the output (for input values 0 to 51) <https://glot.io/snippets/ez5v2gkx83>
Edited to cope with Knights in the Unicode deck, because Unicode.
Perl6 ‚ô• Unicode
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), 54 bytes
0-indexed
```
‚Äú¬ª‚Ç¨√Ö‚Äπ¬°≈†des≈æ‚Ä¶‚Äú#‚Äú‚Äö‚Ä¢‚Äû√≠‚Ä†√¨ÀÜ√à≈í≈°√Ø¬ø≈∏¬Ø¬•≈†‚Äî¬ø‚Äî√â≈∏√Ñ‚Äπ≈í√Å√†‚Äú#√¢√≠" of "√Ωs√®
```
[Try it online!](https://tio.run/##FYwxCsJQEAWvEpILqOiBFGNrkQtsREXbYCUiPwElRULaiGhgH1t5i3eR708x0wzMZLFcTVPvKTd9c9fgQHlpaW6dZvalPENIApQrpaLc0VIcmt8RJyusRKeD9drpwxzlokMQztZjHz5WIIcbD6jQxtF2E8X4ZKi9n83/ "05AB1E ‚Äì Try It Online")
**Explanation**
```
‚Äú¬ª‚Ç¨√Ö‚Äπ¬°≈†des≈æ‚Ä¶‚Äú#                                          # push list of suits
              ‚Äú‚Äö‚Ä¢‚Äû√≠‚Ä†√¨ÀÜ√à≈í≈°√Ø¬ø≈∏¬Ø¬•≈†‚Äî¬ø‚Äî√â≈∏√Ñ‚Äπ≈í√Å√†‚Äú#             # push list of ranks
                                           √¢            # cartesian product
                                            √≠           # reverse each
                                             " of "√Ω    # join on " of "
                                                    s√®  # index into cardlist with input
```
[Answer]
# [Emojicode](http://www.emojicode.org/), 202 bytes
```
üçáiüöÇüòÄüç™üç∫üêΩüî´üî§two.three.four.five.six.seven.eight.nine.ten.jack.queen.king.aceüî§üî§.üî§üöÆi 13üî§ of üî§üç∫üêΩüî´üî§hearts.diamonds.spades.clubsüî§üî§.üî§‚ûói 13üç™üçâ
```
0 indexed. [Try it online!](https://tio.run/##VY9BbsIwEEX3nGJOMCpUHMg4EzIBbIgd2mVhU2VR0QUSKAu8QUi0ogeoxGVyAt8gtRN1weJr/rc0f/xooXOWOqHWu90GvPt4H0Acl7RUso2Zvau33h3fQvgK@vXu8@7d/jvobF802qwgwlSXBaa8JjT8iobWpJB4mllUrAhtiLmQM1yVFOyM1RSFpNgRhb2pfxiGz9GDTqF/ezyYkSiswYTFQqvEoFmKhAzKeTkxD2XN6dB3dZ@u2ki13wJDs7vCE4xH/7Ad7g0iL3APXw26lT8 "Emojicode ‚Äì Try It Online")
**Explanation**:
```
üçá		start of the closure block
  iüöÇ		 closure takes an integer argument i
  üòÄ		 print:
    üç™		  concatenate these strings:
      üç∫üêΩüî´üî§...üî§üî§.üî§üöÆi 13  [a]
      üî§ of üî§
      üç∫üêΩüî´üî§...üî§üî§.üî§‚ûói 13  [b]
    üç™
üçâ
[a]:
üç∫		tell Emojicode to dereference without checking
üêΩ		 get the nth element of the following array
  üî´		  create an array using the following string and separator
    üî§...üî§
    üî§.üî§
  üöÆ i 13	n, i mod 13
[b]
üç∫üêΩüî´üî§...üî§üî§.üî§‚ûói 13
same but with ‚åäi√∑13‚åã
```
[Answer]
# [Python 2](https://docs.python.org/2/), 167 148 bytes
```
n=input();print 'two three four five six seven eight nine ten jack queen king ace'.split()[n%13]+' of '+['hearts','diamonds','spades','clubs'][n/13]
```
Zero-indexed.
[Try It Online!](https://tio.run/##FcwxDsIwDIXhq3hBBhWBgIEBcZKoQ2jdxrQ4IXEKnD6k2/cP74WfOi/nUuTOErJud7cQWRRQPx7URSIYfI4w8EKQ@AuJFhIgHp2CsBBozaftJnhnqpxYRrAd4SGFmeuhkc3p0jYIfgBsDDqyURPusWf78tKvTMH2tKKb8yNha@RYN6Vc/w)
EDIT:
Bubbler made a great point using the split method (and providing a shorter answer). On the second block using split() yields the same byte count.
[Answer]
# [R](https://www.r-project.org/), 154 bytes
```
paste(el(strsplit("Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King,Ace",",")),"of",rep(c("Hearts","Diamonds","Spades","Clubs"),e=13))[scan()]
```
[Try it online!](https://tio.run/##FcixCsIwFIXhd8mUwB0szg6iFlEQpN3EIU2v7cU0CTdp1aePKWf5zs/ZUseaf3LCNPo@qhx0TCjRypg4BktJivbjoR0ZEWo/M9S0IDT0hQYXdHCiYUxwI4fQlnvR5g33GQuv5AbYGxRQphQI/xLAGKSR4oyaUyz9SHryrl/ZBN3jioOduygU4K7aKvWIRjupnrna5D8 "R ‚Äì Try It Online")
Takes input (1-indexed) from STDIN and with `source(...,echo=T)` will print the result to console.
It's not pretty, BUT it comes in 2 bytes shorter than the best solution I could using `outer` (presented below), so let this be a reminder to examine another approach!
```
paste(                          # concatenate together, separating by spaces,
                                # and recycling each arg to match the length of the longest
el(strsplit("Two,...",",")),    # split on commas and take the first element
"of",                           # 
 rep(c("Hearts",...),           # replicate the suits (shorter as a vector than using strsplit
               e=13)            # each 13 times
                    )[scan()]   # and take the input'th index.
```
# [R](https://www.r-project.org/), 156 bytes
```
outer(el(strsplit("Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King,Ace",",")),c("Hearts","Diamonds","Spades","Clubs"),paste,sep=" of ")[scan()]
```
[Try it online!](https://tio.run/##FcdBCsIwEEDRq5SsEpiFHsCFqEUUBGl34iJtx3YwTUImqXr6mPI374dsqAs6/OSMcXIDq@xSxCDRSI6BvaEoRftx0E4BEWqXAtS0IDT0hQYXtHCicYpwI4vQlr3o/g33hIVXsiPsexRQUgp6Kc6oQ@SyR9Kzs8PKxusBVxxM6lgo8JojAqPficq9KqEe3Gsr1TNvN/kP "R ‚Äì Try It Online")
Essentially the same as above; however, `outer` will do the recycling properly, but having to set `sep=" of "` for the `paste` made this just a hair longer.
[Answer]
## Excel, 156 bytes
```
=TRIM(MID("two  threefour five six  seveneightnine ten  jack queenking ace",1+MOD(A1,13)*5,5))&" of "&CHOOSE(1+(A1/13),"hearts","diamonds","spades","clubs")
```
Cards from 0-51. Unfortunately, Excel does not feature a function to convert `1` to `"one"`...
Using `TRIM` and `MID` is shorter than using `CHOOSE` for the face values, but longer than using `CHOOSE` for the Suit.
[Answer]
# Java 8, 141 bytes
```
n->"two;three;four;five;six;seven;eight;nine;ten;jack;queen;king;ace".split(";")[n%13]+" of "+"hearts;diamonds;spades;clubs".split(";")[n/13]
```
Input is 0-indexed.
**Explanation:**
[Try it online.](https://tio.run/##VVDLasNADLz3K8RCwcbEfdFL1PQPmkuPIYeNLcfyQ@t6Zbel5NtdNcmlIAk9GDQzjZ/9KgwkTdkuRedjhDfP8nMDwKI0Vr4g2P6NAO86shyhSOwCkqItT5YWUb1yAVsQ2MAiq1ennwG1HomwCtOIFc@Ekb8w0kyCxMdaUVgI1cbGFy1@TGRtax/Qfro8Dh1r4tClO7l9eNpnDkIFLnM1@VEjluz7IGXEOPiSIhbddIj/YXcGW/BCcZgOnVG8Mp0Dl9Cb0OQiarf36UVkFcazPt7cI/DL86PVLEvPN7PgOyr1eZg0HwynnSScubXRktx8Sa@mnJZf)
```
n->         // Method with integer parameter and String return-type
  "two;three;four;five;six;seven;eight;nine;ten;jack;queen;king;ace".split(";")[n%13]
            //  Take `n` modulo-13 as 0-indexed card value
   +" of "  //  append " of "
   +"hearts;diamonds;spades;clubs".split(";")[n/13]
            //  append `n` integer-divided by 13 as 0-indexed suit
```
[Answer]
# [Husk](https://github.com/barbuz/Husk), 52 bytes
```
;‚Üî!Œ†mw¬∂¬®√ó‚Äºs√ø·∫ãŒ¥·∫é‚ÇÜ·π°‚Å∑·∏Ç6‚Ä∞fœâŒ∏¬ª&‚åàŒ∏∆íV‚ÇÜx‚Åµ‚ñº√ãƒ°`nƒ±E·πÖ'jƒäk‚Å∏"e√Øk√Ñc
```
[Try it online!](https://tio.run/##AW4Akf9odXNr//874oaUIc6gbXfCtsKow5figLxzw7/huovOtOG6juKChuG5oeKBt@G4gjbigLBmz4nOuMK7JuKMiM64xpJW4oKGeOKBteKWvMOLxKFgbsSxReG5hSdqxIpr4oG4ImXDr2vDhGP///81MQ "Husk ‚Äì Try It Online")
I'm always happy to show off Husk's string compression system :D
### Explanation
The majority of the program (from `¬®` onwards) is obviously a compressed string. When uncompressed it turns into:
```
hearts diamonds spades clubs
of
two three four five six seven eight nine ten jack queen king ace
```
The program then is:
```
;‚Üî!Œ†mw¬∂¬®‚Ä¶
       ¬®‚Ä¶    The previous string
      ¬∂      Split on lines
    mw       Split each line into words
             - we now have a list of lists of words
   Œ†         Cartesian product of the three lists
             - with this we obtain all possible combinations of suits and values
               with "of" between the two (e.g. ["spades","of","king"])
  !          Pick the combination at the index corresponding to the input
 ‚Üî           Reverse it, so words are in the correct order
;            Wrap it in a list. Result: [["king","of","spades"]]
```
There are a couple of things left to explain:
* We build the cards with suits before values because of how the cartesian product `Œ†` works: if we did it the other way around, the list of cards would be ordered by value (i.e. two of hearts, two of diamonds, two of spades, two of clubs, three of hearts...). As a consequence, we have to reverse our result.
* The result of the program is a two-dimensional matrix of strings. This is automatically printed by Husk as a single string built by joining rows of the matrix with newlines and cells with spaces. The reason we build this matrix instead of using the more straightforward `w` (join a list of words with spaces) is that if using `w` the type inferencer guesses another interpretation for the program, producing a different result.
[Answer]
# [Kotlin](https://kotlinlang.org), ~~154~~ ~~152~~ 140 bytes
```
i->"two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace".split(',')[i%13]+" of ${"heart,diamond,spade,club".split(',')[i/13]}s"
```
[Try it online!](https://tio.run/##VY3NTsQwDITvfQorWrSJcPkVl5XonTNHxCG0SWuadUriFqSqz14CnBjJkkfj@TxGCcS7nxnOllgvNtnUQ5l8gmdJxL2BtYIiHxNoAmK4gZmFAjzcmd/kR1M5lcBaHQjqBg6r12Q2ZaqtWmwAf9JPLKZu/piP6051o@QzogzJOfRxTuhpcZjpC7NbHKOjfhBkYodS7LttR/yYXVnHgkDbOnWVp0Cij3g0L3Rxe/96qSD68l0NzibBjuw5cod5sp3DNsxv/yvXpbJltW/7Nw "Kotlin ‚Äì Try It Online")
Updated to use just lambda expression.
[Answer]
# JavaScript ES6, ~~124~~ 118 Bytes, 0-index
```
F= x=>(h=btoa`O
?N√û{√±h¬∫¬ø√Ö√∑¬øJ,I√´√û√±"6)√û√Ω7¬ß√º√¥.y√©√ø*)√†√º√ø√ø√ø√¶¬´¬∑√∑bjj'w√ª)i√ó¬ør[`.split`/`)[x%13]+` of ${h[x/13|16]}s`
console.log (F(51))
```
Base64 version
```
eD0+KGg9YnRvYWBPCj9OGt578Wi6v8WK979KLH9J696f8SKCG382Kd79N6f8lpyT9C556f8qKeD8Bx7///+F5qu392Jqaid3+ylp179yW5tgLnNwbGl0YC9gKVt4JTEzXStgIG9mICR7aFt4LzEzfDE2XX1zYA==
```
[Answer]
# [Stax](https://github.com/tomtheisen/stax), 58 57 56 [bytes](https://github.com/tomtheisen/stax/blob/master/docs/packed.md#packed-stax)
```
√Æ‚Üë√†‚ñ†?R‚ï¢8¬´E‚ñÑ¬°‚ïî√ø‚Ä¢L‚ï´<<‚å†√Ø‚àû‚àü‚å°‚ô™√ñs1"T√†LŒ±‚ï•‚ñÄ¬¢¬°‚óÑ‚îî%‚âàŒ¥√±M;;}'‚ñëo=‚å°¬ª‚ï¨√≠‚àö
```
[Run and debug it](https://staxlang.xyz/#p=8c1885fe3f52b638ae45dcadc998074cd73c3cf48bec1cf50d9973312254854ce0d2df9bad11c025f7eba44d3b3b7d27b06f3df5afcea1fb&i=0%0A1%0A2%0A3%0A4%0A5%0A6%0A7%0A8%0A9%0A10%0A11%0A12%0A13%0A26%0A39&a=1&m=2)
Here's the commented ungolfed representation of the same program. It uses stax's compressed literals heavily. The input is 0-indexed. It's Emigna's 05AB1E algorithm.
```
`SsUI'S~pTU5T@T^Ez+`j   suits
`fV:l7eTkQtL*L2!CZb6u[&YNO4>cNHn;9(`j   ranks
|*  cross-product
@   index with input
r   reverse pair
`%+(`*  join with " of "
```
[Run this one](https://staxlang.xyz/#c=%60SsUI%27S%7EpTU5T%40T%5EEz%2B%60j%09suits%0A%60fV%3Al7eTkQtL*L2%21CZb6u[%26YNO4%3EcNHn%3B9%28%60j%09ranks%0A%7C*%09cross-product%0A%40+%09index+with+input%0Ar%09reverse+pair%0A%60%25%2B%28%60*%09join+with+%22+of+%22&i=0%0A1%0A2%0A3%0A4%0A5%0A6%0A7%0A8%0A9%0A10%0A11%0A12%0A13%0A26%0A39&a=1&m=2)
[Answer]
## [mIRCScript](https://www.mirc.com/), 157 bytes
```
c echo $token(ace two three four five six seven eight nine ten jack queen king,$calc(1+$1% 13),32) of $token(clubs spades diamonds hearts,$calc(-$1// 13),32)
```
Load as an alias, then use: `/c N`. mIRC is 1-indexed, so floor division (//) on the negative value of the input produces -1 to -4 as required.
[Answer]
# [C (gcc)](https://gcc.gnu.org/), 148 bytes
```
f(n){printf("%.5s of %.7ss","two\0 threefour\0five\0six\0 seveneightnine\0ten\0 jack\0queenking\0ace"+n%13*5,"heart\0 diamondspade\0 club"+n/13*7);}
```
[Try it online!](https://tio.run/##PY5BTsMwEEXXySlGliLZJC0uKOoiwEm8Mc44MW3Hqe0UpKpnD8OGzXzp/TfSd7vJuW3zktR9SYGKl6LZ9xmih2Z/zFl0onxHo6HMCdHHNRntww2NzuGHccYbEoZpLhSIaUFi@mXdyejrikinQJPR1qFoqTm8PvWdmNGmwtYY7CXSmBc78ie48/rJ0jNLRzU8Nl4DFxtIqvpeVz4mkH8owDvogeMN@hfOtlV1Vf2PH2H3AaLjvoWD6sDLwHdZS5ZCqKF@bL8 "C (gcc) ‚Äì Try It Online")
0-based.
[Answer]
# [Haskell](https://www.haskell.org/), 132 bytes
```
(!!)[v++" of "++s|s<-words"hearts diamonds spades clubs",v<-words"two three four five six seven eight nine ten jack queen king ace"]
```
[Try it online!](https://tio.run/##NcoxEoIwEEbhq/xkLHSQwsJOTmGpFmvYQCQmmE3AwrMbaezeN/MGkpGdK6a9lm1V7S5zXSsEA1XX8pFTs4TYiRqYYhJ0lp7BdwKZqGOBdvkuaj//t7QEpCEyw4QcYezMEPuG8MwebPshwVvPSCsfpEe8Mq85Wt@DNKtbeZL1aDHldE4RGxgcD@WrjaNeSqOn6Qc "Haskell ‚Äì Try It Online")
An anonymous function, using list comprehension to build all the combinations of suit and value, and indexing into the resulting list with the input.
[Answer]
# F#, 174 168 bytes
Removed some extra whitespace as noted by Manish Kundu. Thanks!
```
let c x=["two";"three";"four";"five";"six";"seven";"eight";"nine";"ten";"jack";"queen";"king";"ace"].[(x-1)%13]+" of "+["hearts";"diamonds";"spades";"clubs"].[(x-1)/13]
```
[Try it online!](https://tio.run/##PZCxbsMwDER3fwUhIECCIHHSolPqbB0LZDc8qBJts7GlhJJd9@tdSkMXPfJ4B0pqw8F4xnX0dhoQPjW5G/uO9QjVCgNGMLBUtYo/Xl1U7BlR2PqJE2hOXaAlnTijEyJ1fRQ6cmkYs/itzV3wnDC3d3KdQBtUzbHeLofzbnN@bfYKfAtqX6seNccgFkt69M6mMjy0xVSYYfoK/8FSgmsB9fuHi/x78@TitSny1Ud5DWjuZqiggCxRJfOsHeuT2ODBIsjSTVCwNUC7QsQTlCUwxokl70Ac2CEDLiT/4S2uxfr28gc)
I'll be honest - I'm new at code golf, so I don't know if it's more appropriate to answer with a pure function like this (with parameters, but no I/O) or with a working code block with user I/O.
[Answer]
# [Octave](https://www.gnu.org/software/octave/), ~~155~~ ~~153~~ ~~151~~ 150 bytes
```
@(x)[strsplit(' of ,s,heart,diamond,spade,club,ace,two,three,four,five,six,seven,eight,nine,ten,jack,queen,king',','){[mod(x,13)+7,1,ceil(2+x/13),2]}]
```
[Try it online!](https://tio.run/##DYrtCoIwGIVvxX9ueLA0IggC70P8seY7Xelm@zAjunYbhwPPeThWBrHSrm5lWe4N23jrg/PLpAPLM6syeIwkXECvxWxND7@IniCneIeQhPC2CKMjgrLRQemV4PUGTysZkB7GAKNNOqb5EPKJV6SET22GHCn82862ZxuqEy8uqCBJT6wutkMSqLtft7fCOfFR0bCGGa5SUV3PNfJochx5t/8B "Octave ‚Äì Try It Online")
This creates a string starting with `' of '` and `'s'`, then all the suits followed by all the ranks. This string is split at commas into separate strings. The suits are before the ranks, because since that saves a byte when creating the indices. After this, we index it using square brackets with the following indices:
```
{[mod(x,13)+7,1,ceil(2+x/13),2]}
```
which is the rank, followed by the first element `' of '`, followed by the suit, followed by `'s'`.
Having the `'s'` as part of the suits (`hearts,diamonds,spades,clubs`) instead of a separate string is the exact same length but less fun.
Splitting on the default separator  would save 4 bytes in the `strsplit`-call, but the spaces around `' of '` would be removed and would have to be added manually, costing more bytes.
[Answer]
# [V](https://github.com/DJMcMayhem/V), 154 147 144 142 Bytes
-7 Bytes thanks to DJMcMayhem
```
13i1heart
2diamond
3spade
4club
√öGxCtwo
three
four
five
six
seven
eight
nine
ten
jack
queen
king
aceH$A of 012j$d4√±13jP√±√ç ¬´/ 
{√ÄjYHVGpAs
```
[Try it online!](https://tio.run/##Fc6xEYIwGIbh/huAhiYFvQZYgLPA0so7ywg/kKAJkoDc2biAC7iCFSuYwRC79@necVl4InlDoneISymuRpdIbCdKQlpchjNC/w7yaefuBq7piVCZoUclR4KVEyyNpEGybhy01AS3UomixW2gNVupa4iCwmAfZcxULNwGPFZRmfqZJ@rgZ/9i38@G4eGf6rQ/5l1ml//WDw "V ‚Äì Try It Online")
Hexdump:
```
00000000: 3133 6931 6865 6172 740a 3264 6961 6d6f  13i1heart.2diamo
00000010: 6e64 0a33 7370 6164 650a 3463 6c75 620a  nd.3spade.4club.
00000020: 1bda 1647 7843 7477 6f0a 7468 7265 650a  ...GxCtwo.three.
00000030: 666f 7572 0a66 6976 650a 7369 780a 7365  four.five.six.se
00000040: 7665 6e0a 6569 6768 740a 6e69 6e65 0a74  ven.eight.nine.t
00000050: 656e 0a6a 6163 6b0a 7175 6565 6e0a 6b69  en.jack.queen.ki
00000060: 6e67 0a61 6365 1b16 4824 4120 6f66 201b  ng.ace..H$A of .
00000070: 3016 3132 6a24 6434 f131 336a 50f1 cd20  0.12j$d4.13jP.. 
00000080: ab2f 200a 7bc0 6a59 4856 4770 4173       ./ .{.jYHVGpAs
```
[Answer]
# [C#](https://docs.microsoft.com/en-us/dotnet/csharp/), 219 207 202 197 bytes (0 indexed)
```
static string O(int i){string[]s={"two","three","four","five","six","seven","eight","nine","ten","jack","queen","king","ace","hearts","diamonds","spades","clubs"};return s[i%13]+" of "+s[i/14+13];}
```
thanks to input from @Ciaran\_McCarthy and @raznagul
Takes an input of int I, subtracts 1 to match 0 indexing of the string array and outputs the number based on I mod 13 and the suit based on i/14+13.
works pretty well for my second code golf, just wondering if i could get it shorter using LINQ or something else.
[Answer]
# [PowerShell](https://github.com/TryItOnline/TioSetup/wiki/Powershell), 207 192 182 174 165 163 161 157 bytes
# 0-Indexed
```
$args|%{(-split'two three four five six seven eight nine ten jack queen king ace')[$_%13]+' of '+('hearts','diamonds','spades','clubs')[$_/13-replace'\..*']}
```
[Try it online!](https://tio.run/##HcxBDoIwEIXhq8wCMiiCIcTTKDEVBlqpbe0UMFHPXsHd9y/ec3Yhz5K0jjERfuBP@s4KdloFDIuFID0R9Hby0KuZgNULmGYyQGqQAYwyBGHNu2hHeE60clRmANES7s7JNa3qJkewPWCeoSThA@MBOyUe1nQb2YmONrR6uvF/dKzqwpPT28mlLPfYfGOMp@oH "PowerShell ‚Äì Try It Online")
*4 bytes saved thanks to AdmBorkBork in the comments*
[Answer]
# [dc](https://www.gnu.org/software/bc/manual/dc-1.05/html_mono/dc.html), ~~161~~ ~~160~~ ~~158~~ 142 bytes
```
[TWO][THREE][FOUR][FIVE][SIX][SEVEN][EIGHT][NINE][TEN][JACK][QUEEN][KING][ACE][HEART][DIAMOND][SPADE][CLUB][z2-:rz1<A]dsAxD~;rP[ OF ]PD+;rP83P
```
[Try it online!](https://tio.run/##FYyxDsIwDER/pTtioDAgYDGJ25hCEkpSkCxP9AvKgjrw68FdTnfvTje@y64unJ5BOLkeUbgJuVelQf2DXio4oBdGal0S9uS1SAu5gOmE7xmX0JFvhcFo6RB6XVqCW/BWDyJYxeaaz8JzvT5M8@YEMn7ga3/HKXIVmkqiXanfb2Mpfw "dc ‚Äì Try It Online")
Over a year later, I was looking for something in my old golfs and found 16 bytes of inefficiency in the previous code:
```
[ACE][KING][QUEEN][JACK][TEN][NINE][EIGHT][SEVEN][SIX][FIVE][FOUR][THREE][TWO]0[d1+si:rlidD>A]dsAxr[CLUB]3:s[SPADE]2:s[DIAMOND]1:s[HEART]0:sD~;rP[ OF ]P;sP83P
```
[Try that chunkier version online!](https://tio.run/##FYq9DoIwFEZfhd2FHwcDicmVXqCibYUWTW7uZBcSJ7o4@eq1bOd85/PveCwjQYtMo1Q908MhKqYrtCOT3VFJlSrKfrBMMy77NssXUyeXFDrtpvQcJkxin5pz8sUhrPX2Wb04A/sA343am7twVQeaDQjkMpGQcNdKcJF4QJgs53UQv2YzlOkuY9MEc6pMjH8 "dc ‚Äì Try It Online")
Top of stack used as input. 0-indexed.
In the old version, the array of ranks (`r`) was created using an iterator to run through the strings on the stack (`0[d1+si:rlidD>A]dsAxr`), but with only four items, it's shorter to manually assign the suits (`3:s`, etc.). The new version simply uses one array for all of it and also doesn't check against a fixed stack size. `[z2-:rz1<A]dsAx` replaces the above stack-crawler, popping everything into `r` at the position `(stack depth)-2`; it stops when there's one value left.
After all that setup is done, we divide by 13 leaving remainder & quotient on stack (`D~`). In the old version, we used these values to pick from the two arrays. In the new version, without a separate array of suits, we add 14 (`E+`) to the suit value, since our suits are after our ranks in array `r`. Print the strings, and print `OF` in the middle (`;rP[ OF ]PE+;rP`).
(First two golfs: -1 byte by outputting uppercase; this allows me to remove the 4 `s`es from the end of the suits, and instead print it via its ASCII value with the 3-byte `83P` at the end. -2 bytes because I repeatedly misread the challenge as requiring 1-indexing. Now 0-indexed.)
[Answer]
# [CJam](https://sourceforge.net/p/cjam), 114 bytes
```
riDmd"two three four five six seven eight nine ten jack queen king ace"S/=" of "@"hearts diamonds spades clubs"S/=
```
[Try it online!](https://tio.run/##FcrREcIgEEXRVt7QgBU444cdWMEKj7CJgLIQ7Z7Ev3tmrl8lz9n0noPr34qeGolYR0PUnTD9wbizgLqkjqKF6CdX8Rs@g2duWhaIp3tcrg41wt1corRuCCq5lmCwtwQa/Gs87f/NeQA "CJam ‚Äì Try It Online")
Zero-indexed. Will probably be beaten by languages with dictionary compression, but oh well...
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 61 bytes
```
d13U·ªã"‚Äú¬¢¬∂/C≈ª)G·ª•+·∏∂}ƒã< Ç·∏§a·ª¥¬£k7·ª¥‚Ç¨^·∏•√¶]¬ø9·ª§‚Äú¬°¬¢|h·∏Ç·πó∆¨√üƒñ,$√∞ƒø»ß¬ª·∏≤‚Ç¨¬§j‚Äú of 
```
0-indexing. [Try it online!](https://tio.run/##AXsAhP9qZWxsef//ZDEzVeG7iyLigJzCosK2L0PFuylH4bulK@G4tn3EizzKguG4pGHhu7TCo2s34bu04oKsXuG4pcOmXcK/OeG7pOKAnMKhwqJ8aOG4guG5l8asw5/Eliwkw7DEv8inwrvhuLLigqzCpGrigJwgb2Yg////NTE "Jelly ‚Äì Try It Online")
[Answer]
# [Julia 0.6](http://julialang.org/), 156 bytes
```
f(n)=print(split(" of ,hearts,diamonds,spades,clubs,two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace",',')[[(n-1)%13+6,1,div(n-1,13)+2]]...)
```
[Try it online!](https://tio.run/##Fc1LDoIwFEbhrRgSQxt@SSoJM1dCGFS4hQvYYh/o7ivOzjc6S9pYtzkbYeVj92yjCPvGURQXZy6YSfsYMLJ@OTsGhF2PFDBs6RkQPw5x9kQwLnkYPgiBvwh0kAXxNEdYtoR4ctHDineiM1e2E/RABUqUsuuEvSl5VU3VQp2r42@oRlb3vq/rWub8Aw "Julia 0.6 ‚Äì Try It Online")
-2 bytes thanks to @Stewie Griffin
[Answer]
# [Haskell](https://www.haskell.org/), 144 bytes
```
f n=words"two three four five six seven eight nine ten jack queen king ace"!!(n`mod`13)++" of "++words"hearts diamonds spades clubs"!!(n`div`13)
```
[Try it online!](https://tio.run/##JYwxEoIwFAWv8shY6KTRseYGdl6ASH5IBH4wPwFvH3Hodotdb2SkaarVgdstJisqbxHZJyK4WBJcWAkSvhBaiUFh8BkcmJB3fZt@xKfQjmPgAaYn1TRn7uZou9v9orVCdFBaH3NPJmWBDWaObAWyGEuCfiovOUIb1n9YZxMYLZaSnzk9GCc4XOsP "Haskell ‚Äì Try It Online")
This hits all kinds of Haskell's pain points.
[Answer]
# [SOGL V0.12](https://github.com/dzaima/SOGLOnline), 53 [bytes](https://github.com/dzaima/SOGL/blob/master/chartable.md)
```
ƒ∑Œ∂‚â°‚óÑŒ§≈´‚îåp9P7≈°H‚ñ°‚â°‚Öù'‚ïóŒ¶qŒñ‚ñí∆®M.‚ÄòŒ∏.wo"C‚ñà}y1+‚ñ∫ŒöqŒö‚ÄòŒ∏J¬º o.'‚Å∞/wp
```
[Try it Here!](https://dzaima.github.io/SOGLOnline/?code=JXUwMTM3JXUwM0I2JXUyMjYxJXUyNUM0JXUwM0E0JXUwMTZCJXUyNTBDcDlQNyV1MDE2MUgldTI1QTEldTIyNjEldTIxNUQlMjcldTI1NTcldTAzQTZxJXUwMzk2JXUyNTkyJXUwMUE4TS4ldTIwMTgldTAzQjgud28lMjJDJXUyNTg4JTdEeTErJXUyNUJBJXUwMzlBcSV1MDM5QSV1MjAxOCV1MDNCOEolQkMlMjBvLiUyNyV1MjA3MC93cA__,inputs=MTM_,v=0.12)
[Answer]
## Javascript ~~149~~ ~~143~~ 140 bytes
```
a=_=>"two three four five six seven eight nine ten jack queen king ace".split` `[_%13]+' of '+["hearts","diamonds","spades","clubs"][_/13|0]
```
*-3 bits thanks to [@rick hitchcock](https://codegolf.stackexchange.com/users/42260/rick-hitchcock)*
```
a=_=>"two three four five six seven eight nine ten jack queen king ace".split` `[_%13]+' of '+["hearts","diamonds","spades","clubs"][_/13|0]
console.log(a(14))
console.log(a(34))
console.log(a(51))
console.log(a(8))
console.log(a(24))
```
[Answer]
# [Perl 5](https://www.perl.org/) `-p`, 119 bytes
0-based
```
$_=(TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE)[$_%13].' OF '.(HEART,DIAMOND,SPADE,CLUB)[$_/13].S
```
[Try it online!](https://tio.run/##FcrBCoJAFEbhV3FhaPBnhLhsMY5X52bNlDNaEOGqRRAp1fM36e4c@Mb7@5l5H/bb2J0NnGqIUJq2QckdwfIFljrSIK6Ug2ZNcNPuhKxxamnKmnUFIWl5DfvFJr0lUWDKIEpiRaJxKFgcjC5gj6IgyH2bz3A9Q@t9mv2G8fsYXh@/Gv8 "Perl 5 ‚Äì Try It Online")
[Answer]
# [Japt](https://github.com/ETHproductions/japt), ~~91~~ 86 bytes
0-indexed.
I used a [tool written by @Shaggy](https://codegolf.stackexchange.com/a/142629/61613) to generate the compressed lists.
```
`{`twod√à(‚f√Üfiv√Ä¬£x√ß P ightd√ç√Çd√àˆjackdqu√Å√àkˆg¬ª¬≠`qd gU} è {`√ä#tsk¬πa√öˆ√§i√Ç¬£kclubs`qk gUzD
```
[Try it online!](https://tio.run/##AXcAiP9qYXB0//9ge2B0d29kw4gowoJmw4YHZml2w4DCo3jDpyBQIGlnaHRkw43DgmTDiMKIamFja2RxdcOBw4hrwohnwrvCrWBxZCBnVX0gwo8ge2DDiiN0c2vCuWHDmsKIw6Rpw4LCo2tjbHVic2BxayBnVXpE//81MQ "Japt ‚Äì Try It Online")
## Explanation:
The first compressed string contains the card values delimited by `d`. The second compressed string contains the card ranks delimited by `k`.
These chars were picked using Shaggy's tool, which generates a string delimited by a char that is optimally compressed using shoco (the compression that Japt uses). This allows us to create a list of card values and ranks.
We use backticks ``` to decompress these strings, then we split the string using `q`, followed by the char to split on.
Once we have the lists, we map through the card values, then we get the index of the input. It is important to note that Japt wraps its indexes, so we don't have to modulo by 13.
At each item, we loop through the card ranks. We get the index by dividing the input by 13.
Once we have both items, we concatenate them with `" of "`, which produces the final string.
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), ~~58~~ 55 bytes
```
‚Äúƒ±ƒø‚ÅΩ‚Å∑lg3e/‚Äú·∫è‚Äú¬£·π¢¬¢√∑y·∏ä‚Åæ‚Å∂∆≠‚Åº·∫é·∫á·∏Ñ·π°¬øOn·πÉ‚Å∂·∏Ç·∏Çf·π†»Æ‚Åª·∫â√ë%¬ª·∏≤‚Ç¨p/‚Å∏·ªã·πöj‚Äú of 
```
[Try it online!](https://tio.run/##AYUAev9qZWxsef//4oCcxLHEv@KBveKBt2xnM2Uv4oCc4bqP4oCcwqPhuaLCosO3eeG4iuKBvuKBtsat4oG84bqO4bqH4biE4bmhwr9PbuG5g@KBtuG4guG4gmbhuaDIruKBu@G6icORJcK74biy4oKscC/igbjhu4vhuZpq4oCcIG9mIP///zUy "Jelly ‚Äì Try It Online")
]