Die Herausforderung: Definieren Sie x
so, dass der Ausdruck (x == x+2)
als wahr bewertet wird.
Ich habe die Frage mit C markiert, aber Antworten in anderen Sprachen sind willkommen, sofern sie kreativ sind oder einen interessanten Aspekt der Sprache hervorheben.
Ich beabsichtige, eine C-Lösung zu akzeptieren, aber andere Sprachen können meine Stimme bekommen.
- Richtig - Funktioniert bei standardkonformen Implementierungen. Ausnahme - vorausgesetzt, eine Implementierung der
int
Basistypen ist in Ordnung , wenn es sich um eine allgemeine Implementierung handelt (z. B. vorausgesetzt, es handelt sich um das 32-Bit-2-Komplement). - Einfach - sollte klein sein, grundlegende Sprachfunktionen verwenden.
- Interessant - es ist subjektiv, gebe ich zu. Ich habe einige Beispiele für das, was ich für interessant halte, aber ich möchte keine Hinweise geben. Update : Das Vermeiden des Präprozessors ist interessant.
- Schnell - Die erste gute Antwort wird akzeptiert.
Nach 60 Antworten (mit einer solchen Erwartung hätte ich nie gerechnet) kann es gut sein, sie zusammenzufassen.
Die 60 Antworten sind in 7 Gruppen unterteilt, von denen 3 in C implementiert werden können, der Rest in anderen Sprachen:
- Der C-Präprozessor.
#define x 2|0
wurde vorgeschlagen, aber es gibt viele andere Möglichkeiten. - Gleitkomma. Große Zahlen, Unendlich
oder NaNfunktionieren. Zeigerarithmetik. Ein Zeiger auf eine riesige Struktur bewirkt, dass 2 hinzugefügt wird.
Der Rest funktioniert nicht mit C:
- Überladen von Operatoren - Ein
+
, das nicht hinzugefügt wird, oder ein==
, das immer true zurückgibt. - Macht
x
einen Funktionsaufruf ( in einigen Sprachen erlauben es , ohne diex()
Syntax). Dann kann es jedes Mal etwas anderes zurückgeben. - Ein Ein-Bit-Datentyp. Dann
x == x+2 (mod 2)
. - Ändern
2
- in einigen Sprachen können Sie es zuweisen0
.
math
arithmetic
c
ugoren
quelle
quelle
4. Quick
? Sie meinen "Wer kennt einen und hat das Glück, diese Frage zuerst zu lesen"?add to Set
die Standardbibliothek, ohne sich neu zu definieren+
, nicht in diese 7 Kategorien passt, IMHO.Antworten:
Ausgänge 1.
Link: http://ideone.com/dL6A5
quelle
float x=1./0
ist etwas kürzer und vielleicht eleganter. Aber das ist sicherlich die erste gute Antwort.float x=1e20
wäre genugFortran IV:
Danach ist jede Konstante 2 im Programm Null. Vertrau mir, ich habe das getan (ok, vor 25 Jahren)
quelle
Das scheint zu funktionieren:
Grundsätzlich wird der Ausdruck zu erweitert
(2|0 == 2|(0+2))
. Es ist ein gutes Beispiel dafür, warum man beim Definieren von Makros Klammern verwenden sollte.quelle
2|(0+2)
sein1
?|
ist bitweises ODER ;||
ist logisch ODER.Brainfuck
Dabei wird natürlich ein wenig gedehnt, um "wahr zu bewerten", da in Brainfuck nichts tatsächlich zu etwas bewertet wird - Sie manipulieren nur ein Band. Aber wenn Sie jetzt Ihren Ausdruck anhängen
Das Programm ist äquivalent zu
(weil alles aber
<>+-[],.
ein Kommentar ist). Was nichts anderes tut, als den Wert zu erhöhen, wo wir jetzt sind. Das Band wird mit allen Nullen initialisiert, so dass wir an der Cursorposition eine 1 haben, was "wahr" bedeutet: Wenn wir jetzt einen bedingten Abschnitt mit[]
starten, würde er / loop eingeben.quelle
x
?x
werden soll,x
ist definiert alsx
.need
nichts weiter als die+
F #
quelle
=
?==
ist nicht einmal standardmäßig definiert.C
Hinweis: funktioniert möglicherweise nicht, wenn
FLT_EVAL_METHOD != 0
(siehe Kommentare unten).quelle
INF + 2 == INF
meiner Antwort auf einem einzelnen Präzisions-Float, der groß genug ist, dass 2 weniger als ein ULP ist.∞ + 2 = ∞
ist etwas, das jeder verstehen kann und das von nichts Computerspezifischem abhängt, wohingegen das Hinzufügen von 2 zu einer konkreten Zahl ohne Wirkung ein bisschen überraschender und spezifischer für die begrenzte Präzision ist von Computern und interessanter IMHOFLT_EVAL_METHOD == 1
die Mathematik als erledigt istdouble
. Empfehlen Sie einen größeren FP-Wert, der sogar dielong double
Genauigkeit von1.0e37f
C #
Kein Shortie, aber etwas elegant.
http://ideone.com/x56Ul
quelle
Scala:
{ val x = Set(2); (x == x + 2) }
Haskell: Definiere ℤ / 2ℤ auf
Bool
eans:dann für alle, die
x :: Bool
wir habenx == x + 2
.Update: Danke für die Ideen im Kommentar, ich habe die Instanz entsprechend aktualisiert.
quelle
fromInteger = odd
(+)
kann definiert werden , wie(/=)
ich glaube.()
.Python
quelle
__cmp__
alsclass X(int):__cmp__=lambda*x:0
(oder__eq__
wenn auch etwas längerclass X(int):__eq__=lambda*x:True
class X:__add__=lambda s,o:s
__add__
normalerweise mehrere Argumente (lambda x,y:
) angegeben werden, speichere ich einige Zeichen, indem ich * verwende, um alle Argumente in ein Tupel (lambda *y:
) zu packen . Weitere Informationen finden Sie in den Dokumenten .GNU C unterstützt Strukturen ohne Mitglieder und Größe 0:
quelle
PHP:
Oder:
Ausgabe:
quelle
Es ist ein weit verbreitetes Missverständnis, dass in C Leerzeichen keine Rolle spielen. Ich kann mir nicht vorstellen, dass jemand in GNU C nicht darauf gekommen ist:
Druckt
1
.quelle
x == x+2
ist immer noch falsch). Aber wenn Sie einmal auf die Idee gekommen sind, finde ich#define x -2*__LINE__
sie eleganter._CAT
ist reservierte Kennung. Alles, was mit einem Unterstrich und einem Großbuchstaben beginnt, ist in C.C
Es ist interessanter, ohne Makros zu verwenden und ohne die Unendlichkeit zu missbrauchen.
Probieren Sie es aus, wenn Sie es nicht glauben!
quelle
0
. Nein, glaube es immer noch nicht.??\
??\
soll in eine einzige umgewandelt werden\
, es gibt also keine??\
. Einige moderne Compiler geben jedoch standardmäßig Warnungen für Trigraphen und Linienverkettungen aus, auch wenn diese aktiviert sind.Mathematica:
Ich denke, diese Lösung ist neu, weil sie das Konzept von Mathematica von Up Values verwendet.
BEARBEITEN:
Ich erweitere meine Antwort, um zu erklären, was Up Values in Mathematica bedeuten .
Die erste Zeile definiert die Addition für das Symbol im Wesentlichen neu
x
. Ich könnte eine solche Definition direkt in der globalen Funktion speichern, die dem+
Symbol zugeordnet ist, aber eine solche Neudefinition wäre gefährlich, da sich die Neudefinition möglicherweise unvorhersehbar über die in Mathematica integrierten Algorithmen ausbreitet .Stattdessen habe
x/:
ich mithilfe des Tags die Definition mit dem Symbol verknüpftx
. Immer wenn Mathematica das Symbol siehtx
, prüft es, ob es vom Additionsoperator+
in einem Muster der Formx + 2 + ___
bearbeitet wird, in der das Symbol___
eine mögliche Nullsequenz anderer Symbole bedeutet.Diese Neudefinition ist sehr spezifisch und nutzt die umfangreichen Mustervergleichsfunktionen von Mathematica . Beispielsweise gibt der Ausdruck
x+y+2
zurückx+y
, aber der Ausdruck gibtx+3
zurückx+3
; denn im ersteren Fall könnte das Muster angepasst werden, im letzteren Fall könnte das Muster ohne zusätzliche Vereinfachung nicht angepasst werden.quelle
Javascript:
Testen Sie Fiddle
quelle
Infinity
oder verwenden-Infinity
, und aus diesem Grund können Sie die Verknüpfung von verwendenx = 1/0
.(99999999999999999 == 99999999999999999+2)
weil ich denke, es ist ein bisschen interessanter als(Infinity == Infinity+2)
, obwohl, wie das OP sagt, "es ist subjektiv" :)-1
solchen Check gesehen habe (neben dem Programmieren von Rätseln): Eine (float-basierte) Fakultätsfunktion überprüfte ihre Eingabe auf zu groß, um von ihr heruntergezählt zu werden und zu rekursiv zu werden . Die Sprache selbst war Python, aber das spielt in diesem Fall keine Rolle.false
; Überall dort, wo Sie diese Informationen über JS erhalten, sind sie falsch und sollten nicht als vertrauenswürdig eingestuft werden.planen
quelle
(x == x + 2)
sieht genauso aus wie C, bedeutet aber eine ganz andere Sache.(= x 2)
.(define (x a b c d) #t)
:)Offensichtliche Antwort:
Wenn dies endet:
quelle
while(!(x == x+2)) {}
wäre mehr im GeisteHier ist eine Lösung für JavaScript, die die
Infinity
und-Infinity
Randfälle der Gleitkommazugabe nicht ausnutzt . Dies funktioniert weder in Internet Explorer 8 und darunter noch im strengen Opt-In ES5-Modus. Ich würde diewith
Aussage und Getter nicht als besonders "erweiterte" Funktionen bezeichnen.Bearbeitet, um hinzuzufügen: Der obige Trick ist auch ohne Verwendung von
with
und möglichget
, wie von Andy E in Tipps zum Golfen in JavaScript und auch von jncraton auf dieser Seite angegeben:quelle
x
einen Funktionsaufruf, obwohl es wie eine Variable liest. Ich gehe von links nach rechts aus, aber es ist in Ordnung, da es in JS angegeben ist (im Gegensatz zu C).Das Folgende entspricht nicht den Standards C , sollte jedoch auf nahezu jeder 64-Bit-Plattform funktionieren:
quelle
x
würde in Schritten von 2 ^ 61 inkrementiert werden,x + 8
wäre also gleichx
.int
.int
, nichtchar
.Salbei:
gibt True zurück
Im Allgemeinen gilt für GF (2 ** n) immer x = x + 2 für ein beliebiges x
Dies ist kein Fehler oder ein Problem mit Überlauf oder Unendlich, es ist tatsächlich korrekt
quelle
Common Lisp
Es ist ziemlich einfach, wenn
x
es kein tatsächlicher Wert sein muss.quelle
APL (Dyalog)
APL hat nicht einmal unendlich, es ist nur so, dass die Schwimmer nicht genau genug sind, um den Unterschied zwischen
1.000.000.000.000.000
und zu erkennen1.000.000.000.000.002
. Dies ist meines Wissens die einzige Möglichkeit, dies in APL zu tun.quelle
Perl 6
Ich bin überrascht, diese Lösung vorher nicht zu sehen. Wie auch immer, die Lösung ist - was ist, wenn
x
ist0
und2
auf einmal?my \x
In diesem Beispiel wird eine sigilless-Variable deklariert. Bei dieser Fragex
geht es nicht um den Perl-Stil$x
. Der?? !!
ist ein ternärer Operator.Aber...
x
ist mehrere Werte gleichzeitig.x
ist gleich0
und2
auf einmal.x + 2
ist gleich2
und4
auf einmal. Also logischerweise sind sie gleich.quelle
Python 2.X (Verwenden der Neudefinition von (zwischengespeicherten) Ganzzahlen)
Ich habe bemerkt, dass alle Python-Antworten Klassen definiert haben, die das neu definieren
+
Operator . Ich werde mit einer noch einfacheren Demonstration der Flexibilität von Python antworten. (Dies ist ein Python2-spezifisches Snippet)In Python werden Ganzzahlen in C mehr oder weniger auf diese Weise gespeichert:
Das heißt, eine Struktur mit einem
size_t
,void *
undlong
Objekt, in dieser Reihenfolge.Sobald wir eine Ganzzahl verwenden und daher zwischenspeichern, können wir das Python-
ctypes
Modul verwenden, um diese Ganzzahl neu zu definieren, sodass dies nicht nur der Fall istx == x+2
, sondern2 == 0
Druckt
quelle
Perl
Verwenden eines Unterprogramms mit Nebenwirkungen auf eine Paketvariable:
Ausgabe:
true!
quelle
sub x{}
"funktioniert" auch .. (zumindest in meinem 5.10.1), aber ich kann nicht herausfinden warum ..sub x{}
entweder undef oder eine leere Liste zurückgegeben wird, die beide eine numerische Null sind. Und x + 2 wird als x (+2) analysiert.perl -MO=Deparse
enthülltprint "true\n" if x() == x(2);
Python
Die Ausnutzung der Gleitkommapräzision macht dies sehr einfach.
Um es weniger systemspezifisch zu machen, ist ein zusätzlicher Import erforderlich
Dies sollte auch in anderen Sprachen funktionieren. Dies funktioniert, weil die Repräsentation von 100000000000000000.0 und 100000000000000002.0 für die Maschine aufgrund der Art und Weise, wie Gleitkommazahlen innerhalb der Maschine dargestellt werden, genau gleich ist. Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/IEEE_floating_point .
Dies funktioniert also grundsätzlich in jeder Sprache, in der Sie Ganzzahlen zu Floats hinzufügen können und das Ergebnis ist ein Float.
quelle
Hier ist eine Lösung für C ++ basierend auf der Überladung von Operatoren. Es beruht auf der impliziten Konvertierung von einem
enum
in einenint
.quelle
std::boolalpha
anstelle von verwenden?:
.Ich weiß, es ist eine Code-Herausforderung ... aber ich habe es gespielt. Es tut uns leid.
Ruby - 13 Zeichen - Infinity-Lösung
gibt true zurück
Ruby - 41 Zeichen - Op Überladungslösungen
oder
quelle
Wenn es in Ordnung ist, die Frage ein wenig auszunutzen, füge ich ein neues Java hinzu. Der Trick ist sicher nicht neu, aber vielleicht interessant, dass dies in Java möglich ist.
Und die Ergebnisse:
quelle
Diese VBScript-Lösung funktioniert ähnlich wie meine JavaScript-Lösung. Ich habe noch keinen Präprozessor verwendet, aber die Lösung scheint trivial zu sein.
quelle