Wprowadzenie
Dawno temu, kiedy kodowałem gry karciane zwykłymi kartami do gry, podawałem liczbę dla każdej karty i wywoływałem funkcję z pewnym numerem, aby uzyskać kartę. To nieco zainspirowało mnie do podjęcia tego wyzwania.
Tak więc dla osób nieświadomych kart do gry, talia kart składa się z 52 kart (13 w każdym z czterech kolorów, tj. Kier, Diamentów, Pik, Maczug). W każdym kolorze jest 13 kart - najpierw karty ponumerowane od 2 do 10, następnie walet (J), królowa (Q), król (K) i as (A). To jest zamówienie
Wyzwanie
Wyzwanie polega na przyjęciu liczby całkowitej od 1 do 52 jako wartości wejściowej i wyświetleniu karty w tej pozycji. Ale twój wynik musi być w słowach. Ponadto należy zachować porządek, tzn. Pierwsze 13 kart będzie kier, następnie karo, następnie pik i wreszcie trefl.
Na przykład, jeśli ktoś wybierze numer 30
. Karta należałaby wówczas do trzeciego koloru, tj. Pik. Byłaby to także czwarta karta w kolorze, co oznacza liczbę 5. Stąd wynik musi być następujący: five of spades
i zawsze powinien być zgodny z tym formatem , tj. Najpierw karta, po której następuje of
i nazwa koloru w koniec z wymaganymi odstępami pomiędzy.
Wejście i wyjście
Dane wejściowe będą liczbami całkowitymi od 1 do 52 (oba włącznie). Pamiętaj, że tutaj liczenie zaczyna się od 1. Możesz zacząć od 0 . Należy jednak zachować kolejność kart wymienionych powyżej. Twój wynik powinien być kartą w tej pozycji zapisaną słowami. Nie musisz obsługiwać nieprawidłowych danych wejściowych. Ponadto dane wyjściowe mogą być pisane małymi lub dużymi literami.
Poniżej znajduje się lista wszystkich możliwych danych wejściowych i ich wyników:
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
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod.
źródło
two\s\s\sof\shearts
gdzie\s
oznacza miejsce? (Zwróć uwagę na dwie dodatkowe spacje).Odpowiedzi:
Python 3 ,
11590 bajtówNienazwana funkcja zwracająca ciąg znaków wielkimi literami.
Wypróbuj online!
W jaki sposób?
Znaki Unicode mają nazwy. Nazwy niektórych z nich przypominają „GRA W KARTĘ DWIE SPADY”, dlatego możemy uzyskać znaki postaci Unicode reprezentujące wymaganą kartę i usunąć 13 pierwszych znaków, aby uzyskać wynik.
Interesujące znaki Unicode znajdują się w bloku, takim jak:
Gdzie
x
nie jesteśmy znakami, których szukamy (cztery wC
kolumnie to „rycerze”; trzy wF
to „żarty”; jeden w0
jest ogólny, reszta to znaki zastrzeżone).W związku z tym możemy dodać pewną wartość do 0x1F0A1 = 127137 (As), aby znaleźć kartę, którą chcemy.
Wartość dodaną komplikują tylko trzy rzeczy:
Użycie opcji z jednym indeksowaniem pozwala na zastosowanie ujemnego podziału na liczby całkowite w celu indeksowania do tablicy przesunięć wierszy w celu ponownego uporządkowania koloru za pomocą
[6,0,4,2][-n//13]*8+
(skutecznie[48,0,32,16][-n//13]
), możemy również umieścić asy we właściwych lokalizacjach za pomocą,n%13+
a następnie uniknąć rycerze w kolumnieC
zn%13//11+
(skutecznie(n%13>10)+
).źródło
Perl6 / Rakudo 70 bajtów
Indeks 0
Używanie
perl6 -pe
i bez kompresji słownika:Po prostu wyszukuje kartę w Unicode (zaczynając od asa), prosi o nazwę i używa jej. Jest to podobna trasa (chociaż wtedy nie znałem!) Do odpowiedzi Pythona Jonathana Aitkena - tylko indeksuję ze wszystkich 4 asów, a nie 4 odsunięcia od asa pik, i mnożę przez 1,091, aby zrobić indeks zaokrąglić od wpisu rycerza w Unicode.
Zobacz wszystkie dane wyjściowe (dla wartości wejściowych od 0 do 51) https://glot.io/snippets/ez5v2gkx83
Edytowane, aby radzić sobie z Rycerzami w talii Unicode, ponieważ Unicode.
Perl6 ♥ Unicode
źródło
05AB1E , 54 bajty
0-indeksowane
Wypróbuj online!
Wyjaśnienie
źródło
“»€Å‹ spadesž…“#"of "ì“‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿—ÉŸÄ‹ŒÁà“#âí»
- 54 bajty też!Python 2 ,
167148 bajtówZero indeksowane.
Wypróbuj online!
EDYCJA: Bubbler bardzo się przydał, stosując metodę podziału (i udzielając krótszej odpowiedzi). W drugim bloku użycie split () daje taką samą liczbę bajtów.
źródło
[n%13::13]
lub coś takiego, ale bez powodzenia.s
; xnor wskazał to na czacie.R , 154 bajtów
Wypróbuj online!
Pobiera dane wejściowe (1 indeksowane) ze STDIN i za pomocą
source(...,echo=T)
wypisze wynik na konsolę.To nie jest ładne, ALE jest o 2 bajty krótsze niż najlepsze rozwiązanie, jakie mogłem zastosować
outer
(przedstawione poniżej), więc niech to będzie przypomnienie, aby przeanalizować inne podejście!R , 156 bajtów
Wypróbuj online!
Zasadniczo takie same jak powyżej; Jednak
outer
zrobi recykling właściwie, ale trzeba ustawićsep=" of "
na to,paste
że to tylko włosy dłużej.źródło
Emojicode , 202 bajty
0 zindeksowanych. Wypróbuj online!
Objaśnienie :
źródło
Excel, 156 bajtów
Karty od 0-51. Niestety, Excel nie ma funkcji do konwersji
1
na"one"
...Używanie
TRIM
iMID
jest krótsze niż używanieCHOOSE
dla wartości nominalnych, ale dłuższe niż używanieCHOOSE
dla koloru.źródło
MID()
łączeniem słów!Java 8, 141 bajtów
Wejście jest indeksowane na 0.
Wyjaśnienie:
Wypróbuj online.
źródło
Kotlin ,
154152140 bajtówWypróbuj online!
Zaktualizowano, aby używał tylko wyrażenia lambda.
źródło
JavaScript ES6,
124118 bajtów, 0-indeksWersja Base64
źródło
Stax ,
585756 bajtówUruchom i debuguj
Oto skomentowana niegolfowana reprezentacja tego samego programu. Używa mocno skompresowanych literałów Stax. Dane wejściowe mają indeks 0. To algorytm 05AB1E Emigny.
Uruchom ten
źródło
Bash, 133 bajty
Wybór użycia 0 w oparciu o podaną opcję, wspieranie 0 (dwóch kier) do 51 (asa trefl)
źródło
Łuska , 52 bajty
Wypróbuj online!
Zawsze chętnie pokazuję system kompresji struny Husk: D
Wyjaśnienie
Większość programu (od
¨
początku) jest oczywiście skompresowanym łańcuchem. Po rozpakowaniu zmienia się w:Program to:
Pozostało jeszcze kilka rzeczy do wyjaśnienia:
Karty budujemy z kolorami przed wartościami ze względu na działanie produktu kartezjańskiego
Π
: jeśli zrobilibyśmy to na odwrót, lista kart byłaby uporządkowana według wartości (tj. Dwa serca, dwa karo, dwa pik, dwa trefl, trzy serca ...). W konsekwencji musimy odwrócić nasz wynik.Wynikiem programu jest dwuwymiarowa macierz ciągów znaków. Jest to automatycznie drukowane przez Husk jako pojedynczy ciąg zbudowany przez połączenie rzędów matrycy ze znakami nowej linii i komórek ze spacjami. Powodem, dla którego budujemy tę matrycę zamiast korzystania z prostszych metod
w
(łączenie listy słów ze spacjami) jest to, że użyciew
inferencji typu domyślnie zgaduje inną interpretację programu, co daje inny wynik.źródło
mIRCScript , 157 bajtów
Obciążenie jako alias, a następnie użyć:
/c N
. mIRC ma indeks 1, więc podział podłogi (//) na ujemną wartość wejściową daje -1 do -4 zgodnie z wymaganiami.źródło
C (gcc) , 148 bajtów
Wypróbuj online!
W oparciu o 0.
źródło
\0
literał bajtami zerowymi.Haskell , 132 bajty
Wypróbuj online!
Anonimowa funkcja, wykorzystująca rozumienie listy do zbudowania wszystkich kombinacji koloru i wartości oraz indeksująca do wynikowej listy za pomocą danych wejściowych.
źródło
F #
174168 bajtówUsunięto dodatkowe białe znaki, jak zauważył Manish Kundu. Dzięki!
Wypróbuj online!
Będę szczery - jestem nowy w golfie kodu, więc nie wiem, czy lepiej jest odpowiedzieć za pomocą czystej funkcji takiej jak ta (z parametrami, ale bez we / wy) lub z działającym blokiem kodu z użytkownikiem I / O.
źródło
Oktawa ,
155153151150 bajtówWypróbuj online!
To tworzy ciąg rozpoczynający się
' of '
i's'
, wtedy wszystkie garnitury przestrzegane przez wszystkich szeregach. Ciąg ten jest dzielony przecinkami na osobne ciągi. Kolorami są przed szeregami, ponieważ to oszczędza bajt podczas tworzenia indeksów. Następnie indeksujemy go za pomocą nawiasów kwadratowych o następujących indeksach:czyli ranga, pierwszy element
' of '
, następnie kolor, a następnie's'
.Mając
's'
jako część garnitury (hearts,diamonds,spades,clubs
) zamiast osobnego łańcucha to dokładnie ta sama długość, ale mniej radości.Podział na domyślny separator
pozwoliłby zaoszczędzić 4 bajty w
strsplit
wywołaniu -c, ale spacje wokół' of '
zostałyby usunięte i trzeba by je dodać ręcznie, co kosztuje więcej bajtów.źródło
V ,
154147144142 bajtów-7 bajtów dzięki DJMcMayhem
Wypróbuj online!
Hexdump:
źródło
« == \+
2)12dj == 13D
ò
? Próbowałemò13j0Pò
zamiast4ñ13j0Pñ
, ale to nie zakończyło sięP
dodaje nowe linie? Czy na pewno potrzebujesz0
tej części? Wydaje mi się, że prawdopodobnie działałoby bez0
to nie jest konieczneC # ,
219207202197 bajtów (0 indeksowanych)dzięki wkładowi @Ciaran_McCarthy i @raznagul
Pobiera dane wejściowe z int I, odejmuje 1, aby dopasować 0 indeksowania tablicy ciągów i wypisuje liczbę na podstawie I mod 13 oraz koloru na podstawie i / 14 + 13.
działa całkiem dobrze na moim drugim kodzie golfowym, tylko zastanawiam się, czy mogę go skrócić za pomocą LINQ lub czegoś innego.
źródło
i++
można je całkowicie usunąć. Konwertując funkcję na lambda, zmniejszyłem ją do 178 bajtów .using
"of"
w tablicy.PowerShell ,
207192182174165163163157 157 bajtówIndeksowane 0
Wypróbuj online!
4 bajty zapisane dzięki AdmBorkBork w komentarzach
źródło
-split
na białych znakach, aby zaoszczędzić 6 bajtów-split'two three four five six seven eight nine ten jack queen king ace'
i kolejny bajt za pomocą zastępowania zamiast$_/13-replace'\..*'
CJam , 114 bajtów
Wypróbuj online!
Zero indeksowane. Prawdopodobnie zostaną pokonane przez języki z kompresją słownikową, ale no cóż ...
źródło
Galaretka , 61 bajtów
Indeksowanie 0. Wypróbuj online!
źródło
“...“...»Ḳ€¤Œpị@j“ of
jest prawdopodobnie krótszy.Julia 0.6 , 156 bajtów
Wypróbuj online!
-2 bajty dzięki @Stewie Griffin
źródło
Haskell , 144 bajty
Wypróbuj online!
Uderza to we wszystkie punkty bólu Haskella.
źródło
SOGL V0.12 , 53 bajty
Wypróbuj tutaj!
źródło
Javascript
149143140 bajtów-3 bity dzięki @rick hitchcock
źródło
[_/13|0]
. Na przykład:["hearts","diamonds","spades","clubs"][_/13|0]
a=
ponieważ twoja funkcja nie jest rekurencyjna.Perl 5
-p
, 119 bajtówW oparciu o 0
Wypróbuj online!
źródło
Japt ,
9186 bajtów0-indeksowane.
Użyłem narzędzia napisanego przez @Shaggy do wygenerowania skompresowanych list.
Wypróbuj online!
Wyjaśnienie:
Pierwszy skompresowany ciąg zawiera wartości kart ograniczone przez
d
. Drugi skompresowany ciąg zawiera szeregi kart ograniczone przezk
.Te znaki zostały wybrane przy użyciu narzędzia Shaggy, który generuje ciąg rozdzielany znakiem, który jest optymalnie skompresowany przy użyciu shoco (kompresja, której używa Japt). To pozwala nam stworzyć listę wartości kart i rang.
Używamy wstecznych
`
znaków do dekompresji tych ciągów, a następnie dzielimy ciąg za pomocąq
, a następnie znak char, aby podzielić.Kiedy mamy listy, mapujemy wartości kart, a następnie otrzymujemy indeks danych wejściowych. Należy zauważyć, że Japt zawija swoje indeksy, więc nie musimy modulo o 13.
Przy każdym elemencie przeglądamy szeregi kart. Otrzymujemy indeks dzieląc dane wejściowe przez 13.
Kiedy już mamy oba przedmioty, łączymy je
" of "
, co daje końcowy ciąg.źródło
Galaretka ,
5855 bajtówWypróbuj online!
źródło