Który stopień Go jest wyższy?

53

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ū (napisane 1k). 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 (pisemny 7d). To są stopnie mistrzowskie .
  • Wyjątkowo wykwalifikowani gracze z przeszłości 7dmogą awansować do 1. stopnia profesjonalnego dana 1p , a postępy liczą do 9. stopnia profesjonalnego dana (pisemnie 9p). 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 : 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
Lynn
źródło
Czy dane wejściowe mogą wymagać początkowych zer? Czyli 04k
Amphibological
6
Nie; chociaż jestem elastyczny w zakresie metod We / Wy , obawiam się, że nie pozwolę na żadną zmianę samych ciągów wejściowych - myślę, że są one doskonałym poziomem „interesujących” w chwili obecnej. (I nie pozwoli 4 kalbo 4Kalbo tak, albo.)
Lynn
2
Czy wolno nam przyjmować dane wejściowe jako pary (int, string)?
Mnemoniczny
9
Nie; ponownie, duch wyzwanie jest manipulować dokładnych ciągów tekstowych 30k, 29k, 1k, 1det cetera, więc nie pozwoli tam żadnych zmian.
Lynn,

Odpowiedzi:

36

JavaScript (ES7), 58 bajtów

Bierze dwa ciągi w składni curry (a)(b).

a=>b=>(g=s=>parseInt(s)*'_dp'.search(s[1])**3)(a)>g(b)?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:

  • 1 dla rangi dan „xd”
  • 2 dla profesjonalnego dana rangi „xp”
  • -1 dla rangi kyū „xk” lub „xxk”, ponieważ s [1] to „k” lub cyfra

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.

Arnauld
źródło
Nie tak sprytne, ale -3:a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
FireFly
2
@FireFly Thanks. Ale podobna odpowiedź została już złożona i lepiej niech pozostanie bez zmian.
Arnauld
12

Galaretka , 14 bajtów

OṪ|8-2*×ṖV$µÞṪ

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 107kdp107100112107

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'7k'[107,-7]7p[120,7]OṪ|©8-*×ṖV$®,µÞṪ16

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.

OṪ|8-2*×ṖV$µÞṪ - Link: list of lists of characters
           µÞ  - sort by (Þ) the monadic link to the left (µ):
O              -   ordinals
 Ṫ             -   tail
   8           -   literal eight
  |            -   bitwise OR
    -2         -   literal minus two
      *        -   exponentiate
          $    -   last two links as a monad (of the current list of characters):
        Ṗ      -     pop (get all but rightmost character)
         V     -     evaluate as Jelly code (gets the number)
       ×       -   muliply
             Ṫ - tail (get the rightmost)

Tabela akcji funkcji klucza ...

in    ṖV$  OṪ   OṪ|8       OṪ|8-2*×ṖV$
30k   30   107  107       -4867778304876400901747340308643840 = ((-2)^107)*30
29k   29   107  107       -4705519028047187538355762298355712 = ((-2)^107)*29
...
 2k    2   107  107        -324518553658426726783156020576256 = ((-2)^107)*2
 1k    1   107  107        -162259276829213363391578010288128 = ((-2)^107)*1
 1d    1   100  108         324518553658426726783156020576256 = ((-2)^108)*1
 2d    2   100  108         649037107316853453566312041152512 = ((-2)^108)*2
 ...
 8d    8   100  108        2596148429267413814265248164610048 = ((-2)^108)*8
 9d    9   100  108        2920666982925840541048404185186304 = ((-2)^108)*9
 1p    1   112  120     1329227995784915872903807060280344576 = ((-2)^120)*1
 2p    2   112  120     2658455991569831745807614120560689152 = ((-2)^120)*2
 ...
 8p    8   112  120    10633823966279326983230456482242756608 = ((-2)^120)*8
 9p    9   112  120    11963051962064242856134263542523101184 = ((-2)^120)*9
Jonathan Allan
źródło
Bardzo fajna metoda!
Arnauld
Nie rozumiem, w jaki sposób 14 znaków Unicode przekłada się na 14 bajtów. 2^8=256, czyli ASCII, afaik. Czy nie potrzebujesz więcej niż jednego bajtu do przechowywania znaków Unicode?
Post Self
@ Post Jeśli kod bajtowy ma 14 bajtów, znaki Unicode reprezentują tylko jeden bajt - patrz strona kodowa w łączu do „bajtów” w nagłówku.
Jonathan Allan
1
@JonathanAllan Ach, rozumiem, dziękuję!
Post Self
12

Galaretka ,  11  10 bajtów

Zainspirowany, aby wrócić do deski kreślarskiej Arnaulda!

⁾kNyv9FµÞṪ

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

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 kodu v9).

W galarecie:

  • N jest monadycznym atomem, który neguje swój wkład

    • więc kod 9 30Nfaktycznie 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 modulo

    • więc kod 9 7dskutkuje sparowaniem z co oznacza797(mod9)[0,7]
  • p jest dyadowym atomem, który wykonuje iloczyn kartezjański, który obejmuje ukryty indeks 1-indeksowy jego danych wejściowych

    • więc kod 9 p3zwraca 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 pspłaszczeniu list (np. [[1,1],[1,2],...]-> [1,1,1,2]), możemy użyć jednobajtowego atomu monadycznego Fzastosowanego do wszystkich ocen.

Tabela danych wejściowych do ich klucz-wartość jest następująca:

in    ⁾kNy    ⁾kNyv9F
30k   30N     [-30]
29k   29N     [-29]   
...
 2k    2N     [-2]
 1k    1N     [-1]
 1d    1d     [0,1]
 2d    2d     [0,2]
 ...
 6d    6d     [0,6]
 7d    7d     [0,7]                                 
 1p    1p     [1,1,1,2,...,1,9]
 2p    2p     [1,1,1,2,...,1,9,2,1,...,2,9]
 ...
 8p    8p     [1,1,1,2,...,1,9,2,1,...,7,9,8,1,...,8,9]
 9p    9p     [1,1,1,2,...,1,9,2,1,...,7,9,8,1,...,8,9,9,1,...,9,9]

Komentarz do kodu:

⁾kNyv9FµÞṪ - Link: list of lists of characters
       µÞ  - sort by (Þ) the monadic link to the left (µ):
⁾kN        -   two-char list = ['k', 'N']
   y       -   translate the current string (change 'k's to 'N's)
     9     -   literal nine
    v      -   evaluate (the left) as Jelly code with the input as given on the right (9)
      F    -   flatten the result
         Ṫ - tail (get the rightmost, and hence (a) maximum)
Jonathan Allan
źródło
Wiedziałem, że to musi się zdarzyć. :) Ale i tak jestem zadowolony, że wygram z tobą golfa przez około 90 minut. : p
Arnauld,
Nadal czuję się trochę głupio, że nie odkryłem alei, która przyszła mi do głowy od samego początku!
Jonathan Allan
To naprawdę fajna odpowiedź!
Lynn,
10

MATL , 30 28 25 23 bajtów

,0&)Uw'k'-tUw6*+qw*w]<G

Wypró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

,0&)Uwo'dpk'1L6^XE*w]<G

Wypróbuj online!

,              % Do this twice (once for each input):
0&)            % Split the input into number, last letter
U              % str2num i.e. Convert '21' to 21
wo             % Bring the letter out and change it to numeric (its ASCII code)
'dpk'          % Push the array 'dpk'
1L6^           % Push [1 2 1j] and raise to ^6, giving [1 64 -1]
XE             % Find the letter in 'dpk', replace it with its corresponding 
               %  number from the second array (d=1, p=64, k=-1)
*              % Multiply the number part by this
w              % Switch to bring out the other input to top
]              % End loop
               % Stack has [second input's value, first input's value]
<              % Is second input < first input? 1 or 0
G              % Retrieve the corresponding input: 1 for 1st input,
               %  0 for last (2nd) input

zegar słoneczny
źródło
1
Mamy teraz algorytm Arnaulda i wielomian sundarny. Śliczny. +1
David Conrad
9

Haskell , 73 71 bajtów

r(x,"k")=0-x
r(x,"d")=x
r(x,"p")=x+7
p=r.head.reads
a#b|p a<p b=b|0<1=a

Wypró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 comparingi maximumByale skończyło się 3 bajty dłużej - do cholery base! Sporadycznie i swoje ludzkie nazwy funkcji czytelny)

(Zastosowane sugestie Amphibological i Lynn)

Sześcienny
źródło
Możesz zapisać 1 bajt, zmieniając Truena 1<2.
Amfibologiczny
1
(-x)może być 0-x.
Lynn,
możesz też zmienić ostateczne dopasowanie wzoru r(x,_)=x+7!
Lynn,
Zapomniałeś zmienić ostateczne dopasowanie wzorca, powinno ono wynosić 69 ( 0-xmoże być również `-x`)
tylko ASCII
8

Python 2 , 54 bajty

lambda s:max(s,key=lambda x:(int(x,27)%9-3)*int(x,26))

Wypróbuj online!

Korzystanie z metody Arnaulda . Odwzorowanie int(x,27)%9-3zależy tylko od ostatniej litery x, ponieważ wszystkie cyfry oprócz ostatniej stanowią wielokrotność 9. To zajmuje:

'k' -> -1
'p' -> 1
'd' -> 4

Jest to ledwie wystarczający margines, aby mnożnik 1pmó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

lambda s:max(s,key=lambda x:(ord(x[-1])|8,int(x,36)^-('k'in x)))

Wypróbuj online!

xnor
źródło
6

R , 73 bajty

function(v)v[rank(as.double(chartr('dp','.0',sub('(.+)k','-\\1',v))))][2]

Wypróbuj online!

  • Musiałem użyć as.doublezamiast tego, strtoiponieważ ten ostatni nie obsługuje spacji / punktów i nie mogłem wymyślić innej ważnej postaci do zastąpieniad
  • -1 bajt rankzamiast order, ponieważ są one równe, gdy są tylko dwa elementy
digEmAll
źródło
Próbowałem użyć Lzamiast, .ale to też nie działa ... poinformuje cię, czy mogę znaleźć coś innego.
JayCe,
Gratulacje za 1K!
Giuseppe,
6

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.

“kNdHp0”yVµÞṪ

Wypróbuj online!

Skomentował

“kNdHp0”yVµÞṪ
“kNdHp0”       - literal string
        y      - translate each rank character into a Jelly instruction/symbol:
                   'k' -> 'N' = negate
                   'd' -> 'H' = halve
                   'p' -> '0' = a literal zero
         V     - evaluate as Jelly code
                 examples:
                   '21k' -> '21N' -> -21
                   '7d'  -> '7H'  -> 3.5  (*)
                   '3p'  -> '30'  -> 30
          µÞ   - sort the input using all of the above
            Ṫ  - return the second entry

(*) we don't really need to halve these values, but we do want to get rid of 'd'
Arnauld
źródło
O rany, myślałem o dokładnie takiej metodzie, zanim poszedłem trasą, którą zrobiłem ... Naprawdę powinienem był ją wypróbować!
Jonathan Allan
... teraz mam 11
Jonathan Allan
5

Julia 0,7 100 93 bajtów

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

!z=(-z%2+.9)z*z
s(x,y,z)=(10x+y)*!z
s(x,z)=x*!z
~r=s(Int[r...]...)
a|b=[a,b][argmax(.~[a,b])]

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:

  • na kliczbę ujemną, więc sortuje się do tyłu
  • na dliczbę dodatnią
  • na pdo większej liczby dodatniej

Jak pokazano:

julia> !(Int('k'))
-1144.8999999999996

julia> !(Int('d'))
9000.0

julia> !(Int('p'))
11289.6

Wyniki testu

julia> @testset "Check it" begin
               @test "29k" | "9k" == "9k"
               @test "21k" | "27k" == "21k"
               @test "6d" | "1p" == "1p"
               @test "5d" | "17k" == "5d"
               @test "1k" | "1d" == "1d"
               @test "1d" | "1d" == "1d"
               @test "1d" | "2d" == "2d"
               @test "9p" | "1d" == "9p"
               @test "2d" | "30k" == "2d"
               @test "1p" | "1k" == "1p"
               @test "1d" | "1p" == "1p"
               @test "1p" | "2d" == "1p"
               @test "7p" | "8p" == "8p"
               @test "30k" | "30k" == "30k"
       end
Test Summary: | Pass  Total
Check it      |   14     14
Test.DefaultTestSet("Check it", Any[], 14, false)
Lyndon White
źródło
To jest całkiem fajne. I nie wiedziałem, że .~[a,b]to możliwe! Przy okazji, myślę, że możesz zastąpić collect (r) [r...]i zapisać kilka bajtów.
sundar
Fajnie, a potem mogę to zrobić Int[r...]zamiast Int([r...])zaoszczędzić jeszcze kilka. Dzięki
Lyndon White
Nawiasem mówiąc, kod działa prawie tak, jak jest (po zastąpieniu argmaxgo indmax) również w Julii 0.6. Możesz dołączyć Wypróbuj online! link, jeśli chcesz.
sundar
Dzięki, moje inne ostatnie odpowiedzi Julii 0.7 znacznie bardziej ucierpiały na uniknięciu deprecjacji niż ta.
Lyndon White
Tak, wydaje się, że w krainie Julii zmierza się bardziej szczegółowy język z wymaganymi słowami kluczowymi args, ruchami stdlib wymagającymi importu, niezbędnymi białymi spacjami itp. Btw, czy miałeś na myśli 0,7 prób odpowiedzi, które ostatecznie opublikowałeś jako 0,6 odpowiedzi? Rozejrzałem się po twojej stronie użytkownika, ale nie znalazłem żadnych odpowiedzi Julii 0.7.
sundar
5

Haskell , 64 bajty

r[(n,[c])]=n*(gcd(fromEnum c)28-3)
g=r.reads
a%b|g a>g b=a|1>0=b

Wypróbuj online!

Wyrażenie gcd(fromEnum c)28-3odwzorowuje znak na mnożnik

k -> -2
d -> 1
p -> 25

Chodziło o to, by wziąć ich wartości postaci [107,100,112]i wybrać 28z 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 readssłuży do oddzielania liczby i rangi.

Prelude> reads "25k" :: [(Int, String)]
[(25,"k")]

(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.

xnor
źródło
3

MATL , 28 27 bajtów

,w'kdp'X{'*-1 . *8'YbYXU]>G

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

,                % Do twice
  w              %   Swap. Takes implicit input
  'kdp'          %   Push this string
  X{             %   Split chars: gives cell array {'k', 'd', 'p'}
  '*-1 . *8'     %   Push this string
  Yb             %   Split at whitespace: gives cell array {'*-1', '.', '*8'}
  YX             %   Regexprep: replaces 'k' by '*-1', 'd' by '.', 'p' by '*8'
  U              %   Convert to number: evaluates string
]                % End
>                % Greater than? Gives a result r which is 0 or 1
G                % Push r-th input (modularly: 0 is last, 1 is first)
Luis Mendo
źródło
3

Galaretka , 16 bajtów

Pobiera dane wejściowe jako listę dwóch ciągów.

OṪ²²%90’’×ṖV$µÞṪ

Wypróbuj online! (wszystkie przypadki testowe)

W jaki sposób?

Kod ASCII znaku rangi jest konwertowany na mnożnik o następującym wzorze:mcm

m=(c4mod90)2

Co daje:

 char. | ASCII | **4       | mod 90 | -2
-------+-------+-----------+--------+----
  'k'  |   107 | 131079601 |      1 | -1
  'd'  |   100 | 100000000 |     10 |  8
  'p'  |   112 | 157351936 |     76 | 74

Skomentował

OṪ²²%90’’×ṖV$µÞṪ
OṪ²²%90’’        - process the rank character        takes a string, e.g. '28k'
O                - get ASCII codes                   --> [50, 56, 107]
 Ṫ               - pop                               --> 107
  ²²             - square twice                      --> 131079601
    %90          - modulo 90                         --> 1
       ’’        - decrement twice                   --> -1
          ṖV$    - process the decimal part
          Ṗ      - remove the last character         --> '28'
           V     - evaluate as Jelly code            --> 28 (integer)
         ×       - multiply                          --> -28
             µÞ  - sort input using all of the above
               Ṫ - return the second entry

Alternatywna formuła

Również dla 16 bajtów możemy użyć:

m=((c1)9mod64)1
OṪ’*9%64’×ṖV$µÞṪ

Wypróbuj online!

Arnauld
źródło
3

JavaScript (ES6), 55 54 bajtów

-1 bajt dzięki @Shaggy

a=>b=>(s=x=>parseInt(x)*~-{p:9,d:2}[x[1]])(a)>s(b)?a:b

Wypróbuj online!

Wyjaśnienie

a=>b=>
  (s=x=>                 // Function s(x), that converts x to a "score", where a higher
                         // rank gets a higher score by
    parseInt(x)*         //   taking the integer part of x and multiplying it by
    ~-{p:9,d:2}[x[1]])  //   ~-9 (8) if it is a professional rank, ~-2 (1) if it is a dan
                         //   rank and ~-undefined (-1) if it is a kyū rank by looking up
                         //   the second character of the string
  (a)>s(b)               // Compare s(a) and s(b)
    ?a:b                 //   and return the one with the biggest score
Herman L.
źródło
To wydaje się działać na 54.
Kudłaty
@Shaggy rozwiązanie nie powiedzie się f("2d")("1d"), ale zastępując d:1z d:2naprawił.
Herman L
1
Spróbuj zagrać w golfa, ale wciąż 54 bajty ... takie smutne
tsh
3

Rubin , 52 46 bajtów

->s{s.max_by{|x|(5-x[-1].ord*5%8)*x.to_i(26)}}

Prosty port odpowiedzi xnora.

Wypróbuj online!

EDYCJA: -6 bajtów, wiedząc, że mogłem użyć Proc

Amfibologiczne
źródło
właśnie chciałem skomentować dokonaną właśnie zmianę :) nie musisz tutaj kopiować kodu, wystarczy użyć nagłówka
Conor O'Brien
3

C # (kompilator Visual C #) , 136 135 bajtów

a=>b=>{string c=a.PadLeft(3,'0'),d=b.PadLeft(3,'0');int x=c[2]-d[2];return(x==0?c.CompareTo(d)*(c[2]=='k'?-1:0)>0:x==5|x>9|x==-7)?a:b;}

Wypróbuj online!

-1 bajtów dzięki TheLethalCoder

Wyjaśnienie:

static void Main()
{
    System.Func<string, System.Func<string, string>> f =
        a => b =>
        {
            string c = a.PadLeft(3, '0'),
                d = b.PadLeft(3, '0');      //Pad the input with leading '0' to be 3 characters long
            int x = c[2] - d[2];            //Calculate the difference of the letter characer (the character at index 2) as integer
            return                          //return ...
                (x == 0 ?                   //if the letter of the inputs is the same...
                c.CompareTo(d)              //  compare the padded strings resulting in a positive number if the first input is greater or a negative number if the first input is lower 
                    * (                     //  multiply the result by...
                    c[2] == 'k' ? -1 : 0    //  if the letter is 'k' then -1 else 0
                    ) > 0                   //  check if the result is greater than 0
                :                           //else (the letters are not the same)
                x == 5 | x > 9 | x == -7    //  check if the letter difference was 5 (input p and k) or 12 (> 9, input p and d) or -7 (input d and k)
                ) ? a : b;                  //  then return the first input else return the second input.
        }
    ;

    System.Console.WriteLine(f("29k")("9k"));
    System.Console.WriteLine(f("21k")("27k"));
    System.Console.WriteLine(f("6d")("1p"));
    System.Console.WriteLine(f("5d")("7k"));
    System.Console.WriteLine(f("1k")("1d"));
    System.Console.WriteLine(f("1d")("1d"));
    System.Console.WriteLine(f("1d")("2d"));
    System.Console.WriteLine(f("9p")("1d"));
    System.Console.WriteLine(f("2d")("30k"));
    System.Console.WriteLine(f("1p")("1k"));
    System.Console.WriteLine(f("1d")("1p"));
    System.Console.WriteLine(f("1p")("2d"));
    System.Console.WriteLine(f("7p")("8p"));
    System.Console.WriteLine(f("30k")("30k"));
}
raznagul
źródło
1
Możesz zaoszczędzić bajt dzięki curry, tj a=>b=>.
TheLethalCoder
Och, powinieneś być w stanie używać ints zamiast dosłownych znaków.
Minęło
@TheLethalCoder: PadLeftwymaga chari używanie 107zamiast 'k'nie robi różnicy.
raznagul
Och, myślałem, że konwersja była domyślna ... warto spróbować
TheLethalCoder
3

Perl, 46 38 bajtów

s/p/0/g;s/\w*k/-$&/g;/ /;$_=@F[$`<=$']

Uruchom 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ą pkońcowe zero i kwiodący znak ujemny. Tak więc 10kstaje się -10(tak kolejność jest odwrotna) i 3pstaje się 30(tak, że pjest ponad wszystko). To proste porównanie numeryczne.

Dzięki DomHastings za sugestię $`/ $', która straciła 8 bajtów.

Silvio Mayolo
źródło
1
Naprawdę fajne rozwiązanie, nie wymyśliłem nic tak eleganckiego! Możesz zapisać 8 bajtów, dopasowując / /i używając `` $ '' oraz $': Wypróbuj online!
Dom Hastings,
3

R , 65 62 bajtów

`+`=paste0;max(ordered(scan(,""),c(30:1+"k",1:7+"d",1:9+"p")))

Wypró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 zamiast factor

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:

[1] MAX_RANK
46 Levels: 30k < 29k < 28k < 27k < 26k < 25k < 24k < 23k < 22k < ... < 9p
Giuseppe
źródło
1
62 bajty z uporządkowanym (...) zamiast współczynnika (..., o = T)
Robin Ryder
@RobinRyder dzięki! Przeczytałem stronę z dokumentami factori całkowicie tego nie zauważyłem ordered.
Giuseppe
3

Java 8, 128 122 121 bajtów

a->b->g(a)<g(b)?b:a;float g(String s){return("kdp".indexOf(s.charAt(s.length()-1))-.9f)*new Byte(s.replaceAll(".$",""));}

-6 bajtów dzięki @SaraJ .

Wypróbuj online. (Zobacz dół wyników w linkach TIO, aby zobaczyć zmapowane wartości.)

Wyjaśnienie:

a->b->                       // Method with two String parameters and String return-type
  g(a)<g(b)?                 //  If the mapped value of `a` is smaller than `b :
   b                         //   Return input `b` as result
  :                          //  Else:
   a;                        //   Return input `a` as result

float g(String s){           // Separated method with String parameter and float return-type
                             // (This method maps all possible Strings to a value)
 return("kdp".indexOf(       //   Take the (0-based) index in the String "kdp"
    s.charAt(s.length()-1))  //   of the last character
    -.9f)                    //   After we've subtracted 0.9
  *(                         //  And multiply it with:
    new Byte(                //   Convert the String to an integer
     s.replaceAll(".$",""));}//   After we've removed the trailing character
Kevin Cruijssen
źródło
1
122 bajty
Sara J
@SaraJ Thanks! :) Miałem problem ze znalezieniem krótszej alternatywy, ale byłem pewien, że powinny być jakieś. To było dość zabawne, znalazłem trzy alternatywne 128-bajtowe, ale nie krótsze ..
Kevin Cruijssen
3

Haskell , 75 70 68 bajtów

g k=read(init k)*(abs(fromEnum(last k)*2-209)-8)
a?b|g a>g b=a|1>0=b

Wypróbuj online!

-5 bytesdzięki @Laikoni
-2 bytesdzięki tylko @ ASCII

Sara J.
źródło
1
(read$init k)może być read(init k). Funkcja pomocnicza jest krótsza niż użycie case of: Wypróbuj online!
Laikoni
@Laikoni Thanks!
Sara J
1
68?
Tylko ASCII
@ Tylko ASCII Nice, dzięki!
Sara J
1
@ Sarah, nie zaktualizowałeś linku: P
tylko ASCII
2

Python 2 , 61 bajtów

Wykorzystuje algorytm Arnaulda.

lambda c:max(c,key=lambda i:'_dp'.find(i[-1])**3*int(i[:-1]))

Wypróbuj online!


Poprzednia odpowiedź, 73 bajty

lambda c:max(c,key=lambda i:('dp'.find(i[-1]),int('-'*('k'in i)+i[:-1])))

Wypróbuj online!

Pan Xcoder
źródło
2

Julia 0.6 , 75 71 65 bajtów

S->S[indmax((s->parse(s[1:end-1])*(search("_dp",s[2])-1)^3).(S))]

Wypró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))

zegar słoneczny
źródło
2

Retina 0.8.2 , 29 bajtów

O$^`.+((k)|(.))
$3$&$*1$2
1G`

Wypróbuj online! Przyjmuje dowolną liczbę rang i wytwarza najwyższe. Wyjaśnienie:

O`

Sortuj linie ...

$

... używając określonego klucza ...

^

... w odwrotnej kolejności.

.+((k)|(.))
$3$&$*1$2

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 psortuje się przed rangą dan di rangą kyū, która zaczyna się, 1ponieważ 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ążanie kza szeregami kyū powoduje, że sortują się w porządku rosnącym.

1G`

Wybierz pierwszą linię, która jest teraz najwyższą rangą.

Neil
źródło
2

J, 39 bajtów

[`]@.(<&(".@}:((*_1&^)+]*0=2&|)a.i.{:))

Wypróbuj online!

wyjaśnienie

[`]@.(<&(".@}: ((* _1&^) + ] * 0 = 2&|) a. i. {:))    entire phrase
[`]@.(<&(       assign a rank number            ))
      <&                                              "less than" of the ranks of the left and right args
                                                      ie, return 1 if right arg rank is bigger
[`]@.                                                 if so, return right arg.  otherwise left
                                                      breaking down the rank number part now...
        (       assign a rank number            )
        (".@}: ((* _1&^) + ] * 0 = 2&|) a. i. {:)
        (".@}:                                  )     everything but last char, convert to number
        (                               a. i. {:)     index within ascii alphabet of the last char
                                                      these become the left and right args to what follows...
        (      ((* _1&^) + ] * 0 = 2&|)         )
        (      (           ] * 0 = 2&|)         )     the right arg * "is the right arg even?"
                                                      because only 'k' is odd (107), this will be 0 for 'k'
                                                      and will be 100 for 'd' and 112 for 'p'
        (      ((* _1&^)              )         )     left arg (number of go rank) times _1 raised
                                                      to the ascii index.  this will swap the sign
                                                      for k only, hence producing a valid rank function
Jonasz
źródło
2

Python , 59 bajtów

lambda s:max(s,key=lambda x:(-2)**(ord(x[-1])|8)*int(x,26))

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!

Jonathan Allan
źródło
2

C (gcc) , 95 bajtów

#define _(s)(strtol(s,&u,10)+(*u^15)*8)*(-(*u&2)+1)
f(s,t,u)char*s,*t,*u;{puts(_(s)>_(t)?s:t);}

Wypróbuj online!

ErikF
źródło
Dobre wykorzystanie deklaracji funkcji w starym stylu.
SIGSTACKFAULT
2

Perl 6 , 35 bajtów

*.max: {{+TR/pd/0 /}(S/(.+)k/-$0/)}

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, dusunię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 i maxprzejmuje funkcję porównawczą.

Phil H.
źródło
2

05AB1E , 12 bajtów

Σ'pK°.Vyþ*}θ

.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:

Σ           # Sort the (implicit) input-list by:
 'pK       '#  Remove "p"
    °       #  Take 10 to the power this string
            #  (if the string is not a valid number, the string remains unchanged)
     .V     #  Evaluate the string as 05AB1E code
       yþ*  #  Multiply it with just the digits of the string
          # After the sort: pop and push the last element
            # (which is output implicitly as result)
  • k"30k""1k"-1[30,1]
  • d>= 0"1d""7d"1[1,7]
  • p°aaaa"2k""2d""2k""2d"°"2"p°100"1p""9p"[10,200,3000,40000,500000,6000000,70000000,800000000,9000000000].

Zobacz wszystkie zmapowane wartości tutaj.

Kevin Cruijssen
źródło
2

Scala , 307 61 54 bajtów

Ogromne 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.

l=>l.maxBy(s=>s.init.toInt*(math.abs(s.last*2-209)-8))

Przypadki testowe tutaj: Wypróbuj online!

Stara 61 bajtów odpowiedź

l=>l.maxBy(s=>(s.init.toInt+s.last)*(math.abs(s.last-105)-3))

Sztuczka polega na obliczeniu odległości między rank letteri i(kod char 105). 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!

V. Courtois
źródło
2
@ V.Courtois, możesz dodać pisanie w nagłówku
tylko ASCII
1
Jak wspomniano tylko w @ ASCII , możesz utworzyć go w nagłówku za pomocą var f: Function1[String, Function1[String, String]]=. 247 bajtów .
Kevin Cruijssen
2
203
Tylko ASCII
2
86
Tylko ASCII
2
64
Tylko ASCII
2

PHP , 100 98 bajtów

(-2 bajty poprzez zmianę deklaracji funkcji)

<?function f($v){return(strpos('!!dp',$v[1])-1)**3*$v;};list(,$a,$b)=$argv;echo f($a)>f($b)?$a:$b;

Aby uruchomić:

php -n <filename> <rank1> <rank2>

Przykład:

php -n go_rank.php 1p 7d

Lub wypróbuj online!


PHP (7.4), 74 bajty

$g=fn($v)=>(strpos(__dp,$v[1])-1)**3*$v;$f=fn($a,$b)=>$g($a)>$g($b)?$a:$b;

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 jest pw !!dpwynosi 3, zmniejsza się o jeden i napędem do 3 będzie 8. tak całkowitą częścią wszystkich *pszeregach zostanie pomnożona przez 8. Oznacza to 1p = 8, 2p = 16, ..., 9p = 72.

Dla wszystkich *dstopni część całkowitą zostanie pomnożona przez 1 (lub po prostu bez mnożenia). Oznacza to 1d = 1, ..., 7d = 7.

A dla wszystkich *ki **krang, pozycja drugiego znaku w !!dpbędzie równa false0 (bez wyraźnego), zmniejszona o jeden i zasilana przez 3, oznacza to, że część całkowita zostanie pomnożona przez -1. Oznacza to 30k = -30, ..., 1k = -1.

To moja pierwsza w historii próba gry w golfa, nie jestem pewien, jak źle jest!

Noc 2
źródło
1

Excel VBA, 129 bajtów

Anonimowa funkcja okna natychmiastowego VBE, która pobiera dane wejściowe z zakresu A1:A2i dane wyjściowe do konsoli.

[B:B]="=SUBSTITUTE(A1,""p"",10)":[C1:C2]="=LEFT(B1,LEN(B1)-1)*-1^IFERROR(FIND(""k"",B1)>0,0)":?[INDEX(A:A,MATCH(MAX(C:C),C:C,0))]

Wyjaśnienie

[B:B]="=SUBSTITUTE(A1,""p"",10)"                            ''  Convert inputs to numerics 
                                                            ''  by appending 10 to rank if 
                                                            ''  is a professional dan rank
                                                            ''
[C1:C2]="=LEFT(B1,LEN(B1)-1)*-1^IFERROR(FIND(""k"",B1)>0,0)"''  Remove rightmost char; If 
                                                            ''  the rank is kyū, then mult
                                                            ''  by -1
                                                            ''
?[INDEX(A:A,MATCH(MAX(C:C),C:C,0))]                         ''  Find the max, return the 
                                                            ''  corresponding input
Taylor Scott
źródło