Produzieren Sie das kürzeste Programm, das zwei Ganzzahlen mit Vorzeichen als Eingabe (durch stdin oder als Argumente) verwendet und 3 verschiedene Ausgaben anzeigt, je nachdem, ob die erste Zahl (1) größer als, (2) kleiner als oder (3) gleich der zweiten ist Nummer.
Der Fang
Sie können keines der folgenden Elemente in Ihrem Programm verwenden:
- Die Standardvergleichsoperatoren:
<
,>
,<=
,>=
,==
,!=
. - Jede Bibliothek Datei abgesehen von
conio
,stdio
oderiostream
. - Beliebiges Nicht-ASCII- oder nicht druckbares ASCII-Zeichen.
Der Gewinner
Das Programm mit der kürzesten Anzahl von Zeichen gewinnt.
code-golf
restricted-source
c
c++
Hain
quelle
quelle
abs
ohne die Bibliotheksdatei einzuschließen (weil der Compiler es sowieso weiß) ist auch nicht erlaubt?Antworten:
53 Bytes
Nur das erste Zeichen der Ausgabe ist relevant. Die drei verschiedenen Ausgänge sind:
Es funktioniert für den gesamten Eingabebereich von int auf allen Plattformen, auf denen sizeof (long)> sizeof (int) ist.
Bearbeiten: Es kostet ein zusätzliches Zeichen, wenn Fall 3 stattdessen ein '+' ausgibt:
quelle
Vielleicht fehlt mir etwas in den Regeln, aber ...
81 Bytes
Gibt
00
ifa > b
,-10
ifa == b
und-1-1
if ausa < b
.quelle
long long
könnte mehr als 64 Bit sein,int
könnte so groß sein, dass Sie überlaufen könnten, das Ergebnis der Rechtsverschiebung negativer Werte wird durch die Implementierung definiert. Nahezu alle von C abgeleiteten Antworten weisen ähnliche Probleme auf.sizeof
.90 Bytes
Wenn wir verwenden können
stdio
, warum nicht die Formatierungsfunktionen verwenden, um einen Vergleich durchzuführen?Setzt ASCII-kompatible Codierung und Little-Endianness voraus.
72 Bytes
Quotienten werden auf Null gerundet, aber Rechtsverschiebungen werden (in der Praxis) "abgerundet". Das ist ein totes Werbegeschenk.
6579 BytesEine weitere Unterscheidungseigenschaft von negativen Zahlen ist, dass sie ein negatives Modulo erzeugen. Dieser hängt überhaupt nicht von der Ganzzahldarstellung ab; es funktioniert sogar mit meinem 8-Bit-Toaster mit über 127 Bit! Oh, und da wir verwenden können
conio
, warum spart man nicht zwei Bytes mitputch
? Nun, wenn ich nur meine Kopie von TurboC finden könnte ...BEARBEITEN : Behandle große Unterschiede, vorausgesetzt sie
long long
sind größer alsint
.quelle
%d
s in Ihrem brauchenscanf
, um zwei ganze Zahlen eindeutig zu analysieren. Gute Idee!a = 1, b = 23
unda = 12, b = 3
. Würden Sie nicht brauchen , setzen123
auf STDIN in jedem Fall?1 23
und12 3
als Eingaben).6461 ZeichenGibt die Zeichenwerte -1, 0 und 1 für weniger als, gleich oder größer als aus.
Diese Implementierung stützt sich auf undefiniertes Verhalten, um
b
vom Typ zu seinint
und Eingaben außerhalb des BereichsINT_MIN / 2
zu ermöglichenINT_MAX / 2
. Auf Plattformen, auf denen ein vorzeichenbehafteter Überlauf auftritt, egal ob 2s-Komplement (im Grunde alle) oder Vorzeichengröße, schlägt dies für 25% der möglichen Paare von gültigen fehlint
. Interessanterweise (für mich jedenfalls) funktioniert es auf Plattformen, auf denen signierte Überläufe gesättigt sind, korrekt.quelle
a-b
überläuft.-(2^14)
und2^14 - 1
auf allen kompatiblen Plattformen, und auf den meisten Plattformen wird sie wahrscheinlich für einen wesentlich größeren Bereich funktionieren. Bei allen anderen Antworten werden an dieser Stelle Annahmen über die Größe des Typs, die relative Größe des Typs oder die Darstellung getroffen.main(a,b)
ist bereits undefiniertes Verhalten, daher funktioniert garantiert keine der Antworten. Keine Sorge, Portabilität.66102 BytesLiest die Ganzzahlen aus STDIN und gibt
0
(a <b),1
(a> b) oder2
(a == b) aus.Bearbeiten: Jetzt sollte es auch für Unterschiede funktionieren, die zu groß sind, um in eine 32-Bit-Ganzzahl zu passen. Ich bin mir sicher, dass verschachtelte Ternäre mit ein bisschen mehr Magie verkürzt werden können.
quelle
52 Bytes
Leider funktioniert dies nur für positive ganze Zahlen, aber ich fand das Konzept der Verwendung rein arithmetischer Operatoren interessant:
Ausgänge:
quelle
putchar(a/b-b/a)
ist viel kürzer.5954 Zeichen54 Zeichen mit einem Compiler wie gcc, der nichts ausmacht
main(x,y)
:59 Zeichen sonst:
Ausgabe:
quelle
main(x,y)
in gcc funktioniert. Sie können also diese 5 Bytes aus Ihrer Zeichenanzahl entfernen.66 Bytes
a == b
Gibt das Byte 0x00 if , 0x01 ifa < b
und 0xff if ausa > b
.Da Nicht-ASCII- oder nicht druckbare ASCII-Zeichen in [my] -Programmen und wenn etwas in der Frage nicht ausdrücklich verboten ist, ist es zulässig , dass nicht druckbare Zeichen in der Ausgabe vollständig in Ordnung sind.
quelle
long
64-Bit.87 Zeichen
Verwenden Sie den 2 ^ 31-Trick, um in vorzeichenlose ints zu konvertieren
Umwandlung der Division in vorzeichenlos, um das obere Bit als Daten und nicht als Vorzeichen zu behandeln
Mit ^ zu XOR a und b, wenn sie gleich sind, wird 0 zurückgegeben
Verwenden verschachtelter Bedingungen (?), Um "<", ">" oder "=" für den Feed zu puts () zu erhalten
quelle
71 Bytes
http://ideone.com/uvXm6c
quelle
z=x-y
und ich bin mir ziemlich sicher, dass sie notwendig sind. Sie können auch zwei Zeichen speichern, indem Sie49,
50 und51
direkt verwenden, anstatt sie hinzuzufügen48
.-2000000000 2000000000
, sowie für jede andere Kombination von Ganzzahlen, die einen Überlauf bei der Subtraktion verursachen.68 Zeichen
Setzt ASCII-Zeichen 1, 2 oder 3 für kleiner als, größer als oder gleich.
quelle
a-b
überläuft.8889 BytesDies beginnt mit dem Hinzufügen von
1<<31
(INT_MIN
) zu a und b, sodass 0 jetzt entsprichtINT_MIN
. Dann schleifen und dekrementieren Sie a und b bei jeder Schleife, bis entweder 0 ist, und geben dann 0, 1 oder 2 aus, je nachdem, ob a, b oder beide 0 sind.120119 BytesEs ist nicht die kürzeste Lösung, könnte aber von einem besseren Golfer als mir ein bisschen heruntergolfen werden. (Oder einfach Leute mit mehr C-Kenntnissen als ich)
Die Idee ist, jedes Bit zu maskieren, beginnend mit dem linken und auf Ungleichheit zu prüfen. Der Rest sollte sich erklären. Da negative Zahlen mit einem 1-Bit beginnen, invertiere ich zuerst das erste Bit mit
a^=1<<31
.quelle
;)
Smiley sollte ein trauriger);
Smiley sein. 2.a&b
prüft nur, oba
und welcheb
Bits gemeinsam sind; du brauchst&&
.Ich glaube, ich werde nicht einmal versuchen, Kurzcode zu schreiben. Ich werde versuchen, diesen Vergleich so durchzuführen, dass er gemäß der C99-Spezifikation portabel ist.
Der Modulo-Operator behält das Vorzeichen bei, kann aber durchaus eine Null (einschließlich einer negativen Null) erzeugen, sodass wir sicherstellen, dass sowohl ein ungerader als auch ein gerader Wert für die Überprüfung verfügbar sind (auch ohne zu wissen, ob wir ein Einsen-Komplement verwenden). Arithmetische Operationen können überlaufen, werden jedoch nicht bitweise ausgeführt. Indem sichergestellt wird, dass sowohl gesetzte als auch gelöschte Bits vorhanden sind, vermeiden wir, dass unsere Zahl versehentlich in eine negative Null oder einen Trap-Wert konvertiert wird. Die Tatsache, dass zwei Operationen erforderlich sind, um dies seltsam zu tun, sollte keine Rolle spielen, da die mögliche Trap-Darstellung kein undefiniertes Verhalten hervorruft, bis ein Wert eingegeben wird. Wenn Sie die Operation mit umgeschaltetem Bit 0 ausführen, erhalten Sie genau einen Rest ungleich Null. Mit der Kenntnis beider Zeichen können wir entscheiden, wie mit dem Vergleich verfahren werden soll.
Diese Methode kann eine von wenigen sein, die das Extrahieren des Vorzeichens einer ganzzahligen negativen Null ermöglichen. Wir lösen das, indem wir explizit auf Null prüfen. Wenn wir wirklich Golf spielen würden, könnten wir natürlich den Vergleich von zwei Nullen zulassen, um auch die Subtraktion durchzuführen.
quelle
C 80 Zeichen
Es gibt '<', '>' oder '=' aus, wie es sollte.
C 63 Zeichen
Ein neuer Ansatz:
Druckt '1', '2' oder '3'.
quelle
In 64 Zeichen ohne stdio.h
a,b;main(){scanf("%d%d",&a,&b);puts((a-b)>>31?"<":a^b?">":"=");}
Gibt '>' aus, wenn a> b, '<', wenn a <b, '=', wenn a == b int overflow UB ist. Nur nicht überlaufen.
quelle