Schreiben Sie eine Funktion oder ein Programm , das String - Eingänge nimmt, voll Dinkel, Englisch Monatsnamen in Titel Fall: January
, February
, March
usw. (null / CR / LF beendet OK, mit einigen nicht-alpha Zeichen begrenzt , wenn Sie so wählen) und entweder
vergleicht zwei Eingaben und gibt einen Wahrheitswert zurück, wenn die zweite Eingabe größer ist (in Monatsreihenfolge) als die erste. Gleiche Werte führen zu einem falschen Wert
oder sortiert eine beliebige Reihenfolge (Liste, durch Trennzeichen getrennte Zeichenfolge usw.) in chronologischer Reihenfolge
(Der Kern der Herausforderung besteht darin, eine Methode / einen Ausdruck zu definieren, die / der die richtige lexikografische Sortierung ergibt. Einige Sprachen haben möglicherweise eine kürzere Antwort auf die eine oder die andere)
Sie können keine internen Zeitanalyse-Methoden verwenden (z. B. strptime
), um den Monatsnamen in eine Zahl oder eine vordefinierte Zuordnung von Monatsnamen zu übersetzen. Verwenden Sie die Eigenschaften der Zeichenfolgen selbst, eine von Ihnen definierte sparsame Nachschlagetabelle oder eine clevere Funktion.
Beispiel
Funktionsbeispiele, obwohl das erste durch die Regeln verboten ist ...
import datetime
def is_later_month(a, b):
'''
Example of prohibited code because it relies on language
features about how to parse month names
'''
return datetime.strptime(a, '%B') < datetime.strptime(b, '%B')
Die folgenden Versionen sind jedoch in Ordnung, da wir diese Informationen codieren
months = {
'January': 1, 'February': 2, 'March': 3,
'April': 4, 'May': 5, 'June': 6,
'July': 7, 'August': 8, 'September': 9,
'October': 10, 'November': 11, 'December': 12,
}
def is_later_month(a, b):
"""
Returns True/False when comparing two months.
"""
return months[a] < months[b]
Oder Sie könnten eine Sortierfunktion ausführen
months = {'as above...'}
def sort_months(l):
"""
Sorts list and returns it. Different input and output than the above,
but equally valid. Sorting versus comparing might be shorter in your
favorite language.
"""
return sorted(l, key=lambda x: months[x])
Beispieltests
assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')
months
Liste aller Monatsnamen hätte, würde ich diesmonths[x] < months[y]
als Antwort verbieten wollen . Die Liste der Monatsnamen enthält einige Besonderheiten (unterschiedliche Länge, Gemeinsamkeiten), die die Herausforderung bei zufällig generierten Zeichenfolgen erleichtern / erschweren.Antworten:
Jelly , 19 Bytes
Dies ist ein monadischer Link, der eine Liste als Argument nimmt und sortiert. Probieren Sie es online!
Hintergrund
Jelly verwendet eine modulare, 1-basierte Indexierung. Wenn wir die Monatsnamen oft genug wiederholen, um 11 Zeichen zu erhalten, erhalten wir das folgende Array.
Im 11 - ten (letzten) Spalte sind alle Zeichen anders, so dass wir sie nutzen können , um die Reihenfolge der Monate zu identifizieren.
Wie es funktioniert
quelle
x86-Maschinencode,
2625 BytesHexdump:
Assembler-Code:
Die folgende Hash-Funktion bringt die Monatsnamen in die richtige Reihenfolge (ermittelt durch Brute Force):
Es wird auf die ersten 4 Bytes (32 Bits) der Eingabezeichenfolge angewendet, die in Little-Endian-Reihenfolge angeordnet sind. Vergleichen Sie dann das Ergebnis und
SALC
setzen Sie das Ergebnisregister (al) mit:quelle
Gelee , 15 Bytes
Kein Online-Dolmetscher-Link hier, da dies eine langsame Einreichung ist. Das Programm verwendet die Hash-Funktion
354^(input interpreted as base 32 int) % 991
als Sortierschlüssel, wodurch die Ausgaben in der richtigen Reihenfolge erfolgen. Das Programm wird in Kürze beendet, da die Ergebnisse der Exponentiation gigantisch sind - für "September" muss eine Zahl mit 0,24 Billiarden Ziffern berechnet werden!Jelly Erklärung:
Python Proof-of-Concept-Skript - Beachten Sie die Verwendung
pow
für die modulare Exponentiation, die wesentlich effizienter ist:quelle
Python,
646157 BytesDas Lambda nimmt als Eingabe zwei Monate in Anspruch und vergleicht sie. Teste es auf Ideone .
Vielen Dank an @ljeabmreosn für das Abschlagen von 3 Bytes und das Vorbereiten des Weges für weitere 3 Bytes!
quelle
s[10%len(s)]
zur(4*s)[10]
Arbeit wechseln ?Python,
8171 Byteshttps://repl.it/CluN/1
Vergleicht den Index
m
des zweiten und dritten Buchstabens von zwei Monaten.83-Byte-Version zum Sortieren einer Liste von Monaten:
quelle
Ruby, 58 Bytes
Verwendet den Monatssortiertrick aus der Antwort von @atlasologist .
Die Vergleichsfunktion ist mit 63 Bytes etwas länger
quelle
J
6665 BytesVerwendet die Tatsache, dass f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) eine gültige Funktion im begrenzten Bereich der 12 Monate ist:
Verwendung:
(Das ist auf keinen Fall die beste Idee, aber ich wollte keinen Ranglistentrick stehlen!)
Hier ist eine kürzere Version unter Verwendung der @ atlasologist- Methode:
J, 63 Bytes
Verwendung:
Und eine viel kürzere Version mit der cleveren Methode von @ Dennis :
J, 34 Bytes
quelle
Haskell, 74 Bytes
Mein erster Code Golf, yay! Die Grundidee dieses Artikels ist inspiriert von der Top-Antwort in Jelly und der Tatsache, dass das 11. Zeichen beim Wechseln der Monatsnamen immer eindeutig ist.
Hier ist eine ungolfed Version, um zu sehen, wie es funktioniert:
Die
e
Funktion repräsentiert die eleventhChar-Funktion (leider können 4 Bytes aufgrund der Monomorphismus-Einschränkung nicht entfernt werden, denke ich) und die#
Infix-Funktion entspricht derinOrder
Funktion.Eine nette kleine Lösung, aber es kann Möglichkeiten geben, mehr Bytes zu sparen (einige habe ich gerade beim Schreiben gefunden!)
quelle
e s=head.drop 10$cycle s
wie Sie durch den Einsatz in Ihrer Erklärung haben.
statt$
:e=head.drop 10.cycle
. Die Verwendung des!!
e=(!!10).cycle
Java,
133,123Golf gespielt:
Ich suchte nach einer cleveren Technik wie in der Assembler-Antwort, aber es dauerte zu lange, um herauszufinden, weshalb ich dieselbe Technik verwendete, die auch alle anderen verwendeten.
Ungolfed:
quelle
substring
stattdessen verwenden, wenncharAt
"" +
da es keine rohenchar
s mehr gibt.ARM Maschinensprache unter Linux
4440 BytesIch habe eine andere Hash-Funktion verwendet als die Lösung von anatolyg verwendet und versucht, mithilfe von Thumb-Anweisungen ein paar Bytes zu sparen (obwohl ich 8 Bytes in den Thumb-Modus geworfen habe ).
Sie können dies auf einem Raspberry Pi oder Android-Gerät mit GNURoot ausprobieren.
Zum Laufen geben Sie so etwas wie ein
Die aktuelle Version behandelt jetzt den Gleichheitsfall (und andere) korrekt.
quelle
bfac
man auch?ite ge
führt die nächste Anweisung (movge r0, #0
) bedingt ausr3 >= r0
, andernfalls die folgende Anweisung (movlt r0, #1
). Ich denke, es gibt hier Platz, um ein paar Bytes zuPerl 6 , 55 Bytes
Für die Vergleichsversionen wären einige Bytes mehr erforderlich:
Prüfung:
quelle
Haskell, 118 Zeichen
Verwendet die Tatsache, dass jeder Monatsname in seinem ersten und vierten Zeichen (oder 3. für Mai) eindeutig ist, um einen Datentyp zu definieren, der von der Sprache automatisch analysiert und verglichen werden kann. Die 'r'-Funktion konvertiert einen String, indem sie die ersten vier Zeichen (oder weniger) aufnimmt und dann nur das erste und das letzte auswählt. Dann ist 'a # b' ein Operator zum Vergleichen der Werte:
Könnte wahrscheinlich effizienter sein, aber ich wollte versuchen, einen nützlichen Datentyp für die Darstellung der Monate zu verwenden.
quelle
PowerShell,
968863 Bytesz.B
Nun folgt die zweite Herausforderung: Sortieren einer Liste nach Reihenfolge. Vorgängerversionen führten den Vergleich von zweimonatigem Test durch:
Basierend auf den zweiten beiden Zeichen im Monatsnamen.
quelle
Python
8382 BytesTest: https://repl.it/repls/TimelyDecimalBrowsers
Ruft die Summe der ersten 3 Zeichen ab und erstellt ein einzelnes Zeichen für die Suche.
quelle
Javascript, 118 Bytes
Könnte mehr Golf gespielt werden, wahrscheinlich, indem man es loswird
c
und benutztarray.map
, aber das habe ich jetzt ...quelle
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Bash, 101 Bytes
Dies ist die Funktion von is_later
Prüfung
quelle
k4, 29
Ein Port von @ Dennis's Jelly Antwort .
Dies ist der Sortierer, nicht der Komparator; Interessanterweise ist der Komparator mit demselben Algorithmus trivial implementierbar und nur ein Byte länger:
quelle
Bash + Coreutils,
94 Bytes93 BytesDies ist ein Versuch, eine Transformation zu entwickeln, die lexikografisch sortiert ist. Wenn Sie sich den Transformationsschlüssel genau ansehen,
FMAyulgSOND
sehen Sie die Monate Februar bis Dezember (der Januar wird nach der Transformation leer; durch Verwendung von 'B' als Trennzeichen wird er nach oben gezogen). Durch Umkehren, Abschneiden und Entfernen von Buchstaben ohne Schlüssel kann dieser Trick ausgeführt werden.90 Bytes unter Verwendung von C Locale
... wobei ␉ das Tabulatorzeichen ist.
80 Bytes unter Verwendung von C-Gebietsschema
... mit der @ atlasolog-Methode. Ich bin fest entschlossen, diesen Ansatz zu nutzen, um mit mehr Gebietsschemas zu arbeiten.
Test / Verwendung
Ausgänge:
quelle