Gracze tradycyjnej gry planszowej Go mierzą swoje umiejętności w systemie rang :
- Gracze nowi w grze zajmują 30. pozycję w kyū (napisane
30k
), a postępy odliczają do 1. kyū (napisane1k
). Są one uważane za stopnie studenckie . - Gracz może awansować od 1. kyū do 1. stopnia dan (napisany
1d
), a następnie postępować licząc do 7. stopnia dan (pisemny7d
). To są stopnie mistrzowskie . - Wyjątkowo wykwalifikowani gracze z przeszłości
7d
mogą awansować do 1. stopnia profesjonalnego dana1p
, a postępy liczą do 9. stopnia profesjonalnego dana (pisemnie9p
). To najwyższa ranga.
W skrócie: szeregi są uporządkowane 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
Zadanie
Biorąc pod uwagę między dwa ciągi { 30k
, ..., 1k
, 1d
, ..., 7d
, 1p
, ..., 9p
} jako wejście, wyjście wyższa ranga dwóch. (Jeśli są równe, po prostu wyślij jedno z wejść.)
(Jak zwykle I / O jest elastyczny - twoją odpowiedzią może być funkcja lub pełny program, odczytując dane wejściowe w dowolny rozsądny sposób i generując dane wyjściowe w każdy rozsądny sposób).
To jest golf golfowy : celem jest zminimalizowanie liczby bajtów kodu.
Przypadki testowe
(Format:. input1 input2 output
)
29k 9k 9k
21k 27k 21k
6d 1p 1p
5d 17k 5d
1k 1d 1d
1d 1d 1d
1d 2d 2d
9p 1d 9p
2d 30k 2d
1p 1k 1p
1d 1p 1p
1p 2d 1p
7p 8p 8p
30k 30k 30k
4 k
albo4K
albo tak, albo.)30k
,29k
,1k
,1d
et cetera, więc nie pozwoli tam żadnych zmian.Odpowiedzi:
JavaScript (ES7), 58 bajtów
Bierze dwa ciągi w składni curry
(a)(b)
.Wypróbuj online!
W jaki sposób?
Funkcja pomocnicza g () przekształca ciąg wejściowy s na wynik.
1) Szukamy s [1] w ciągu „_dp” . To daje:
2) Kostkujemy ten wynik, który pozostawia 1 i -1 bez zmian, ale daje 8 dla profesjonalnej rangi dan .
3) Mnożymy przez dziesiętną część rangi.
źródło
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Galaretka , 14 bajtów
Link monadyczny akceptujący listę ciągów * (jak opisano), który daje najwyższą znalezioną pozycję.
* Działa również z liczbami innymi niż dwa.
Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
Sortuje według funkcji klucza i zwraca wartość najbardziej na prawo (tj. Maksimum).
Litery , i mają odpowiednio rzędne , i . W binarnym ma ustawiony osiem bitów, podczas gdy inne nie, dlatego bitowe OR-y z 8 otrzymujemy odpowiednio 107, 108 i 120 - są one teraz w kolejności wymaganej do sortowania klas, które identyfikują.d p 107 100 112 107k re p 107 100 112 107
Rangi amatorskie są w kolejności malejącej, więc aby wypełnić naszą kluczową funkcję, moglibyśmy połączyć nasz identyfikator klasy z liczbą podaną w ciągu, negując, czy łańcuch skończy się na (np. -> while -> ). W kodzie wymaga to przechowywania identyfikatora klasy i potęgowania minus jeden dla mnożenia - - czyli bajtów.16k 16
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Aby to poprawić, możemy zamiast tego użyć minus dwa i pomnożyć elementy razem, co można osiągnąć za pomocą jednego pomnożenia.
Tabela akcji funkcji klucza ...
źródło
2^8=256
, czyli ASCII, afaik. Czy nie potrzebujesz więcej niż jednego bajtu do przechowywania znaków Unicode?Galaretka ,
1110 bajtówZainspirowany, aby wrócić do deski kreślarskiej Arnaulda!
Link monadyczny akceptujący listę ciągów * (jak opisano), który daje najwyższą znalezioną pozycję.
Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
Sortuje według funkcji klucza i zwraca wartość najbardziej na prawo (tj. Maksimum).
Funkcja klucza najpierw zmienia dowolne k, aby stać się N za pomocą atomu diadadowego
y
, tłumaczyć z dwuznakową listą⁾kN
(kod Jelly dla['k','N']
), a następnie ocenia ciąg jako monadę z argumentem dziewięciu (przy użyciu koduv9
).W galarecie:
N
jest monadycznym atomem, który neguje swój wkład9 30N
faktycznie nie używa dziewiątki i daje liczbę całkowitą-30
d
jest dyadowym atomem, który daje wynik divmod Pythona o dwóch wartościach - para wyników dzielenia liczb całkowitych i modulo9 7d
skutkuje sparowaniem z co oznacza[0,7]
p
jest dyadowym atomem, który wykonuje iloczyn kartezjański, który obejmuje ukryty indeks 1-indeksowy jego danych wejściowych9 p3
zwraca iloczyn kartezjański[1,2,3]
i[1,2,3,4,5,6,7,8,9]
który jest[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
Po przeprowadzeniu takich ocen przy użyciu porównywanych ciągów musimy móc porównać wyniki; ponieważ ints nie są porównywalne z listami, musimy zawinąć negowane wartości w listę, ale ponieważ porządkowanie nadal będzie działać po
p
spłaszczeniu list (np.[[1,1],[1,2],...]
->[1,1,1,2]
), możemy użyć jednobajtowego atomu monadycznegoF
zastosowanego do wszystkich ocen.Tabela danych wejściowych do ich klucz-wartość jest następująca:
Komentarz do kodu:
źródło
MATL ,
30282523 bajtówWypróbuj online!
(-2 bajty dzięki Luis Mendo)
(inny -3 bajtów, zastępując
v&X>
w>
tym razem w oparciu o odpowiedź Luis Mendo'S)(-2 bajtów wykorzystaniem
&)
składni)Wyjaśnienie:
Odejmij „k” od ostatniego znaku (daje odpowiednio n = -7, 0, 5 dla „d”, „k”, „p”).
Oblicz v = n ^ 2 + 6n-1 (daje odpowiednio 7, -1, 54).
Pomnóż tę wartość v przez rzeczywistą liczbę rang (więc k poziomów dostaje produkty ujemne, d poziomów wynosi od 7 do 49, p poziomów od 54 i więcej).
Zrób to dla obu ciągów wejściowych, porównaj produkty
Uzyskaj ciąg wejściowy odpowiadający większemu produktowi
Alternatywna, bardziej prosta metoda:
23 bajty
Wypróbuj online!
źródło
Haskell ,
7371 bajtówWypróbuj online!
Jak zwykle dla mnie, po prostu prosta implementacja, a nie coś szczególnie golfowego. Funkcja „(#)” przyjmuje dwa szeregi jako ciągi znaków i zwraca większy. Działa tylko z formatem dokładnie określonym w pytaniu.
(Próbowałem również wersję użyciu
comparing
imaximumBy
ale skończyło się 3 bajty dłużej - do cholerybase
! Sporadycznie i swoje ludzkie nazwy funkcji czytelny)(Zastosowane sugestie Amphibological i Lynn)
źródło
True
na1<2
.(-x)
może być0-x
.r(x,_)=x+7
!0-x
może być również `-x`)Python 2 , 54 bajty
Wypróbuj online!
Korzystanie z metody Arnaulda . Odwzorowanie
int(x,27)%9-3
zależy tylko od ostatniej literyx
, ponieważ wszystkie cyfry oprócz ostatniej stanowią wielokrotność9
. To zajmuje:Jest to ledwie wystarczający margines, aby mnożnik
1p
mógł pokonać7d
, najwyższą rangę dan, gdy jest interpretowany w bazie 26.Znalazłem to poprzez brutalne wymuszanie wyrażeń tej formy i kilku innych.
Python 2 , 64 bajty
Wypróbuj online!
źródło
R , 73 bajty
Wypróbuj online!
as.double
zamiast tego,strtoi
ponieważ ten ostatni nie obsługuje spacji / punktów i nie mogłem wymyślić innej ważnej postaci do zastąpieniad
rank
zamiastorder
, ponieważ są one równe, gdy są tylko dwa elementyźródło
L
zamiast,.
ale to też nie działa ... poinformuje cię, czy mogę znaleźć coś innego.Galaretka , 13 bajtów
Jest to zupełnie inna od mojej drugiej odpowiedzi Jelly , więc piszę to osobno.
Pobiera dane wejściowe jako listę dwóch (lub więcej) ciągów.
Wypróbuj online!
Skomentował
źródło
Julia 0,7
10093 bajtówNie jest to najskuteczniejszy sposób ( odpowiedź Julia 0.6 z kontrastu @ sundar ), ale jest fajny, ponieważ ma charakter czysto numeryczny. Używa także wysyłki (choć niestety tylko raz)
Bardzo podobny kod działa w wersji 0.6 Wypróbuj online
W jaki sposób:
Sztuczka polega na
!(z)
funkcji.Odwzorowuje wartość UTF-8:
k
liczbę ujemną, więc sortuje się do tyłud
liczbę dodatniąp
do większej liczby dodatniejJak pokazano:
Wyniki testu
źródło
.~[a,b]
to możliwe! Przy okazji, myślę, że możesz zastąpić collect (r)[r...]
i zapisać kilka bajtów.Int[r...]
zamiastInt([r...])
zaoszczędzić jeszcze kilka. Dziękiargmax
goindmax
) również w Julii 0.6. Możesz dołączyć Wypróbuj online! link, jeśli chcesz.Haskell , 64 bajty
Wypróbuj online!
Wyrażenie
gcd(fromEnum c)28-3
odwzorowuje znak na mnożnikChodziło o to, by wziąć ich wartości postaci
[107,100,112]
i wybrać28
z nimi coraz więcej wspólnych czynników, co było łatwe, ale pierwsza z nich była pierwsza. Ta metoda pozwala zaoszczędzić 2 bajty na jawnym zapisaniu mapowania .Wbudowany
reads
służy do oddzielania liczby i rangi.(W rzeczywistości bezpośrednie rozdzielenie od Sary J jest o jeden bajt krótsze, co daje 63 bajty .)
Krok jeden większy zajmuje w moim rozwiązaniu irytującą liczbę bajtów. Próbowałem innych podejść, takich jak iteracja po stopniach w malejącej kolejności i wybranie pierwszego, który jest elementem
[a,b]
, ale okazało się, że były dłuższe.źródło
MATL ,
2827 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Galaretka , 16 bajtów
Pobiera dane wejściowe jako listę dwóch ciągów.
Wypróbuj online! (wszystkie przypadki testowe)
W jaki sposób?
Kod ASCII znaku rangi jest konwertowany na mnożnik o następującym wzorze:mc m
Co daje:
Skomentował
Alternatywna formuła
Również dla 16 bajtów możemy użyć:
Wypróbuj online!
źródło
JavaScript (ES6),
5554 bajtów-1 bajt dzięki @Shaggy
Wypróbuj online!
Wyjaśnienie
źródło
f("2d")("1d")
, ale zastępującd:1
zd:2
naprawił.Rubin ,
5246 bajtówProsty port odpowiedzi xnora.
Wypróbuj online!
EDYCJA: -6 bajtów, wiedząc, że mogłem użyć Proc
źródło
C # (kompilator Visual C #) ,
136135 bajtówWypróbuj online!
-1 bajtów dzięki TheLethalCoder
Wyjaśnienie:
źródło
a=>b=>
.PadLeft
wymagachar
i używanie107
zamiast'k'
nie robi różnicy.Perl,
4638 bajtówUruchom jako
perl -pae '...'
. Pobiera dane wejściowe ze standardu, rozdzielone spacjami w jednym wierszu.Wykonuje kilka zamian, aby porównanie było „łatwiejsze”. Podstawienia wyrażenia regularnego zasadniczo zastępują
p
końcowe zero ik
wiodący znak ujemny. Tak więc10k
staje się-10
(tak kolejność jest odwrotna) i3p
staje się30
(tak, żep
jest ponad wszystko). To proste porównanie numeryczne.Dzięki DomHastings za sugestię
$`
/$'
, która straciła 8 bajtów.źródło
/ /
i używając `` $ '' oraz$'
: Wypróbuj online!R ,
6562 bajtówWypróbuj online!
Jest to nieco krótsze niż poprzednie odpowiedzi R i dobrze wykorzystuje funkcjonalność statystyki R :-)
-3 bajty dzięki sugestii Robina Rydera do użycia
ordered
zamiastfactor
Pobiera dane wejściowe ze standardowego wejścia (chociaż łącze TIO ulega nieznacznej restrukturyzacji w celu ułatwienia testowania). Rzuca szeregi wejściowe na uporządkowane
factor
wszystkie szeregi, a następnie przyjmuje maksimum.Dane wyjściowe wyglądają następująco:
źródło
factor
i całkowicie tego nie zauważyłemordered
.Java 8,
128122121 bajtów-6 bajtów dzięki @SaraJ .
Wypróbuj online. (Zobacz dół wyników w linkach TIO, aby zobaczyć zmapowane wartości.)
Wyjaśnienie:
źródło
Haskell ,
757068 bajtówWypróbuj online!
-5 bytes
dzięki @Laikoni-2 bytes
dzięki tylko @ ASCIIźródło
(read$init k)
może byćread(init k)
. Funkcja pomocnicza jest krótsza niż użyciecase of
: Wypróbuj online!Python 2 , 61 bajtów
Wykorzystuje algorytm Arnaulda.
Wypróbuj online!
Poprzednia odpowiedź, 73 bajty
Wypróbuj online!
źródło
Julia 0.6 ,
757165 bajtówWypróbuj online!
(-4 bajty, parsowanie w 0,6 automatycznie wykrywa to jako Int)
(-6 bajtów, użyj
(search("_dp",s[2])-1)^3)
na podstawie odpowiedzi JS Arnaulda, zamiast((c=cmp(s[end],'k'))^2*6+4c-1)
)źródło
Retina 0.8.2 , 29 bajtów
Wypróbuj online! Przyjmuje dowolną liczbę rang i wytwarza najwyższe. Wyjaśnienie:
Sortuj linie ...
... używając określonego klucza ...
... w odwrotnej kolejności.
Klucz jest tworzony z wiersza wprowadzania w następujący sposób: a) litera (profesjonalna) rang dan b) ranga unarna c) litera kyū (w stosownych przypadkach). Ponieważ jest to sortowanie odwrotne, ranga profesjonalnego dan
p
sortuje się przed rangą dand
i rangą kyū, która zaczyna się,1
ponieważ litera kyū pozostaje na końcu. W szeregach (profesjonalne) szeregi dan sortują w porządku malejącym ze względu na długość jednoargumentowego łańcucha, jednak podążaniek
za szeregami kyū powoduje, że sortują się w porządku rosnącym.Wybierz pierwszą linię, która jest teraz najwyższą rangą.
źródło
J, 39 bajtów
Wypróbuj online!
wyjaśnienie
źródło
Python , 59 bajtów
Nienazwana funkcja akceptująca iterowalny ciąg znaków, który zwraca wartość maksymalną według rangi Go. Działa podobnie do mojej odpowiedzi Jelly (po prostu używa całego ciągu ocenianego jako liczba całkowita w bazie 26, aby zapisać bajty).
Wypróbuj online!
źródło
C (gcc) , 95 bajtów
Wypróbuj online!
źródło
Perl 6 , 35 bajtów
Wypróbuj online!
Raczej odmienne podejście do wszystkich tych rzeczy związanych z wyszukiwaniem i sześcianami. Zasadniczo wymiana wyrażenie:
...k -> -...
,p -> 0
,d
usunięte. W ten sposób początkujący otrzymują wynik ujemny, dans otrzymują rangę, a zawodowcy rangę * 10. Korzystanie z WhthingStar zapewnia nam zamknięcie imax
przejmuje funkcję porównawczą.źródło
05AB1E , 12 bajtów
.V
(oceniany jako kod 05AB1E) jest zainspirowany podobnym podejściem @Arnauld w swojej odpowiedzi na Jelly .Wprowadź jako listę dwóch (lub więcej) prawidłowych ciągów.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
k
"30k"
"1k"
-1
d
>= 0
"1d"
"7d"
1
p
°
"2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Zobacz wszystkie zmapowane wartości tutaj.
źródło
Scala ,
3076154 bajtówOgromne podziękowania dla Kevina Crujissena i ASCII-tylko za ich pracę nad tą odpowiedzią, która doprowadziła do ok. 250b.
Pewna optymalizacja algorytmu dla funkcji porządkowania odpowiedzi 61b.
Przypadki testowe tutaj: Wypróbuj online!
Stara 61 bajtów odpowiedź
Sztuczka polega na obliczeniu odległości między
rank letter
ii
(kod char105
). Następnie wykorzystujemy ten dystans jako wynik ( dan = 5, kyu = 2, pro = 7), który mnożymy przez liczbę rang. Następnie bierzemy maksimum na tablicy wejściowej za pomocą funkcji oceniania.Wypróbuj też online!
źródło
var f: Function1[String, Function1[String, String]]=
. 247 bajtów .PHP ,
10098 bajtów(-2 bajty poprzez zmianę deklaracji funkcji)
Aby uruchomić:
Przykład:
Lub wypróbuj online!
PHP (7.4), 74 bajty
Wypróbuj online!
W jaki sposób?
Podobne do podejścia Arnaulda , ale w PHP. Korzystam z funkcji, aby przekonwertować każdą rangę na wartość liczbową oraz porównać i wyprowadzić tę o wyższej wartości.
Wartość rangi pochodzi z pozycji drugiego znaku ciągu wejściowego w
!!dp
, zmniejszonej o jeden, a następnie zasilonej do 3 i pomnożonej przez całkowitą część ciągu wejściowego.Tak na przykład, pozycja drugi znak
1p
, który jestp
w!!dp
wynosi 3, zmniejsza się o jeden i napędem do 3 będzie 8. tak całkowitą częścią wszystkich*p
szeregach zostanie pomnożona przez 8. Oznacza to1p = 8
,2p = 16
, ...,9p = 72
.Dla wszystkich
*d
stopni część całkowitą zostanie pomnożona przez 1 (lub po prostu bez mnożenia). Oznacza to1d = 1
, ...,7d = 7
.A dla wszystkich
*k
i**k
rang, pozycja drugiego znaku w!!dp
będzie równafalse
0 (bez wyraźnego), zmniejszona o jeden i zasilana przez 3, oznacza to, że część całkowita zostanie pomnożona przez -1. Oznacza to30k = -30
, ...,1k = -1
.To moja pierwsza w historii próba gry w golfa, nie jestem pewien, jak źle jest!
źródło
Excel VBA, 129 bajtów
Anonimowa funkcja okna natychmiastowego VBE, która pobiera dane wejściowe z zakresu
A1:A2
i dane wyjściowe do konsoli.Wyjaśnienie
źródło