Dies ist eine ziemlich einfache Code-Golf-Herausforderung. Ihr Programm besteht bei einer ASCII-Zeichenfolge darin, diese Zeichenfolge in zwei Zeichenfolgen zu analysieren, die ausgewertet werden. Wenn die zweite Zeichenfolge "später" als die erste ist, gibt sie eine 1 zurück, wenn sie "früher" als die erste ist, gibt sie eine -1 zurück, und wenn sie gleich sind, gibt sie 0 zurück Um zu klären, was "später" und "früher" bedeuten, werfen wir einen Blick auf die ASCII-Zeichencodes. Sie müssen jedes Zeichen der Zeichenfolge vergleichen und jedes Zeichen als Ziffern einer Zahl behandeln. Später bezieht sich auf eine größere Zahl, die nach einer kleineren Zahl auftritt. Zeichenfolgen werden mit einem Bindestrich formatiert, um die beiden Eingabegruppen zu trennen.
Schauen Sie sich dieses Beispiel an:
7-9
als Eingabe sollte zurückkehren1
.
7
Konvertiert in ASCII-Code55
und9
konvertiert in ASCII-Code57
.Wie
57
numerisch danach auftritt55
,9
ist später als7
.
Ein anderes Beispiel:
LKzb-LKaj
als Eingabe sollte zurückkehren-1
Die ASCII-Codesequenzen hierfür sind
76-75-122-98
und76-75-97-106
Dies ist eine Code-Golf-Herausforderung, und bei der Anzahl der Bytes werden die Einträge bewertet.
Jede Eingabe von 95 druckbaren ASCII-Zeichen wird akzeptiert, ausgenommen Leerzeichen und Bindestriche, die die Eingabe nur trennen. Außerdem ist nicht garantiert, dass die Zeichenfolgen dieselbe Länge haben.
Viel Glück!
BEARBEITEN: Um klarer zu sein, muss jedes Zeichen wie eine Ziffer in einer Zahl behandelt werden. In dem Beispiel LKzb-LKaj
, wenn auch j
später als b
, z
später als a
, und da es sich um eine höherwertige Stelle ist, hat es Vorrang. Eine angegebene Zeichenfolge besteht immer aus mindestens 3 Zeichen, wodurch leere Zeichenfolgen aus dem Umfang dieses Problems ausgeschlossen werden.
EDIT: Hier sind einige weitere Testfälle für Ihre Hilfe:
A-9
->-1
11-Z
->-1
3h~J*-3h~J*
->0
Xv-Y0
->1
quelle
11-Z
->-1
macht angesichts des aktuellen Wortlauts der Frage keinen Sinn.Z
(90) ist größer als1
(49) und der bedeutendste Buchstabe. Bitte klären Sie, wie Saiten unterschiedlicher Länge verglichen werden.A-AA
?11>Z
in Ihren Beispielen wann1<Z
. Es muss ein undefiniertes Verhalten geben, das mit Zeichenfolgen unterschiedlicher Länge zu tun hat, sonst ist das Beispiel falsch.~
bei 126 erhöhen und dann die nächste Ziffer um eins erhöhen und die ursprüngliche Ziffer auf zurückgeben!
. Jede Erhöhung der höchstwertigen Ziffer entspricht einer Erhöhung der zweitwichtigsten Ziffer um 127.Antworten:
Pyth - 11 Bytes
Einfach, verwendet
._
Zeichen, um das ZeichenC
zu erhalten und Zeichencodes zu erhalten.Probieren Sie es hier online aus .
Testsuite .
quelle
CJam, 12 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Java,
86118Eine sehr seltsame Art, Strings zu vergleichen. Eine schnelle Lösung, die zusätzliche Testfälle besteht, wird später nach mehr Golfigkeit suchen.
Vielen Dank an Vartan in den Kommentaren für den
signum
Vorschlagquelle
return s[0].compareTo(s[1]);
11-Z
Rückkehr nicht-1
, es kehrt zurück1
."A".compareTo("Z")
zurück-25
. Unglücklicherweise.i = a!=b ? b-a : s[1].compareTo(s[0]);
Ich scheine es nicht zu verstehen ... Außerdem könnten Sie vielleicht Math.signum verwenden und sich sparen, wenn Sie i erklären;Perl, 31 Bytes
30 Bytes + 1 Byte für
-p
. Akzeptiert Eingaben auf STDIN.Erläuterung
Wenn die Operanden
cmp
unterschiedliche Längen haben, wiechicken
undegg
, werden sie wie folgt ausgerichtet:so dass
egg
>chicken
(\0
ist ein Null-Byte). Aber wir möchten, dass sie so ausgerichtet werden:so dass
chicken
>egg
.Dazu verketten wir sie einmal mit
chicken
vorheregg
und einmal mitegg
vorherchicken
:Nachdem unsere beiden Zeichenfolgen gleich lang sind, entfernen wir das führende Wort mit einem XOR, um Folgendes zu erhalten:
Und jetzt können wir
cmp
herausfinden, was zuerst kam. (Dort habe ich es gesagt!)quelle
Python 2, 88 Zeichen
cmp
Wenn Sie zwei Zeichenfolgen unterschiedlicher Länge haben, ist dies nicht das Richtige. Daher muss ich beide mit dem Nullzeichen (das inord
konvertiert wird0
) auffüllen, um diesen Fall zu behandeln. Leider wurden dadurch etwa 35 Zeichen hinzugefügt, und es sind jetzt zwei Zeilen anstelle von einer, da ich sowohl die Länge der Eingabe als auch die Iteration darüber benötige.quelle
1-2
, der Rückgaben1
zurückgeben sollte-1
. Clevere Arbeit.11-A
Fall fehl , der zurückgegeben werden sollte-1
, anstatt1
in diesem Beispiel zurückzukehren.R, 54 Bytes
Dies erfordert die Pracma-Bibliothek. Es teilt die Eingabezeichenfolge auf der
-
. Rechts rechtfertigt die Zeichenfolgen. Rang sie und macht einen Unterschied.Für 11-7 erhalten wir also die Zeichenfolgen "11" und "7". Der Rang von diesen ist [2, 1]. Der Unterschied beträgt -1. Für 3h ~ J * -3h ~ J * erhalten wir "3h ~ J *" und "3h ~ J *". Der Rang von diesen ist [1,5, 1,5] mit einem Unterschied von 0.
Testbeispiele
quelle
CoffeeScript,
143140139Hier ist eine jsfiddle mit den Ergebnissen (siehe in der Konsole)
quelle
PERL,
4636 BytesKonvertiert die argv-Liste in eine Zeichenfolge, teilt sie durch den Bindestrich in ein links- und rechtsseitiges Argument ohne Leerzeichen auf und gibt dann einen cmp-Aufruf zurück.
quelle
"@ARGV"=~/-/;print$`cmp$'
cmp
, aber es funktioniert nicht, wenn die Stringlängen unterschiedlich sind."A" cmp "9"
ist 1, während"11" cmp "Z"
-1 ist, obwohl beide Eingänge für diese Herausforderung den gleichen Wert zurückgeben sollten.Python 3, 84 Bytes
Teilen Sie die eingegebene Zeichenfolge durch
"-"
. Konvertieren Sie die Unicode-Zeichenfolgen in Byte-Zeichenfolgen und interpretieren Sie diese Byte-Zeichenfolgen als Big-Endian-Ganzzahlen. Führen Sie zum Schluss den Vergleich durch - (un) ist zum Glückcmp
in Python 3 nicht mehr verfügbar.Python 2, 69 Bytes
quelle
print
und entfernencmp
.Python 2, 79 Bytes
Ziemlich einfache Lösung und leicht zu verstehen. Vergleicht die Zeichenfolgenlängen und vergleicht die Zeichenfolgen dann lexigraphisch.
Probieren Sie es hier aus
quelle
perl5, 64
Führen Sie es einfach über die Befehlszeile aus. mit einer neuen linie würde es zwar besser aussehen aber das kostet 1 char.
Diese längere Version behandelt nicht übereinstimmende Längen korrekt.
quelle
/-/,$_=$`cmp$'
wäre einfacher, und Sie können das-aF-
Bit überspringen . Außerdem zähle ich dies als 20 (16 für$_=$F[1]cmp$F[0]
und 4 fürpaF-
, in einer Datei gespeichert und ausgeführt alsperl -paF- file.pl
).cmp
bemerkt habe , funktioniert es nicht, wenn die beiden Saiten unterschiedlich lang sind, wie bei11-Z
./-/;$_=length$'<=>length$`||$' cmp$`
und Golf spielen-p
. ($`
Speichert alles vor dem regulären Ausdruck,$'
speichert alles danach.) Die Verwendungmap
kostet tatsächlich mehr Bytes als nurlength
zweimaliges Aufrufen .F #, 53
Dies ist in der Form eine anonyme Funktion (Lambda), daher müssen Sie sie einfügen und den Parameter direkt nach is (oder unter Verwendung der Piping-Notation) angeben. Zum Beispiel (in FSI):
quelle
JavaScript ES6,
4643 Bytesquelle
11-Z
sollte zurückkehren,-1
aber es kehrt zurück1
.'11'>'Z'
wenn'11'<'ZZ'
die Frage nichts darüber enthält, wie Zeichenfolgen unterschiedlicher Länge verglichen werden sollen oder welchen Wert eine leere Zeichenfolge hat?Ruby, 59 Bytes
quelle
05AB1E ,
12119 BytesProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle