Wann ist (x == x + 2)? [geschlossen]

90

Die Herausforderung: Definieren Sie xso, 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.

  1. Richtig - Funktioniert bei standardkonformen Implementierungen. Ausnahme - vorausgesetzt, eine Implementierung der intBasistypen ist in Ordnung , wenn es sich um eine allgemeine Implementierung handelt (z. B. vorausgesetzt, es handelt sich um das 32-Bit-2-Komplement).
  2. Einfach - sollte klein sein, grundlegende Sprachfunktionen verwenden.
  3. 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.
  4. 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:

  1. Der C-Präprozessor. #define x 2|0wurde vorgeschlagen, aber es gibt viele andere Möglichkeiten.
  2. Gleitkomma. Große Zahlen, Unendlich oder NaN funktionieren.
  3. Zeigerarithmetik. Ein Zeiger auf eine riesige Struktur bewirkt, dass 2 hinzugefügt wird.

    Der Rest funktioniert nicht mit C:

  4. Überladen von Operatoren - Ein +, das nicht hinzugefügt wird, oder ein ==, das immer true zurückgibt.
  5. Macht xeinen Funktionsaufruf ( in einigen Sprachen erlauben es , ohne die x()Syntax). Dann kann es jedes Mal etwas anderes zurückgeben.
  6. Ein Ein-Bit-Datentyp. Dann x == x+2 (mod 2).
  7. Ändern 2- in einigen Sprachen können Sie es zuweisen 0.
ugoren
quelle
29
Warum 4. Quick? Sie meinen "Wer kennt einen und hat das Glück, diese Frage zuerst zu lesen"?
Luc
6
@ugoren Lassen Sie die Community abstimmen (und stimmen Sie selbst für diejenigen ab, die Sie mögen), und wählen Sie dann nach etwa 7 Tagen die beste Antwort aus :)
Luc
3
Zu Möglichkeit 2: NaN funktioniert nicht . NaN + 2 ist wieder NaN, aber NaN == NaN ist falsch.
Martin B
2
Die Scala-Lösung, bei der x ein Set ist, das '2' enthält, und + bedeutet, dass add to Setdie Standardbibliothek, ohne sich neu zu definieren +, nicht in diese 7 Kategorien passt, IMHO.
Benutzer unbekannt
2
Warum gibt es diese Frage und alle Antworten im Community Wiki?
mbomb007

Antworten:

71
main()
{
double x=1.0/0.0;
printf("%d",x==x+2);
}

Ausgänge 1.

Link: http://ideone.com/dL6A5

l0n3_sh4rk
quelle
7
float x=1./0ist etwas kürzer und vielleicht eleganter. Aber das ist sicherlich die erste gute Antwort.
Ugoren
1
Ahh gute alte Division durch Null. Das hat mich länger gekostet, als ich zugeben möchte. haha
Grant
Argh, ich denke auch darüber nach, aber unter Windows lässt sich das nicht kompilieren, also habe ich es fallen gelassen. :( +1 obwohl
Tudor
x = 1e999 ist eine andere Möglichkeit, dies zu tun.
Shiona
4
@ shiona float x=1e20wäre genug
l0n3sh4rk
125

Fortran IV:

2=0

Danach ist jede Konstante 2 im Programm Null. Vertrau mir, ich habe das getan (ok, vor 25 Jahren)

user1497298
quelle
23
Umso mehr Grund für mich, Fortran nie anzufassen.
C0deH4cker
3
Wirft es zumindest eine Warnung?
Michael Stern
15
@MichaelStern ACHTUNG: SIE ÄNDERN DEN WERT VON 2!
Cruncher
100

Das scheint zu funktionieren:

#define x 2|0

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.

PleaseStand
quelle
3
Sicher funktioniert, und ich denke, es ist die eleganteste auf Präprozessoren basierende Lösung. Aber ich finde es interessanter, es ohne den Präprozessor zu machen.
Ugoren
Ist es nur ich oder sollte es 2|(0+2)sein 1?
Phunehehe
1
@phunehehe: |ist bitweises ODER ; ||ist logisch ODER.
PleaseStand
20
Das erinnert mich irgendwie an kleine Bobby Tables.
vsz
1
@rakeshNS: Ich habe die zusätzlichen Klammern hinzugefügt, um die Priorität des Operators anzuzeigen . Deshalb habe ich "Im Grunde" gesagt.
PleaseStand
79

Brainfuck

x

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

x
(x == x+2)

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.

hörte auf, sich gegen den Uhrzeigersinn zu drehen
quelle
12
+1 Muss das kreativste Verbiegen der Regeln sein.
Ninjalj
3
Warum brauchst du das x?
James
3
@James Die Frage, die definiert xwerden soll, xist definiert als x.
user80551
1
@ James die Antwort gibt neednichts weiter als die+
Cruncher
56

F #

let (==) _ _ = true
let x = 0
x == (x + 2) //true
Daniel
quelle
13
Ich mag dieses. Anstatt Zahlen zu jonglieren, definieren Sie einfach die Bedeutung von ==
evilcandybag
4
Moment, ist der Gleichheitsoperator in F # nicht einfach =? ==ist nicht einmal standardmäßig definiert.
Jwosty
50

C

int main() { float x = 1e10; printf("%d\n", x == x + 2); }

Hinweis: funktioniert möglicherweise nicht, wenn FLT_EVAL_METHOD != 0(siehe Kommentare unten).

Paul R
quelle
24
+1 für reale Anwendungen. Zu viele Leute verstehen Fließkomma-Mathematik nicht.
Tim S.
1
@ mbomb007: Ich denke, sie sind unterschiedlich - die Antwort, auf die Sie verweisen, basiert auf INF + 2 == INFmeiner Antwort auf einem einzelnen Präzisions-Float, der groß genug ist, dass 2 weniger als ein ULP ist.
Paul R
2
@ mbomb007: Ich denke auch, dass sie sehr unterschiedlich sind - das ∞ + 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 IMHO
GoatInTheMachine
1
Dies kann leicht scheitern, wenn FLT_EVAL_METHOD == 1die Mathematik als erledigt ist double. Empfehlen Sie einen größeren FP-Wert, der sogar die long doubleGenauigkeit von1.0e37f
chux
1
@chux: danke für die bestätigung - das ist definitiv etwas, worauf ich in zukunft achten muss, da ein großer teil meines codes plattformübergreifend ist.
Paul R
36

C #

class T {
  static int _x;
  static int X { get { return _x -= 2; } }

  static void Main() { Console.WriteLine(X == X + 2); }
}

Kein Shortie, aber etwas elegant.

http://ideone.com/x56Ul

fjdumont
quelle
4
Verdammt, ich habe gerade ein "Nice Answer" -Abzeichen für diesen Beitrag erhalten. Ernsthaft, Abzeichen für das BÖSE bekommen ?! Mach das nicht zu Hause !
Fjdumont
Es ist böse, aber es ist so schön ...
Kevin
32

Scala: { val x = Set(2); (x == x + 2) }


Haskell: Definiere ℤ / 2ℤ auf Booleans:

instance Num Bool where
    (+) = (/=)
    (-) = (+)
    (*) = (&&)
    negate = id
    abs    = id
    signum = id
    fromInteger = odd

dann für alle, die x :: Boolwir haben x == x + 2.

Update: Danke für die Ideen im Kommentar, ich habe die Instanz entsprechend aktualisiert.

Petr Pudlák
quelle
3
Sie können vereinfachen:fromInteger = odd
Rotsor
1
Auch (+)kann definiert werden , wie (/=)ich glaube.
MatrixFrog
2
Kürzere Lösung wäre, eine Instanz für zu machen ().
Thomas Eding
31

Python

class X(int):__add__=lambda*y:0
x=X()

# Then (x == x+2) == True
grc
quelle
Nett. Alle Sprachen, die das Überladen von Operatoren unterstützen, können ähnliche Lösungen verwenden, aber C ist keine davon.
Ugoren
Funktioniert auch mit Überladung __cmp__als class X(int):__cmp__=lambda*x:0(oder __eq__wenn auch etwas längerclass X(int):__eq__=lambda*x:True
dr jimbob
Ein paar Zeichen kürzer, wenn Sie nicht von int verlängern ..class X:__add__=lambda s,o:s
Doboy
Darf ich fragen, was diese Multiplikation bewirkt?
Siehe auch
2
@TheRare es ist eigentlich keine Multiplikation. Da __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 .
Grc
31

GNU C unterstützt Strukturen ohne Mitglieder und Größe 0:

struct {} *x = 0;
han
quelle
2
Sehr schön! Ich dachte über Zeigerarithmetik mit sehr großen Datenmengen nach, die zu einem Umbruch führten, dachte aber nicht an das Gegenteil.
Ugoren
26

PHP:

$x = true;
var_dump($x == $x+2);

Oder:

var_dump(!($x==$x+2));

Ausgabe:

bool (wahr)

Dzhuneyt
quelle
1
Eigentlich habe ich versucht, diese absolut einfache PHP-Antwort zu finden, aber Sie haben mich geschlagen.
PleaseStand
25

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:

#include <stdio.h>
#define CAT_IMPL(c, d) (c ## d)
#define CAT(c, d) CAT_IMPL(c, d)
#define x CAT(a, __LINE__)

int main()
{
    int a9 = 2, a10 = 0;
    printf("%d\n", x ==
        x + 2);
    return 0;
}

Druckt 1.

H2CO3
quelle
Nett, wenn auch vielleicht nicht technisch gültig ( x == x+2ist immer noch falsch). Aber wenn Sie einmal auf die Idee gekommen sind, finde ich #define x -2*__LINE__sie eleganter.
Ugoren
3
@ugoren danke! Wenn Sie möchten, dass sich all dies in einer Zeile befindet, verwenden Sie COUNTER anstelle von LINE - erfordert jedoch GCC 4.3+.
H2CO3
1
_CATist reservierte Kennung. Alles, was mit einem Unterstrich und einem Großbuchstaben beginnt, ist in C.
Konrad Borowski
@ xfix das ist genau richtig, aktualisiert um UB zu entfernen.
H2CO3
20

C

Es ist interessanter, ohne Makros zu verwenden und ohne die Unendlichkeit zu missbrauchen.

/////////////////////////////////////
// At the beginning                 /
// We assume truth!                 /

int truth = 1;
int x = 42;

/////////////////////////////////////
// Can the truth really be changed??/
truth = (x == x + 2);

/////////////////////////////////////
// The truth cannot be changed!     /
printf("%d",truth);

Probieren Sie es aus, wenn Sie es nicht glauben!

vsz
quelle
1
0. Nein, glaube es immer noch nicht.
MSalters
@MSalters: Welchen Compiler benutzt du? Möglicherweise sind Trigraphen deaktiviert.
vsz
VS2010. Möglicherweise sind Trigraphen standardmäßig deaktiviert. Entweder das oder die Verkettung von Zeilen funktioniert nicht??\
MSalters
MSalters: Die Trigraphie ??\ 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.
vsz
18

Mathematica:

x /: x + 2 := x
x == x + 2

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üpft x. Immer wenn Mathematica das Symbol sieht x, prüft es, ob es vom Additionsoperator +in einem Muster der Form x + 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+2zurück x+y, aber der Ausdruck gibt x+3zurück x+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.

Carl Morris
quelle
1
Ich denke, Sie sollten erklären, was es tut. Die meisten Leute kennen Mathematica nicht (oder was Up Values ​​sind).
Ugoren
1
Vielen Dank, @ugoren, ich verbringe die meiste Zeit auf der Mathematica Stack Exchange-Website und habe vergessen zu erklären, warum mein Beispiel so aussagekräftig war. Ich habe einen Schnitt gemacht, der das Konzept so kurz wie möglich erklärt.
Carl Morris
17

Javascript:

var x = 99999999999999999;
alert(x == x+2);​

Testen Sie Fiddle

Briguy37
quelle
2
Sie können Infinityoder verwenden -Infinity, und aus diesem Grund können Sie die Verknüpfung von verwenden x = 1/0.
zzzzBov
6
@zzzzBov: Das ist definitiv ein besserer Code Golf. Ich wählte, (99999999999999999 == 99999999999999999+2)weil ich denke, es ist ein bisschen interessanter als (Infinity == Infinity+2), obwohl, wie das OP sagt, "es ist subjektiv" :)
Briguy37
Dies ist der einzige reale Fall, in dem ich aus einem guten Grund einen -1solchen 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.
Alfe
5
@NicoBurns nicht ture :(
Ajax333221
2
@NicoBurns, das diesen Code in der Konsole ausführt, erzeugt false; Überall dort, wo Sie diese Informationen über JS erhalten, sind sie falsch und sollten nicht als vertrauenswürdig eingestuft werden.
zzzzBov
17

planen

(define == =)
(define (x a b c d) #t)
(x == x + 2)
;=> #t
user1651640
quelle
Nett. Schema (x == x + 2)sieht genauso aus wie C, bedeutet aber eine ganz andere Sache.
Ugoren
1
Jetzt mach es für (= x 2).
Joe Z.
(define (x a b c d) #t):)
Cruncher
@ugoren dies wird von diesem Programm definiert, um dies zu tun. x ist hier einfach ein Name einer Funktion. Und so ist ==
Cruncher
16

Offensichtliche Antwort:

Wenn dies endet:

while (x != x+2) { }
printf("Now");
daniero
quelle
1
+1 meta.codegolf.stackexchange.com/a/1070/8766 aber das ist eigentlich genial.
user80551
1
Ich denke, es while(!(x == x+2)) {}wäre mehr im Geiste
Cruncher
Diese Antwort geht dem Metapost mit zwei Jahren voraus. Alles, was heute als Klischee gilt, war irgendwann neu.
Daniero
16

Hier ist eine Lösung für JavaScript, die die Infinityund -InfinityRandfälle der Gleitkommazugabe nicht ausnutzt . Dies funktioniert weder in Internet Explorer 8 und darunter noch im strengen Opt-In ES5-Modus. Ich würde die withAussage und Getter nicht als besonders "erweiterte" Funktionen bezeichnen.

with ({ $: 0, get x() {return 2 * this.$--;} }) {
    console.log(x == x+2);
}

Bearbeitet, um hinzuzufügen: Der obige Trick ist auch ohne Verwendung von withund möglich get, wie von Andy E in Tipps zum Golfen in JavaScript und auch von jncraton auf dieser Seite angegeben:

var x = { $: 0, valueOf: function(){return 2 * x.$++;} };
console.log(x == x+2);
PleaseStand
quelle
Ein nettes Konzept - machen Sie xeinen 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).
Ugoren
14

Das Folgende entspricht nicht den Standards C , sollte jedoch auf nahezu jeder 64-Bit-Plattform funktionieren:

int (*x)[0x2000000000000000];
han
quelle
Im Prinzip großartig, scheint aber falsch implementiert zu sein. xwürde in Schritten von 2 ^ 61 inkrementiert werden, x + 8wäre also gleich x.
Ugoren
@ugoren, es funktioniert bei mir unter Linux mit 4-Byte int.
Han
Du hast absolut recht. Ich vermisste die Tatsache, dass es eine Reihe von ist int, nicht char.
Ugoren
10

Salbei:

x=Mod(0,2)
x==x+2

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

dspyz
quelle
1
Der gleiche Trick funktioniert mit PARI / GP
Hagen von Eitzen
10

Common Lisp

* (defmacro x (&rest r) t)
X
* (x == x+2)
T

Es ist ziemlich einfach, wenn xes kein tatsächlicher Wert sein muss.

JB
quelle
8

APL (Dyalog)

X←1e15
X=X+2

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.000und zu erkennen 1.000.000.000.000.002. Dies ist meines Wissens die einzige Möglichkeit, dies in APL zu tun.

Marinus
quelle
Ich mag das wirklich, weil es die erste Antwort ist, die die Präzision des Schwimmers ausnutzt.
AndrewKS
1
@AndrewKS: Eigentlich war Paul R etwas früher.
MSalters
8

Perl 6

Ich bin überrascht, diese Lösung vorher nicht zu sehen. Wie auch immer, die Lösung ist - was ist, wenn xist 0und 2auf einmal? my \xIn diesem Beispiel wird eine sigilless-Variable deklariert. Bei dieser Frage xgeht es nicht um den Perl-Stil $x. Der ?? !!ist ein ternärer Operator.

$ perl6 -e 'my \x = 0|2; say x == x + 2 ?? "YES" !! "NO"'
YES

Aber...

$ perl6 -e 'my \x = 0|2; say x == x + 3 ?? "YES" !! "NO"'
NO

xist mehrere Werte gleichzeitig. xist gleich 0und 2auf einmal. x + 2ist gleich 2und 4auf einmal. Also logischerweise sind sie gleich.

GlitchMr
quelle
8

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:

typedef struct {            // NOTE: Macros have been expanded
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
    long ob_ival;
} PyIntObject;

Das heißt, eine Struktur mit einem size_t, void *und longObjekt, in dieser Reihenfolge.
Sobald wir eine Ganzzahl verwenden und daher zwischenspeichern, können wir das Python- ctypesModul verwenden, um diese Ganzzahl neu zu definieren, sodass dies nicht nur der Fall ist x == x+2, sondern2 == 0

import ctypes
two = 2 # This will help us access the address of "2" so that we may change the value

# Recall that the object value is the third variable in the struct. Therefore,
# to change the value, we must offset the address we use by the "sizeof" a 
# size_t and a void pointer
offset = ctypes.sizeof(ctypes.c_size_t) + ctypes.sizeof(ctypes.c_voidp)

# Now we access the ob_ival by creating a C-int from the address of 
# our "two" variable, offset by our offset value.
# Note that id(variable) returns the address of the variable.
ob_ival = ctypes.c_int.from_address(id(two)+offset)

#Now we change the value at that address by changing the value of our int.
ob_ival.value = 0

# Now for the output
x = 1
print x == x+2
print 2 == 0

Druckt

True
True
jsvk
quelle
7

Perl

Verwenden eines Unterprogramms mit Nebenwirkungen auf eine Paketvariable:

sub x () { $v -= 2 }
print "true!\n" if x == x + 2;

Ausgabe: true!

memowe
quelle
1
sub x{}"funktioniert" auch .. (zumindest in meinem 5.10.1), aber ich kann nicht herausfinden warum ..
Mykhal
2
Weil 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=Deparseenthülltprint "true\n" if x() == x(2);
Perleone
Das ist großartig, @mykhal und @Perleone!
memowe
7

Python

Die Ausnutzung der Gleitkommapräzision macht dies sehr einfach.

>>> x = 100000000000000000.0
>>> (x == x+2)
True

Um es weniger systemspezifisch zu machen, ist ein zusätzlicher Import erforderlich

>>> import sys
>>> x = float(sys.maxint + 1)
>>> (x == x+2)
True

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.

Jens Timmerman
quelle
6

Hier ist eine Lösung für C ++ basierend auf der Überladung von Operatoren. Es beruht auf der impliziten Konvertierung von einem enumin einen int.

#include <iostream>

enum X {};
bool operator==(X x, int y)
{
    return true;
}

int main()
{
    X x;
    std::cout << std::boolalpha << (x == x+2) << std::endl;
    return 0;
}
PleaseStand
quelle
Sie können std::boolalphaanstelle von verwenden ?:.
Jon Purdy
5

Ich weiß, es ist eine Code-Herausforderung ... aber ich habe es gespielt. Es tut uns leid.

Ruby - 13 Zeichen - Infinity-Lösung

x=1e17;x==x+2

gibt true zurück

Ruby - 41 Zeichen - Op Überladungslösungen

class Fixnum;def + y;0 end end;x=0;x==x+2

oder

class A;def self.+ y;A end end;x=A;x==x+2
AndrewKS
quelle
5

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.

static void pleaseDoNotDoThis() throws Exception {
    Field field = Boolean.class.getField("FALSE");
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, true);
}

public static void main(String args[]) throws Exception {
    pleaseDoNotDoThis();
    doit(1);
    doit("NO");
    doit(null);
    doit(Math.PI);
}

static void doit(long x) {
    System.out.format("(x == x + 2) = (%d == %d) = %s\n", x, x+2, (x == x + 2));
}

static void doit(String x) {
    System.out.format("(x == x + 2) = (%s == %s) = %s\n", x, x+2, (x == x + 2));
}

static void doit(double x) {
    System.out.format("(x == x + 2) = (%f == %f) = %s\n", x, x+2, (x == x + 2));
}

Und die Ergebnisse:

(x == x + 2) = (1 == 3) = true
(x == x + 2) = (NO == NO2) = true
(x == x + 2) = (null == null2) = true
(x == x + 2) = (3,141593 == 5,141593) = true
(x == x + 2) = (Infinity == Infinity) = true
tb-
quelle
4

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.

y = 0
Function x
x = y
y = -2
End Function

If x = x + 2 Then
    WScript.Echo "True"
Else
    WScript.Echo "False"
End If
PleaseStand
quelle
Ich wollte die gleiche Lösung in Ruby veröffentlichen, bis ich Ihre sah - es ist möglich, weil beide Sprachen das Weglassen der Klammern zulassen.
Waldrumpus