Einführung
Vor langer Zeit, als ich Kartenspiele mit gewöhnlichen Spielkarten codierte, gab ich für jede Karte eine Nummer an und rief eine Funktion mit einer Nummer auf, um eine Karte zu erhalten. Dies hat mich ein wenig dazu inspiriert, diese Herausforderung anzunehmen.
Für die Leute, die die Spielkarten nicht kennen, besteht ein Kartenspiel aus 52 Karten (13 in jeder der vier Farben, dh Herzen, Diamanten, Pik, Keulen). In jeder Farbe gibt es 13 Karten - zuerst die von 2-10 nummerierten Karten, dann den Buben (J), die Dame (Q), den König (K) und das Ass (A). Das ist die Reihenfolge
Herausforderung
Die Herausforderung besteht darin, eine ganze Zahl zwischen 1 und 52 als Eingabe zu verwenden und die Karte an dieser Position anzuzeigen. Ihre Ausgabe muss jedoch in Worten erfolgen. Außerdem muss die Reihenfolge eingehalten werden, dh, zuerst werden 13 Karten aus Herzen, dann aus Diamanten, dann aus Pik und schließlich aus Schlägern.
Zum Beispiel, wenn jemand die Nummer wählt. 30
Die Karte würde dann zu der dritten Farbe gehören, dh den Pik. Es wäre auch die vierte Karte in der Farbe, was die Zahl 5 bedeutet. Daher muss Ihre Ausgabe in Worten sein: five of spades
und es sollte immer diesem Format folgen , dh zuerst die Karte, gefolgt von einem of
und dem Namen der Farbe bei das Ende mit erforderlichen Abständen dazwischen.
Eingabe und Ausgabe
Die Eingabe wird eine ganze Zahl zwischen 1-52 (jeweils einschließlich). Beachten Sie, dass hier die Zählung bei 1 beginnt. Sie können bei 0 beginnen . Allerdings müssen Sie die Reihenfolge halten die Karten , die oben erwähnt wird. Ihre Ausgabe sollte die in Worten geschriebene Karte an dieser Position sein. Sie müssen keine ungültigen Eingaben verarbeiten. Die Ausgabe kann auch in Klein- oder Großbuchstaben erfolgen.
Da unten ist die Liste aller möglichen Eingänge und ihre Ausgänge:
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
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code.
quelle
two\s\s\sof\shearts
wo\s
ein Leerzeichen steht? (Beachten Sie die zwei zusätzlichen Leerzeichen.)Antworten:
Python 3 ,
115-90BytesEine unbenannte Funktion, die die Zeichenfolge in Großbuchstaben zurückgibt.
Probieren Sie es online!
Wie?
Unicode-Zeichen haben Namen. Die Namen einiger dieser Zeichen sind wie "ZWEI SPATEN SPIELEN", daher können wir die Zeichen des Unicode-Zeichens abrufen, das die erforderliche Karte darstellt, und die ersten 13 Zeichen entfernen, um unsere Ausgabe zu erhalten.
Die interessierenden Unicode-Zeichen befinden sich in einem Block wie folgt:
Wo
x
wir keine Charaktere suchen (die vier in derC
Spalte sind "Ritter"; drei inF
sind "Joker"; einer in0
ist generisch; der Rest sind reservierte Charaktere).Als solches können wir 0x1F0A1 = 127137 (As) mit einem Wert versehen, um die gewünschte Karte zu finden.
Der hinzuzufügende Wert wird nur durch drei Dinge erschwert:
Wenn Sie die Option "Ein-Index" verwenden, können Sie mithilfe der negativen Ganzzahldivision
[6,0,4,2][-n//13]*8+
(effektiv[48,0,32,16][-n//13]
) eine Reihe von zeilenweisen Offsets für die Nachbestellung der Farbe indizieren. Sie können dann auch die Asse an den richtigen Stellen mit platzierenn%13+
und dann die vermeiden Ritter in der SpalteC
mitn%13//11+
(effektiv(n%13>10)+
).quelle
Perl6 / Rakudo 70 Bytes
Index 0
Verwenden
perl6 -pe
und ohne Wörterbuchkomprimierung:Es sucht einfach die Karte in Unicode (beginnend mit dem Ass), fragt nach dem Namen und verwendet diesen. Dies ist eine ähnliche Route (obwohl ich es damals noch nicht wusste!) Zu Jonathan Aitkens Python-Antwort - nur ich indexiere aus allen 4 Assen anstatt aus 4 Offsets aus dem Pik-As und multipliziere mit 1,091, um den Index zu erhalten runden Sie den Knight-Eintrag in Unicode ab.
Alle Ausgaben anzeigen (für Eingabewerte von 0 bis 51) https://glot.io/snippets/ez5v2gkx83
Bearbeitet, um mit Knights im Unicode-Deck fertig zu werden, da Unicode.
Perl6 ♥ Unicode
quelle
05AB1E , 54 Bytes
0-indiziert
Probieren Sie es online!
Erläuterung
quelle
“»€Å‹ spadesž…“#"of "ì“‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿—ÉŸÄ‹ŒÁà“#âí»
- 54 Bytes auch!Python 2 ,
167148 BytesNullindexiert.
Probieren Sie es online!
BEARBEITEN: Bubbler hat mit der Aufteilungsmethode (und einer kürzeren Antwort) einen großartigen Punkt gemacht. Im zweiten Block liefert split () die gleiche Byteanzahl.
quelle
[n%13::13]
oder etwas zu verschachteln , aber kein Glück.s
; xnor hat im Chat darauf hingewiesen.R , 154 Bytes
Probieren Sie es online!
Nimmt die Eingabe (1-indiziert) von STDIN und
source(...,echo=T)
gibt das Ergebnis mit an die Konsole aus.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!R, 156 bytes
Try it online!
Essentially the same as above; however,
outer
will do the recycling properly, but having to setsep=" of "
for thepaste
made this just a hair longer.quelle
Emojicode, 202 bytes
0 indexed. Try it online!
Explanation:
quelle
Excel, 156 bytes
Cards from 0-51. Unfortunately, Excel does not feature a function to convert
1
to"one"
...Using
TRIM
andMID
is shorter than usingCHOOSE
for the face values, but longer than usingCHOOSE
for the Suit.quelle
MID()
and combining the words!Java 8, 141 bytes
Input is 0-indexed.
Explanation:
Try it online.
quelle
Kotlin,
154152140 bytesTry it online!
Updated to use just lambda expression.
quelle
JavaScript ES6,
124118 Bytes, 0-indexBase64 version
quelle
Stax,
585756 bytesRun and debug it
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.
Run this one
quelle
Bash, 133 bytes
Choosing to use 0 based as per the option given, supporting 0 (two of hearts) through 51 (ace of clubs)
quelle
Husk, 52 bytes
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:The program then is:
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 usingw
the type inferencer guesses another interpretation for the program, producing a different result.quelle
mIRCScript, 157 bytes
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.quelle
C (gcc), 148 bytes
Try it online!
0-based.
quelle
\0
with literal null bytes.Haskell, 132 bytes
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.
quelle
F#,
174168 bytesRemoved some extra whitespace as noted by Manish Kundu. Thanks!
Try it online!
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.
quelle
Octave,
155153151150 bytesTry 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: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.quelle
V,
154147144142 Bytes-7 Bytes thanks to DJMcMayhem
Try it online!
Hexdump:
quelle
« == \+
2)12dj == 13D
ò
? I triedò13j0Pò
instead of4ñ13j0Pñ
, but that didn't terminateP
adds new lines? Also, are you sure you need the0
in that part? It seems to me like it would probably work without0
is unnecessaryC#,
219207202197 bytes (0 indexed)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.
quelle
i++
can be removed completely. By converting the function to a lambda I got it down to 178 bytes.using
-Statement. Anyway +1 from me."of"
in the array.PowerShell,
207192182174165163161157 bytes0-Indexed
Try it online!
4 bytes saved thanks to AdmBorkBork in the comments
quelle
-split
on whitespace to save 6 bytes-split'two three four five six seven eight nine ten jack queen king ace'
and another byte using inline replace instead of floor$_/13-replace'\..*'
CJam, 114 bytes
Try it online!
Zero-indexed. Will probably be beaten by languages with dictionary compression, but oh well...
quelle
Jelly, 61 bytes
0-indexing. Try it online!
quelle
“...“...»Ḳ€¤Œpị@j“ of
is probably shorter.Julia 0.6, 156 bytes
Try it online!
-2 bytes thanks to @Stewie Griffin
quelle
Haskell, 144 bytes
Try it online!
This hits all kinds of Haskell's pain points.
quelle
SOGL V0.12, 53 bytes
Try it Here!
quelle
Javascript
149143140 bytes-3 bits thanks to @rick hitchcock
quelle
[_/13|0]
. For example:["hearts","diamonds","spades","clubs"][_/13|0]
a=
since your function isn't recursive.Perl 5
-p
, 119 bytes0-based
Try it online!
quelle
Japt,
9186 bytes0-indexed.
I used a tool written by @Shaggy to generate the compressed lists.
Try it online!
Explanation:
The first compressed string contains the card values delimited by
d
. The second compressed string contains the card ranks delimited byk
.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 usingq
, 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.quelle
Jelly,
5855 bytesTry it online!
quelle