Spieler des traditionellen Brettspiels Go messen ihre Fähigkeiten in einem Rangsystem :
- Spieler, die neu im Spiel sind, werden als 30. kyū (geschrieben
30k
) eingestuft und der Fortschritt wird bis zum 1. kyū (geschrieben1k
) heruntergezählt . Diese werden als Schülerränge betrachtet . - Ein Spieler kann vom 1. Kyū zum 1. Dan Rang (geschrieben
1d
) aufsteigen und dann bis zum 7. Dan Rang (geschrieben7d
) weiterkommen . Dies sind die Meisterränge . - Außergewöhnlich qualifizierte Spieler
7d
können in den ersten professionellen Dan-Rang aufsteigen1p
und Fortschritte bis zum neunten professionellen Dan- Rang (schriftlich9p
) zählen. Dies ist der höchste Rang.
Kurzum: Ränge werden bestellt 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
Aufgabe
Gegeben seien zwei Strings unter { 30k
, ..., 1k
, 1d
, ..., 7d
, 1p
, ..., 9p
} als Eingabe, Ausgabe der höheren Rang der beiden. (Wenn sie gleich sind, geben Sie einfach einen der beiden Eingänge aus.)
(Wie üblich ist I / O flexibel - Ihre Antwort kann eine Funktion oder ein vollständiges Programm sein, das Eingaben in angemessener Weise liest und Ausgaben in angemessener Weise erzeugt.)
Das ist Code-Golf : Das Ziel ist es, die Byte-Anzahl Ihres Codes zu minimieren.
Testfälle
(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
oder4K
oder so auch nicht zulassen .)30k
,29k
,1k
,1d
und so weiter, so dass ich keine Variation gibt ermöglichen.Antworten:
JavaScript (ES7), 58 Byte
Übernimmt die beiden Zeichenfolgen in der Currying-Syntax
(a)(b)
.Probieren Sie es online!
Wie?
Die Hilfsfunktion g () übersetzt die Eingabezeichenfolge s in eine Punktzahl.
1) Wir suchen nach s [1] in der Zeichenfolge "_dp" . Das gibt:
2) Wir würfeln dieses Ergebnis, was 1 und -1 unverändert lässt, aber 8 für einen professionellen Dan- Rang ergibt .
3) Wir multiplizieren mit dem Dezimalteil des Ranges.
quelle
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Jelly , 14 Bytes
Ein monadischer Link, der eine Liste von Zeichenfolgen * (wie beschrieben) akzeptiert, die den höchsten gefundenen Rang ergibt.
* Funktioniert auch mit anderen Zahlen als zwei.
Probieren Sie es online! Oder sehen Sie sich eine Testsuite an .
Wie?
Sortiert nach einer Tastenfunktion und gibt das am weitesten rechts stehende (dh ein Maximum) zurück.
Die Buchstaben , d und p haben die Ordnungszahlen 107 , 100 bzw. 112 . In der Binärdatei 107 sind die acht Bits gesetzt, während die anderen nicht gesetzt sind. Bei einer bitweisen ODER-Verknüpfung mit 8 erhalten wir 107, 108 und 120 - diese sind jetzt in der Reihenfolge, in der die von ihnen identifizierten Klassen sortiert werden müssen.k d p 107 100 112 107
Die Amateur-Ränge sind in absteigender Reihenfolge, sodass wir zur Vervollständigung unserer Schlüsselfunktion unseren Klassenbezeichner mit der in der Zeichenfolge angegebenen Nummer verketten und negieren können, wenn die Zeichenfolge mit endet (z. B. -> while -> ). Im Code muss dazu der Klassenbezeichner gespeichert und minus eins für die Multiplikation - das sind 16 Bytes - potenziert werden.k 16
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Um dies zu verbessern, können wir stattdessen minus zwei verwenden und die Elemente miteinander multiplizieren, was mit einer einzigen Multiplikation erreicht werden kann.
Tabelle der Tastenfunktion ...
quelle
2^8=256
, das ist ASCII, afaik. Benötigen Sie dann nicht mehr als ein Byte, um Unicode-Zeichen zu speichern?Jelly ,
11 bis10 BytesInspiriert von Arnauld, zum Zeichenbrett zurückzukehren!
Ein monadischer Link, der eine Liste von Zeichenfolgen * (wie beschrieben) akzeptiert, die den höchsten gefundenen Rang ergibt.
Probieren Sie es online! Oder sehen Sie sich eine Testsuite an .
Wie?
Sortiert nach einer Tastenfunktion und gibt das am weitesten rechts stehende (dh ein Maximum) zurück.
Die Schlüsselfunktion wandelt k zunächst mit dem dyadischen Atom in ein N um
y
, übersetzt es mit der zweistelligen Liste⁾kN
(Jelly-Code für['k','N']
) und wertet die Zeichenfolge dann als Monade mit einem Argument von neun aus (unter Verwendung des Codesv9
).In Gelee:
N
ist ein monadisches Atom, das seine Eingabe negiert9 30N
also nicht die Neun und ergibt die Ganzzahl-30
d
ist ein dyadisches Atom, das das Ergebnis eines Python-Divmods mit zwei Werten ergibt - das Ergebnispaar aus ganzzahliger Division und Modulo9 7d
ergibt also gepaart mit7[0,7]
p
ist ein dyadisches Atom, das ein kartesisches Produkt ausführt, das eine implizite 1-indizierte Bereichseinstufung seiner Eingaben enthält9 p3
liefert also das kartesische Produkt von[1,2,3]
und[1,2,3,4,5,6,7,8,9]
welches ist[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
Sobald solche Bewertungen unter Verwendung der zu vergleichenden Zeichenfolgen durchgeführt wurden, müssen wir in der Lage sein, die Ergebnisse zu vergleichen. da ints nicht mit listen vergleichbar sind, müssen wir die negierten werte in eine liste einschließen, aber da die ordnung nach dem
p
abflachen der listen immer noch funktionieren würde (zb[[1,1],[1,2],...]
->[1,1,1,2]
), können wir das monadische einzelbyte-atom verwenden,F
das auf alle auswertungen angewendet wird.Eine Tabelle der Eingaben zu ihrem Schlüsselwert sieht wie folgt aus:
Code-Kommentar:
quelle
MATL ,
30282523 BytesProbieren Sie es online!
(-2 Bytes dank Luis Mendo)
(weitere -3 Bytes ersetzt
v&X>
mit>
, diesmal auf Basis von Luis Mendo Antwort)(-2 Bytes mit
&)
Syntax)Erläuterung:
Subtrahiere 'k' vom letzten Zeichen (ergibt n = -7, 0, 5 für 'd', 'k', 'p').
Berechnen Sie v = n ^ 2 + 6n-1 (ergibt 7, -1, 54).
Multiplizieren Sie diesen Wert v mit der tatsächlichen Rangnummer (so dass k Niveaus negative Produkte erhalten, d Niveaus von 7 bis 49, p Niveaus von 54 und höher).
Vergleichen Sie die Produkte für beide Eingabezeichenfolgen
Rufen Sie die Eingabezeichenfolge ab, die dem größeren Produkt entspricht
Alternative, einfachere Methode:
23 Bytes
Probieren Sie es online!
quelle
Haskell ,
7371 BytesProbieren Sie es online!
Wie für mich üblich, nur eine unkomplizierte Implementierung, anstatt etwas besonders Golf-y. Die Funktion "(#)" nimmt zwei Ränge als Zeichenketten und gibt den größeren zurück. Funktioniert nur mit genau dem in der Frage angegebenen Format.
(Ich habe auch versucht, eine Version mit
comparing
und zu verwenden,maximumBy
aber das endete damit, dass sie 3 Bytes länger war - verdammt, Siebase
und Ihre gelegentlich von Menschen lesbaren Funktionsnamen!)(Angewandte Vorschläge von Amphibological und Lynn)
quelle
True
zu1<2
.(-x)
kann sein0-x
.r(x,_)=x+7
!0-x
Musterübereinstimmung zu ändern. Sie sollte 69 sein ( kann auch "-x" sein)Python 2 , 54 Bytes
Probieren Sie es online!
Nach Arnauld . Die Zuordnung
int(x,27)%9-3
hängt nur vom letzten Buchstaben von abx
, da alle Ziffern bis auf die letzte ein Vielfaches von beisteuern9
. Es braucht:Dies ist kaum genug Spielraum für den Multiplikator
1p
, um7d
den höchsten Dan-Rang zu schlagen , wenn er in Basis 26 interpretiert wird.Ich fand dies, indem ich Ausdrücke dieser und einiger anderer Formen brachial erzwang.
Python 2 , 64 Bytes
Probieren Sie es online!
quelle
R , 73 Bytes
Probieren Sie es online!
as.double
stattdessen verwenden,strtoi
da letzteres keine Leerzeichen / Punkte behandelt und ich mir kein anderes gültiges Zeichen zum Ersetzen vorstellen konnted
rank
stattorder
, da sie gleich sind, wenn nur zwei Elemente vorhanden sindquelle
L
anstelle von zu verwenden,.
aber es funktioniert auch nicht ... werde Sie wissen lassen, ob ich etwas anderes finden kann.Jelly , 13 Bytes
Dies ist ganz anders als meine andere Jelly-Antwort , daher poste ich dies separat.
Übernimmt die Eingabe als Liste von zwei (oder mehr) Zeichenfolgen.
Probieren Sie es online!
Kommentiert
quelle
Julia 0,7
10093 BytesDies ist nicht der effizienteste Weg ( Antwort Julia 0.6 von contrast @ sundar ), aber es ist schön, weil es rein numerisch ist. Verwendet auch Versand (wenn auch leider nur einmal)
Sehr ähnlicher Code funktioniert in 0.6. Versuchen Sie es online
Wie:
Der Trick liegt in der
!(z)
Funktion.Es ordnet den UTF-8-Wert zu:
k
in eine negative Zahl, also rückwärts sortiertd
in eine positive Zahlp
in eine größere positive ZahlWie gezeigt:
Testergebnisse
quelle
.~[a,b]
es möglich ist! Übrigens, ich denke, Sie können collect (r) durch ersetzen[r...]
und ein paar Bytes sparen.Int[r...]
lieber, alsInt([r...])
ein paar mehr zu retten. Dankeargmax
durchindmax
) auch bei Julia 0.6. Sie können eine Online-Testversion hinzufügen! Link, wenn Sie möchten.Haskell , 64 Bytes
Probieren Sie es online!
Der Ausdruck
gcd(fromEnum c)28-3
ordnet das Zeichen einem Multiplikator zuDie Idee war, ihre Charakterwerte zu übernehmen
[107,100,112]
und zu wählen28
, dass immer größere Faktoren mit ihnen gemeinsam sind, die leicht gemacht wurden, aber der erste war der Primus. Diese Methode spart 2 Bytes beim expliziten Schreiben eines Mappings .Das eingebaute
reads
wird verwendet, um die Nummer und Rang zu trennen.(Eigentlich die direkte Aufteilung von Sara J um ein Byte kürzer und ergibt 63 Bytes .)
Der "Take-the-Large-One" -Schritt nimmt in meiner Lösung eine nervige Anzahl von Bytes in Anspruch. Ich habe andere Ansätze ausprobiert, wie das Durchlaufen von Rängen in absteigender Reihenfolge und das Aufnehmen des ersten Elements
[a,b]
, aber sie sind länger ausgefallen.quelle
MATL ,
2827 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Gelee , 16 Bytes
Übernimmt die Eingabe als Liste von zwei Zeichenfolgen.
Probieren Sie es online! (alle Testfälle)
Wie?
Welches gibt:
Kommentiert
Alternative Formel
Auch für 16 Bytes können wir verwenden:
Probieren Sie es online!
quelle
JavaScript (ES6),
5554 Byte-1 Byte dank @Shaggy
Probieren Sie es online!
Erläuterung
quelle
f("2d")("1d")
, aber das Ersetzend:1
durchd:2
behoben.Ruby ,
5246 BytesEinfache Antwort von xnor.
Probieren Sie es online!
BEARBEITEN: -6 Bytes durch die Erkenntnis, dass ich einen Proc hätte verwenden können
quelle
C # (Visual C # -Compiler) ,
136 bis135 ByteProbieren Sie es online!
-1 Byte dank TheLethalCoder
Erweiterung:
quelle
a=>b=>
.PadLeft
erfordertchar
und verwendet107
statt'k'
macht keinen Unterschied.Perl,
4638 BytesFühren Sie so
perl -pae '...'
. Nimmt Eingaben von stdin entgegen, die in einer Zeile durch Leerzeichen getrennt sind.Führt einige Ersetzungen durch, um den Vergleich "einfacher" zu machen. Die regulären Ausdrücke werden im Wesentlichen durch
p
eine nachgestellte Null undk
ein führendes negatives Vorzeichen ersetzt. So10k
wird-10
(so wird die Reihenfolge umgekehrt) und3p
wird30
(sop
steht das über allem anderen). Dann ist es nur ein einfacher numerischer Vergleich.Vielen Dank an DomHastings für den
$`
/$'
Vorschlag, der 8 Bytes gespart hat .quelle
/ /
`` $ `` `und$'
: online ausprobieren!R ,
6562 BytesProbieren Sie es online!
Dies ist etwas kürzer als die vorherigen R-Antworten und nutzt die Statistikfunktionalität von R :-)
-3 Bytes dank des Vorschlags von Robin Ryder ,
ordered
anstelle von zu verwendenfactor
Übernimmt die Eingabe von stdin (obwohl sich der TIO-Link zum leichteren Testen leicht umstrukturiert). Wandelt die Eingabe-Ränge in eine geordnete um
factor
von allen Rängen und nimmt dann die max.Die Ausgabe sieht folgendermaßen aus:
quelle
factor
und völlig verpasstordered
.Java 8,
128122121 Bytes-6 Bytes dank @SaraJ .
Probieren Sie es online aus. (Die zugeordneten Werte finden Sie im unteren Bereich der Ausgabe in den TIO-Links.)
Erläuterung:
quelle
Haskell ,
757068 BytesProbieren Sie es online!
-5 bytes
danke an @Laikoni-2 bytes
danke an @ ASCII-onlyquelle
(read$init k)
kann seinread(init k)
. Eine Hilfsfunktion ist kürzer als die Verwendung voncase of
: Probieren Sie es online aus!Python 2 , 61 Bytes
Verwendet Arnauld's Algorithmus.
Probieren Sie es online!
Vorherige Antwort 73 Bytes
Probieren Sie es online!
quelle
Julia 0,6 ,
757165 BytesProbieren Sie es online!
(-4 Bytes, Parsen in 0.6 erkennt es automatisch als Int)
(-6 Bytes, Verwendung
(search("_dp",s[2])-1)^3)
basierend auf der JS-Antwort von Arnauld anstelle von((c=cmp(s[end],'k'))^2*6+4c-1)
)quelle
Retina 0.8.2 , 29 Bytes
Probieren Sie es online! Akzeptiert eine beliebige Anzahl von Rängen und gibt die höchsten aus. Erläuterung:
Sortiere die Zeilen ...
... mit dem angegebenen Schlüssel ...
... in umgekehrter Reihenfolge.
Der Schlüssel wird wie folgt aus der Eingabezeile erzeugt: a) der (professionelle) Dan-Rang-Buchstabe b) der Rang in Unary c) der Kyū-Buchstabe (falls zutreffend). Da dies eine umgekehrte Sortierung ist, wird der professionelle Dan-Rang
p
vor dem Dan-Rangd
und dem Kyū-Rang sortiert, der mit beginnt,1
da der Kyū-Buchstabe am Ende übrig bleibt. Innerhalb der Ränge werden die (professionellen) Dan-Ränge aufgrund der Länge der unären Zeichenfolge in absteigender Reihenfolge sortiert, jedoch werden sie durch das Nachziehenk
der Kyū-Ränge in aufsteigender Reihenfolge sortiert.Wählen Sie die erste Zeile aus, die jetzt den höchsten Rang hat.
quelle
J, 39 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python , 59 Bytes
Eine unbenannte Funktion, die eine Iteration von Zeichenfolgen akzeptiert und nach Go-Rang eine maximale zurückgibt. Funktioniert ähnlich wie meine Jelly-Antwort (verwendet nur die gesamte Zeichenfolge, die als Ganzzahl in Basis 26 ausgewertet wird, um Bytes zu sparen).
Probieren Sie es online!
quelle
C (gcc) 95 Bytes
Probieren Sie es online!
quelle
Perl 6 , 35 Bytes
Probieren Sie es online!
Ein etwas anderer Ansatz für all diese Such-und-Würfel-Dinge. Im Wesentlichen string Ersatz:
...k -> -...
,p -> 0
,d
gelöscht. So bekommen Neulinge eine Minusnote, Dans bekommen ihren Rang und Profis bekommen Rang * 10. Die Verwendung des WhateverStar verschafft uns einen Abschluss undmax
übernimmt eine Komparatorfunktion.quelle
05AB1E , 12 Bytes
.V
(als 05AB1E-Code auswerten) ist von @Arnauld 's ähnlichem Ansatz in seiner Jelly-Antwort inspiriert .Eingabe als Liste von zwei (oder mehr) gültigen Zeichenfolgen.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
k
"30k"
"1k"
-1
d
>= 0
"1d"
"7d"
1
p
°
"2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Sehen Sie hier alle zugeordneten Werte.
quelle
Scala ,
3076154 BytesVielen Dank an Kevin Crujissen und ASCII-only für die Arbeit an dieser Antwort, die es geschafft hat ~ 250b runter zu kommen.
Einige Algorithmusoptimierungen für die Bestellfunktion von 61b-Antworten.
Testfälle hier: Online ausprobieren!
Alte 61 Bytes antworten
Der Trick besteht darin, den Abstand zwischen
rank letter
undi
(Zeichencode105
) zu berechnen . Dann verwenden wir diese Distanz als Punktzahl ( dan = 5, kyu = 2, pro = 7), die wir mit der Rangzahl multiplizieren. Dann nehmen wir das Maximum des Eingabearrays mit der Scoring-Funktion.Probieren Sie es auch online aus!
quelle
var f: Function1[String, Function1[String, String]]=
. 247 Bytes .PHP ,
10098 Bytes(-2 Bytes durch Änderung der Funktionsdeklaration)
Um es auszuführen:
Beispiel:
Oder versuchen Sie es online!
PHP (7.4), 74 Bytes
Probieren Sie es online!
Wie?
Ähnlich wie bei Arnauld , aber in PHP. Ich verwende eine Funktion, um jeden Rang in einen numerischen Wert umzuwandeln und den mit dem höheren Wert zu vergleichen und auszugeben.
Der Rangwert ergibt sich aus der zweiten Zeichenposition der Eingabezeichenfolge in
!!dp
, wird um eins verringert und dann auf 3 hochgesetzt und mit dem ganzzahligen Teil der Eingabezeichenfolge multipliziert.So zum Beispiel, Position des zweiten Zeichens von
1p
denenp
in!!dp
3 ist , vermindert um eine und angetriebene bis 3 es 8.en So ganzzahlige Teil aller seine*p
Reihe wird durch 8 multipliziert Dies bedeutet1p = 8
,2p = 16
, ...,9p = 72
.Für alle
*d
Ränge wird der ganzzahlige Teil mit 1 multipliziert (oder einfach ohne Multiplikation). Das heißt1d = 1
, ...,7d = 7
.Und für alle
*k
und**k
Ränge ist die Position des zweiten Zeichens in!!dp
gleich,false
was gleich 0 ist (nicht explizit), reduziert um eins und mit 3 versorgt, was bedeutet, dass der ganzzahlige Teil mit -1 multipliziert wird. Das heißt30k = -30
, ...,1k = -1
.Dies ist mein erster Golfversuch, ich bin mir nicht sicher, wie schlimm er ist!
quelle
Excel VBA, 129 Bytes
Eine anonyme VBE-Direktfensterfunktion, die Eingaben in den Bereich
A1:A2
und Ausgaben an die Konsole überträgt.Erklärung
quelle