Ist 7 l8r als 9? (Ist sieben später als neun?)

10

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-9als Eingabe sollte zurückkehren 1.

7Konvertiert in ASCII-Code 55und 9konvertiert in ASCII-Code 57.

Wie 57numerisch danach auftritt 55, 9ist später als 7.

Ein anderes Beispiel:

LKzb-LKaj als Eingabe sollte zurückkehren -1

Die ASCII-Codesequenzen hierfür sind 76-75-122-98und76-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 jspäter als b, zspä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
Sam Weaver
quelle
1
Sind die beiden Saiten garantiert gleich lang?
Es1024
5
Testfall 11-Z-> -1macht angesichts des aktuellen Wortlauts der Frage keinen Sinn. Z(90) ist größer als 1(49) und der bedeutendste Buchstabe. Bitte klären Sie, wie Saiten unterschiedlicher Länge verglichen werden.
George Reith
2
Und was ist mit A-AA?
2
@SamWeaver Ich weiß, dass ganz links die bedeutendste Ziffer ist, daher meine Verwirrung darüber, warum 11>Zin Ihren Beispielen wann 1<Z. Es muss ein undefiniertes Verhalten geben, das mit Zeichenfolgen unterschiedlicher Länge zu tun hat, sonst ist das Beispiel falsch.
George Reith
3
Wie zuvor erläutert: Jede Zeichenfolge ist als Ziffer in einer Basis-127-Zahl zu behandeln. Wenn Sie in diesem System zählen würden, würden Sie mit einem Zeichen beginnen, es bis zur Barriere der druckbaren Zeichen ~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.
Sam Weaver

Antworten:

11

Pyth - 11 Bytes

Einfach, verwendet ._Zeichen, um das Zeichen Czu erhalten und Zeichencodes zu erhalten.

._-F_CMcz\-

Probieren Sie es hier online aus .

Testsuite .

._               Sign of number
 -F              Fold subtraction (this finds difference of a tuple)
  _              Reverse list to get correct order of operands when subtracting
   CM            Map char, already treats strings as digits of base256 number
    c \-         Split by "-"
     z           Input
Maltysen
quelle
Sehr schön! Funktioniert wie erwartet.
Sam Weaver
7

CJam, 12 Bytes

l'-/esfb~\-g

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

l   e# Read a line from STDIN.
'-/ e# Split it at spaces.
es  e# Push the current time (milliseconds since epoch).
fb  e# Consider each string as digits in base huge-number.
~\  e# Dump the results and reverse their order.
-g  e# Subtract and apply sign function.
Dennis
quelle
Ausgezeichnet! Dies besteht alle Testfälle.
Sam Weaver
6

Java, 86 118

int f(String...s){return(int)Math.signum((s=s[0].split("-"))[1].compareTo(s[0])*(s[0].length()==s[1].length()?1:-1));}  

Eine 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 signumVorschlag

Geobits
quelle
Gibt Java's Vergleich nicht sowieso 1,0, -1 zurück? Ich weiß, dass dies nicht garantiert ist, aber gibt es einen Fall dafür nicht? in diesem Fallreturn s[0].compareTo(s[1]);
Vartan
Das ist schön, aber es besteht den Testfall der 11-ZRückkehr nicht -1, es kehrt zurück 1.
Sam Weaver
Ah, das war mir nicht klar, bevor diese Testfälle hinzugefügt wurden. Fest.
Geobits
@Vartan Nein, es wird die Wertdifferenz an der ersten nicht übereinstimmenden Position zurückgegeben (oder die Längendifferenz, wenn alle Zeichen übereinstimmen). Gibt zum Beispiel "A".compareTo("Z") zurück-25 . Unglücklicherweise.
Geobits
Können Sie diese Zeile erklären? 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;
Vartan
4

Perl, 31 Bytes

#!/usr/bin/perl -p
/-/;$_=($`.$'^$`)cmp($'.$`^$')

30 Bytes + 1 Byte für -p. Akzeptiert Eingaben auf STDIN.

Erläuterung

Wenn die Operanden cmpunterschiedliche Längen haben, wie chickenund egg, werden sie wie folgt ausgerichtet:

c  h  i  c  k  e  n
e  g  g  \0 \0 \0 \0

so dass egg> chicken( \0ist ein Null-Byte). Aber wir möchten, dass sie so ausgerichtet werden:

c  h  i  c  k  e  n
\0 \0 \0 \0 e  g  g

so dass chicken> egg.

Dazu verketten wir sie einmal mit chickenvorher eggund einmal mit eggvorher chicken:

c  h  i  c  k  e  n  e  g  g
e  g  g  c  h  i  c  k  e  n

Nachdem unsere beiden Zeichenfolgen gleich lang sind, entfernen wir das führende Wort mit einem XOR, um Folgendes zu erhalten:

\0 \0 \0 \0 \0 \0 \0 e  g  g
\0 \0 \0 c  h  i  c  k  e  n

Und jetzt können wir cmpherausfinden, was zuerst kam. (Dort habe ich es gesagt!)

ThisSuitIsBlackNot
quelle
Sehr klug - Bravo!
Sam Weaver
3

Python 2, 88 Zeichen

a=raw_input().split('-');print-cmp(*(map(ord,s.rjust(max(map(len,a)),'\0'))for s in a))

cmpWenn Sie zwei Zeichenfolgen unterschiedlicher Länge haben, ist dies nicht das Richtige. Daher muss ich beide mit dem Nullzeichen (das in ordkonvertiert wird 0) 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.

Alex Van Liew
quelle
Dies ist leider keine gültige Lösung. Der folgende Testfall : 1-2, der Rückgaben 1zurückgeben sollte -1. Clevere Arbeit.
Sam Weaver
Hoppla, es scheint, dass die Operanden vertauscht sind. Das ist super komisch, ich habe es mit ein paar deiner Testfälle getestet und ich dachte, es hat gut funktioniert! Egal, ich kann es ändern, ohne die Anzahl der Zeichen zu ändern. Probieren Sie es jetzt aus.
Alex Van Liew
Ihre Bearbeitung hat diesen Fall behoben, aber jetzt schlägt der 11-AFall fehl , der zurückgegeben werden sollte -1, anstatt 1in diesem Beispiel zurückzukehren.
Sam Weaver
Ich mag deine Regeln für die Länge nicht. Ich habe es auf Kosten von ungefähr 35 Zeichen repariert und ich glaube nicht, dass ich es besser machen könnte.
Alex Van Liew
1
Ich habe es geschafft, eine kürzere Antwort als Ihre zu erhalten, indem ich die Zeichenfolge in das Hex-Format codiert und diese Zeichenfolge dann als int analysiert habe. In Python 2 scheint dies standardmäßig auf Big-Endianness zu setzen. Somit ist die 0-Polsterung nicht mehr erforderlich.
Dünen
2

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.

diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))

Testbeispiele

> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: LKzb-LKaj
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: A-9
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 11-Z
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 3h~J*-3h~J*
3: 
Read 2 items
[1] 0
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: Xv-Y0
3: 
Read 2 items
[1] 1
MickyT
quelle
Klug. Gute Arbeit :)
Alex A.
2

CoffeeScript, 143 140 139

f=(s)->[a,b]=((t=s.split '-').map (y)->Array((m=Math.max) 1, 1+(m ((l=(c)->c.length) t[0]),l t[1])-l y).join('\u0000')+y);`b<a?-1:(b>a?1:0)`

Hier ist eine jsfiddle mit den Ergebnissen (siehe in der Konsole)

danielrw7
quelle
2

PERL, 46 36 Bytes

print$2cmp$1if"@ARGV"=~/(\S+)-(\S+)/

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

Eric
quelle
Ich vermute, Sie können eine Reihe von Leerzeichen und die loswerden;
MickyT
Sollte in der Lage sein, "@ARGV"=~/-/;print$`cmp$'
durchzukommen
1
Gute Idee zu verwenden 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.
ThisSuitIsBlackNot
1

Python 3, 84 Bytes

x,y=[int.from_bytes(i.encode(),"big")for i in input().split("-")];print((x<y)-(y<x))

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ück cmpin Python 3 nicht mehr verfügbar.

Python 2, 69 Bytes

print -cmp(*[int(i.encode("hex"),16)for i in raw_input().split("-")]) 
Dünen
quelle
Sie können einen Charakter rasieren, indem Sie den Abstand zwischen printund entfernen cmp.
Alex Van Liew
1

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

s,t=raw_input().split('-')
x,y=len(s),len(t)
print(x<y)*2-1if x-y else cmp(t,s)
mbomb007
quelle
1

perl5, 64

perl -aF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

Führen Sie es einfach über die Befehlszeile aus. mit einer neuen linie würde es zwar besser aussehen aber das kostet 1 char.

perl -laF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

Diese längere Version behandelt nicht übereinstimmende Längen korrekt.

hildred
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ür paF-, in einer Datei gespeichert und ausgeführt als perl -paF- file.pl).
Primo
1
Wie ich in Erics Antwortcmp bemerkt habe , funktioniert es nicht, wenn die beiden Saiten unterschiedlich lang sind, wie bei 11-Z.
ThisSuitIsBlackNot
@ThisSuitIsBlackNot, behoben.
Hildred
Nett. Sie können das bis 39 mit /-/;$_=length$'<=>length$`||$' cmp$`und Golf spielen -p. ( $`Speichert alles vor dem regulären Ausdruck, $'speichert alles danach.) Die Verwendung mapkostet tatsächlich mehr Bytes als nur lengthzweimaliges Aufrufen .
ThisSuitIsBlackNot
0

F #, 53

fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a

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

> "7-9" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
1
> "abc-abc" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
0
> "LKzb-LKaj" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
-1
Jwosty
quelle
0

JavaScript ES6, 46 43 Bytes

f=s=>((a=s.split('-'))[1]>a[0])-(a[1]<a[0])
George Reith
quelle
Gute Arbeit, aber dies führt nicht zu Testfall 2: 11-Zsollte zurückkehren, -1aber es kehrt zurück 1.
Sam Weaver
1
@ SamWeaver In der Tat, das wurde nach der Antwort hinzugefügt und bricht auch andere Antworten. Können Sie erklären, warum, '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?
George Reith
Die Absicht der Frage änderte sich nie, ich fügte nur diese Testfälle und Klarstellungen hinzu, weil mir klar wurde, dass ich am Anfang nicht klar genug war. Sie haben Recht, dass ich den Wert einer leeren Zeichenfolge nie definiert habe, und ich werde die Frage entsprechend aktualisieren. Diese Testfälle haben das Verhalten oder das Ziel der Frage nicht verändert, sondern lediglich geklärt. Die von Ihnen genannten Beispiele funktionieren als solche, da jedes Zeichen als einzelne "Ziffer" in einer Zahl behandelt werden muss, deren Basis allen druckbaren ASCII-Zeichen entspricht. Diese Mechanik der Frage hat sich nie geändert, wurde einfach klarer.
Sam Weaver
1
@SamWeaver Wenn Sie von undefiniertem zu definiertem Verhalten wechseln, wird dies geändert. Nichts ist kein Charakter. Es sei denn, es ist das Nullzeichen, das damit behandelt wird.
George Reith
0

Ruby, 59 Bytes

a,b=gets.chomp.split ?-
p (b.size<=>a.size).nonzero?||b<=>a
daniero
quelle
0

05AB1E , 12 11 9 Bytes

'-¡₄ö¥0.S

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

'-¡          # Split the (implicit) input on '-'
             #  i.e. 'LKzb-LKaj' → ['LKzb','LKaj']
   ₄ö        # Convert both parts to a Base-1000 number
             #  i.e. ['LKzb','LKaj'] → [21020061037,21020036045]
     ¥       # Push the deltas (subtraction between each sub sequential pair) of the list
             #  i.e. [21020061037,21020036045] → [-24992]
      0.S    # Get the sign [1 for a>0; -1 for a<0; 0 for a==0] (and output implicitly)
             #  i.e. [-24992] → [-1]
Kevin Cruijssen
quelle