Kiedy (x == x + 2)? [Zamknięte]

90

Wyzwanie: Zdefiniuj xw taki sposób, aby wyrażenie (x == x+2)miało wartość true.

Oznacziłem pytanie jako C, ale odpowiedzi w innych językach są mile widziane, o ile są kreatywne lub podkreślają interesujący aspekt języka.

Mam zamiar zaakceptować rozwiązanie typu C, ale inne języki mogą uzyskać mój głos.

  1. Prawidłowo - działa na implementacjach zgodnych ze standardami. Wyjątek - przyjęcie implementacji podstawowych typów, jeśli jest to powszechna implementacja (np. Założenie, że intjest to uzupełnienie 32-bitowe 2) jest OK.
  2. Prosty - powinien być mały, używaj podstawowych funkcji językowych.
  3. Ciekawe - przyznaję, subiektywne. Mam kilka przykładów tego, co uważam za interesujące, ale nie chcę udzielać wskazówek. Aktualizacja : Unikanie preprocesora jest interesujące.
  4. Szybko - pierwsza dobra odpowiedź zostanie zaakceptowana.

Po uzyskaniu 60 odpowiedzi (nigdy nie spodziewałem się takiego oskarżenia), może warto je streścić.

60 odpowiedzi dzieli się na 7 grup, z których 3 można zaimplementować w języku C, pozostałe w innych językach:

  1. Preprocesor C. #define x 2|0zasugerowano, ale istnieje wiele innych możliwości.
  2. Zmiennoprzecinkowy. Duże liczby, nieskończoność lub NaN działają wszystkie.
  3. Wskaźnik arytmetyczny. Wskaźnik do ogromnej struktury powoduje dodanie 2 w celu zawinięcia.

    Reszta nie działa z C:

  4. Przeciążenie operatora - A +nie dodaje się lub ==zawsze zwraca true.
  5. Wykonywanie xpołączenia funkcji (niektóre języki pozwoli go bez x()składni). Następnie za każdym razem może zwrócić coś innego.
  6. Jednobitowy typ danych. Potem x == x+2 (mod 2).
  7. Zmiana 2- jakiś język pozwala ci to przypisać 0.
ugoren
źródło
29
Dlaczego 4. Quick? Masz na myśli „Ktokolwiek zna i ma szczęście, by najpierw przeczytać to pytanie”?
Luc
6
@ugoren Pozwól społeczności głosować (i głosuj na tych, których lubisz), a następnie wybierz najlepszą odpowiedź po około 7 dniach :)
Luc
3
Odnośnie możliwości 2: NaN nie działa. NaN + 2 to znowu NaN, ale NaN == NaN jest fałszem.
Martin B
2
Rozwiązanie Scala, w którym x jest zestawem zawierającym „2”, a + oznacza add to Setstandardową bibliotekę, bez redefiniowania +siebie, nie pasuje do tych 7 kategorii, IMHO.
użytkownik nieznany
2
Dlaczego to pytanie i wszystkie odpowiedzi Community Wiki?
mbomb007

Odpowiedzi:

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

Wyjścia 1.

Link: http://ideone.com/dL6A5

l0n3_sh4rk
źródło
7
float x=1./0jest nieco krótszy i być może bardziej elegancki. Ale tak czy inaczej, to z pewnością pierwsza dobra odpowiedź.
ugoren
1
Ahh stary dobry podział przez zero. Zrozumienie tego zajęło mi więcej czasu, niż chciałbym przyznać. haha
Grant
Argh, też o tym myślałem, ale w systemie Windows nie można go skompilować, więc go upuściłem. :( +1
Tudor
x = 1e999 to inny sposób na zrobienie tego.
shiona
4
@shiona float x=1e20wystarczyłoby
l0n3sh4rk
125

Fortran IV:

2=0

Po tym każda stała 2 w programie wynosi zero. Zaufaj mi, zrobiłem to (ok 25 lat temu)

1497298
źródło
23
Tym bardziej, że nigdy nie dotykam Fortrana.
C0deH4cker
3
Czy to przynajmniej rzuca ostrzeżenie?
Michael Stern,
15
@MichaelStern OSTRZEŻENIE: ZMIENIAJESZ WARTOŚĆ 2!
Cruncher
100

To wydaje się działać:

#define x 2|0

Zasadniczo wyrażenie jest rozszerzone na (2|0 == 2|(0+2)). Jest to dobry przykład, dlaczego należy używać nawiasów podczas definiowania makr.

Proszę wstać
źródło
3
Z pewnością działa i myślę, że jest to najbardziej eleganckie rozwiązanie oparte na preprocesorze. Ale myślę, że zrobienie tego bez preprocesora jest bardziej interesujące.
ugoren
Czy to tylko ja, czy powinienem 2|(0+2)być 1?
phunehehe,
1
@phunehehe: |jest bitowe LUB ; ||jest logiczne LUB.
PleaseStand
20
To w jakiś sposób przypomina mi małe stoły Bobby'ego.
vsz
1
@rakeshNS: Dodałem dodatkowy zestaw nawiasów, aby pokazać pierwszeństwo operatora . Dlatego powiedziałem „Zasadniczo”.
wstać
79

Brainfuck

x

To oczywiście trochę rozciąga „ocenianie na prawdziwe”, ponieważ w Brainfuck nic tak naprawdę niczego nie ocenia - manipulujesz tylko taśmą. Ale jeśli teraz dodasz swoje wyrażenie

x
(x == x+2)

program jest równoważny z

+

(ponieważ wszystko oprócz <>+-[],.jest komentarzem). Co tylko podnosi wartość w miejscu, w którym jesteśmy teraz. Taśma jest inicjowana ze wszystkimi zerami, więc kończymy na 1 na pozycji kursora, co oznacza „prawda”: jeśli teraz zaczęlibyśmy sekcję warunkową [], to wchodziłby / zapętlał.

przestał się obracać w lewo
źródło
12
+1 Musi być najbardziej kreatywnym gięciem zasad.
ninjalj
3
Dlaczego potrzebne x?
James
3
@James Pytanie mówi, aby zdefiniować, xwięc tutaj xjest zdefiniowane jako x.
user80551
1
@James odpowiedź nie ma neednic oprócz+
Cruncher
56

FA#

let (==) _ _ = true
let x = 0
x == (x + 2) //true
Daniel
źródło
13
Ten mi się podoba. Zamiast żonglować liczbami, po prostu przedefiniuj znaczenie ==
evilcandybag
4
Poczekaj, czy operator równości w F # nie jest po prostu =? ==nie jest nawet domyślnie zdefiniowany.
Jwosty
50

do

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

Uwaga: może nie działać, jeśli FLT_EVAL_METHOD != 0(patrz komentarze poniżej).

Paul R.
źródło
24
+1 dla aplikacji w świecie rzeczywistym. Zbyt wielu ludzi nie rozumie matematyki zmiennoprzecinkowej.
Tim S.
1
@ mbomb007: Myślę, że są różne - odpowiedź, na której link się opierasz INF + 2 == INF, podczas gdy moja odpowiedź używa pojedynczej liczby zmiennoprzecinkowej, która jest wystarczająco duża, aby 2 było mniejsze niż jeden ULP.
Paul R
2
@ mbomb007: Myślę też, że są bardzo różne - ∞ + 2 = ∞jest to coś, co każdy może zrozumieć i nie zależy od niczego specyficznego dla komputera, podczas gdy dodanie 2 do konkretnej liczby i bezskuteczne jest nieco bardziej zaskakujące i specyficzne dla ograniczonej precyzji komputerów i bardziej interesujące IMHO
GoatInTheMachine
1
Może to łatwo zawieść, gdy FLT_EVAL_METHOD == 1matematyka jest wykonywana jako double. Polecam większą wartość FP, która z pewnością przewyższy nawet long doubleprecyzję, jak1.0e37f
chux
1
@chux: dzięki za potwierdzenie - to zdecydowanie coś, na co będę musiał uważać w przyszłości, ponieważ większość mojego kodu kończy się na wielu platformach.
Paul R
36

DO#

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

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

Nie krótki, ale nieco elegancki.

http://ideone.com/x56Ul

fjdumont
źródło
4
Cholera, właśnie dostałem odznakę „Dobra odpowiedź” dla tego postu. Poważnie, zdobywając odznaki za ZŁE rzeczy ?! Nie rób tego w domu !
fjdumont,
To zło, ale takie piękne ...
Kevin
32

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


Haskell: Zdefiniuj ℤ / 2ℤ na Booleans:

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

wtedy dla każdego x :: Boolbędziemy mieli x == x + 2.

Aktualizacja: Dzięki za pomysły w komentarzu odpowiednio zaktualizowałem instancję.

Petr Pudlák
źródło
3
Możesz uprościć:fromInteger = odd
Rotsor,
1
Również (+)może być zdefiniowana jako (/=)wierzę.
MatrixFrog,
2
Krótszym rozwiązaniem byłoby utworzenie instancji ().
Thomas Eding,
31

Pyton

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

# Then (x == x+2) == True
grc
źródło
Miły. Wszystkie języki obsługujące przeciążanie operatora mogą korzystać z podobnych rozwiązań, ale C nie jest jednym z nich.
ugoren
Działa również z przeciążeniem __cmp__jako class X(int):__cmp__=lambda*x:0(lub __eq__nieco dłużejclass X(int):__eq__=lambda*x:True
dr jimbob
Kilka znaków krótszych, jeśli nie przedłużasz od int ..class X:__add__=lambda s,o:s
Doboy
Czy mogę zapytać, co robi to mnożenie?
patrz
2
@ TheRare to właściwie nie mnożenie. Ponieważ __add__zwykle podaje się wiele argumentów ( lambda x,y:), zapisuję niektóre znaki, używając * do spakowania wszystkich argumentów w krotkę ( lambda *y:). Zobacz dokumenty, aby uzyskać więcej informacji.
grc
31

GNU C obsługuje struktury bez elementów i rozmiar 0:

struct {} *x = 0;
Han
źródło
2
Bardzo dobrze! Myślałem o arytmetyki wskaźników z bardzo dużymi danymi prowadzącymi do zawijania, ale nie myślałem o czymś przeciwnym.
ugoren
26

PHP:

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

Lub:

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

Wynik:

bool (prawda)

Dzhuneyt
źródło
1
Tak naprawdę próbowałem wymyślić tę niewiarygodnie prostą odpowiedź PHP, ale pobiłaś mnie.
wstać
25

Jest powszechnym błędnym przekonaniem, że w C białe znaki nie mają znaczenia. Nie wyobrażam sobie, żeby ktoś nie wymyślił tego w GNU C:

#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;
}

Wydruki 1.

H2CO3
źródło
Fajnie, choć być może nie jest technicznie poprawne ( x == x+2nadal jest fałszywe). Ale kiedy pojawi się ten pomysł, myślę, że #define x -2*__LINE__jest bardziej elegancki.
ugoren
3
@ugoren dzięki! Jeśli chcesz, aby wszystko to było w jednej linii, użyj COUNTER zamiast LINE - wymaga jednak GCC 4.3+.
H2CO3,
1
_CATjest zastrzeżonym identyfikatorem. Wszystko, co zaczyna się od podkreślenia i wielkiej litery, jest zastrzeżone w C.
Konrad Borowski
@xxix dokładnie tak, zaktualizowano, aby usunąć UB.
H2CO3
20

do

Jest to bardziej interesujące bez użycia makr i bez nadużywania nieskończoności.

/////////////////////////////////////
// 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);

Wypróbuj, jeśli w to nie wierzysz!

rev vsz
źródło
1
0. Nie, wciąż w to nie wierz.
MSalters,
@MSalters: Jakiego kompilatora używasz? Możliwe, że masz wyłączone kaligrafie.
vsz
VS2010. Całkiem możliwe, że trygrafy są domyślnie wyłączone. Albo to, albo konkatenacja linii nie działa??\
MSalters
MSalters: kaligraf ??\ ma zostać przekształcony w jeden \ , więc nie ma ??\ . Niektóre współczesne kompilatory domyślnie jednak wyświetlają ostrzeżenia zarówno dla linii trójdzielnych, jak i dla konkatenacji linii, nawet jeśli są włączone.
vsz
18

Matematyka:

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

Myślę, że to rozwiązanie jest nowatorskie, ponieważ wykorzystuje koncepcję Mathematica dotyczącą wyższych wartości.

EDYTOWAĆ:

Rozszerzam swoją odpowiedź, aby wyjaśnić, co w Mathematica oznaczają „Up Values” .

Pierwszy wiersz zasadniczo redefiniuje dodawanie symbolu x. Mógłbym bezpośrednio zapisać taką definicję w funkcji globalnej związanej z +symbolem, ale taka redefinicja byłaby niebezpieczna, ponieważ redefinicja może się nieprzewidywalnie rozprzestrzeniać za pomocą wbudowanych algorytmów Mathematica .

Zamiast tego, używając tagu x/:, skojarzyłem definicję z symbolem x. Teraz, gdy Mathematica widzi symbol x, sprawdza, czy jest on obsługiwany przez operatora dodawania +według wzoru, w x + 2 + ___którym symbol___ oznacza możliwą zerową sekwencję innych symboli.

Ta redefinicja jest bardzo szczegółowa i wykorzystuje szerokie możliwości dopasowania wzorców przez Mathematica . Na przykład wyrażenie x+y+2zwraca x+y, ale wyrażenie x+3zwraca x+3; ponieważ w pierwszym przypadku wzorzec można dopasować, ale w drugim przypadku wzorzec nie może być dopasowany bez dodatkowego uproszczenia.

Carl Morris
źródło
1
Myślę, że powinieneś wyjaśnić, co to robi. Większość ludzi nie zna matematyki (ani tego, jakie są wyższe wartości).
ugoren
1
Dziękuję @ugoren, spędzam większość czasu na stronie Mathematica Stack Exchange, więc zapomniałem wyjaśnić, co uczyniło mój przykład znaczącym. Dokonałem edycji, która wyjaśnia tę koncepcję tak zwięźle, jak mogłem.
Carl Morris,
17

JavaScript:

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

Przetestuj skrzypce

Briguy37
źródło
2
Możesz użyć Infinitylub -Infinity, i z tego powodu możesz użyć skrótu x = 1/0.
zzzzBov,
6
@zzzzBov: To zdecydowanie lepszy kod golfowy. Wybrałem (99999999999999999 == 99999999999999999+2)ponieważ myślę, że jest to trochę bardziej interesująca niż (Infinity == Infinity+2), choć jak mówi OP „to subiektywne” :)
Briguy37
Jest to jedyny przypadek w świecie rzeczywistym, w którym widziałem taki sprawdzian z ważnego powodu (oprócz zagadek programistycznych): funkcja wydziału (oparta na -1liczbach zmiennoprzecinkowych) sprawdzała, czy dane wejściowe są zbyt świetne, by je odliczać i powtarzać . Samym językiem był Python, ale w tym przypadku tak naprawdę nie ma to znaczenia.
Alfe
5
@NicoBurns not ture :(
ajax333221
2
@NicoBurns, uruchomienie tego kodu w konsoli powoduje false; gdziekolwiek otrzymujesz te informacje w JS są błędne i nie należy im ufać.
zzzzBov
17

schemat

(define == =)
(define (x a b c d) #t)
(x == x + 2)
;=> #t
użytkownik1651640
źródło
Miły. Schemat (x == x + 2)wygląda podobnie do C, ale oznacza zupełnie inną rzecz.
ugoren
1
Teraz zrób to dla (= x 2).
Joe Z.
(define (x a b c d) #t):)
Cruncher
@ugoren jest to zdefiniowane w tym celu przez ten program. x jest tutaj po prostu nazwą funkcji. I tak jest ==
Cruncher
16

Oczywista odpowiedź:

Kiedy to się skończy:

while (x != x+2) { }
printf("Now");
daniero
źródło
1
+1 meta.codegolf.stackexchange.com/a/1070/8766, ale w rzeczywistości jest to genialne.
user80551,
1
Myślę, że while(!(x == x+2)) {}byłoby bardziej w duchu
Cruncher
Ta odpowiedź poprzedza ten meta post za dwa lata. Wszystko, co dziś jest uważane za frazes, w pewnym momencie było nowością.
daniero
16

Oto rozwiązanie dla JavaScript, które nie wykorzystuje Infinityi -Infinityskrajnych przypadków dodawania zmiennoprzecinkowego. Nie działa to ani w Internet Explorerze 8 i niższych, ani w opcjonalnym trybie ścisłym ES5. Nie nazwałbym tego withoświadczenia i pobierających szczególnie „zaawansowanymi” funkcjami.

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

Edytowano, aby dodać: Powyższa sztuczka jest również możliwa bez użycia withi get, jak zauważył Andy E w Wskazówki dotyczące gry w JavaScript w JavaScript, a także jncraton na tej stronie:

var x = { $: 0, valueOf: function(){return 2 * x.$++;} };
console.log(x == x+2);
PleaseStand
źródło
Fajna koncepcja - xwywołanie funkcji, choć wygląda jak odczyt zmiennej. Zakładam kolejność oceny od lewej do prawej, ale jest OK, ponieważ jest określona w JS (w przeciwieństwie do C).
ugoren
14

Następujące C nie jest zgodne ze standardami C , ale powinno działać na dowolnej platformie 64-bitowej:

int (*x)[0x2000000000000000];
Han
źródło
Zasadniczo świetnie, ale wydaje się być źle wdrożony. xbędą zwiększane w krokach 2 ^ 61, więc x + 8będą równe x.
ugoren
@ugoren, działa dla mnie w systemie Linux z 4 bajtami int.
han
Masz całkowitą rację. Brakowało mi faktu, że jest to tablica int, a nie char.
ugoren
10

Szałwia:

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

zwraca True

Ogólnie dla GF (2 ** n) zawsze jest prawdą, że x = x + 2 dla dowolnego x

To nie jest błąd ani problem z przepełnieniem lub nieskończonością, to jest właściwie poprawne

dspyz
źródło
1
Ta sama sztuczka działa z PARI / GP
Hagen von Eitzen,
10

Common Lisp

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

Jest to dość łatwe, gdy xnie musi być rzeczywistą wartością.

JB
źródło
8

APL (Dyalog)

X←1e15
X=X+2

APL nawet nie nieskończoność, to po prostu, że pływaki nie są wystarczająco precyzyjne, aby odróżnić 1.000.000.000.000.000a 1.000.000.000.000.002. Jest to, o ile wiem, jedyny sposób, aby to zrobić w APL.

marinus
źródło
Bardzo mi się to podoba, ponieważ jest to pierwsza odpowiedź na wykorzystanie precyzji float.
AndrewKS
1
@AndrewKS: Właściwie Paul R był nieco wcześniej.
MSalters
8

Perl 6

Jestem zaskoczony, że nie widziałem wcześniej tego rozwiązania. W każdym razie rozwiązaniem jest - co, jeśli xjest 0i 2od razu? my \xw tym przykładzie deklaruje zmienną sigilless - to pytanie dotyczy x, a nie stylu Perla $x. ?? !!Jest operatorem trójskładnikowych.

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

Ale...

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

xto wiele wartości jednocześnie. xjest równy 0i 2od razu. x + 2jest równy 2i 4od razu. Więc logicznie są równi.

GlitchMr
źródło
8

Python 2.X (Korzystanie z przedefiniowania liczb całkowitych (buforowanych))

Zauważyłem, że wszystkie odpowiedzi w pythonie mają zdefiniowane klasy, które na nowo definiują + operator. Odpowiem jeszcze bardziej niskopoziomową demonstracją elastyczności pytona. (To jest fragment kodu specyficzny dla python2)

W Pythonie liczby całkowite są przechowywane mniej więcej w ten sposób w C:

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

Oznacza to, że struktura z size_t, void *i longobiektu, w tej kolejności.
Kiedy już użyjemy, a zatem buforujemy liczbę całkowitą, możemy użyć ctypesmodułu Pythona do przedefiniowania tej liczby całkowitej, aby nie tylko to zrobiło x == x+2, ale2 == 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

Wydruki

True
True
jsvk
źródło
7

Perl

za pomocą podprogramu z efektami ubocznymi na zmienną pakietu:

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

Wynik: true!

memowe
źródło
1
sub x{}„działa” również… (przynajmniej w mojej wersji 5.10.1), ale nie mogę zrozumieć, dlaczego…
mykhal,
2
Ponieważ sub x{}zwraca albo undef, albo pustą listę, z których obie są cyframi zero. A x + 2 jest analizowane jako x (+2). perl -MO=Deparseujawniaprint "true\n" if x() == x(2);
Perleone,
To niesamowite, @mykhal i @Perleone!
memowe
7

Pyton

wykorzystanie precyzji zmiennoprzecinkowej sprawia, że ​​jest to bardzo proste.

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

Aby uczynić go mniej specyficznym dla systemu, wymaga dodatkowego importu

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

Powinno to działać również w innych językach. Działa to, ponieważ reprezentacja 100000000000000000.0 i 100000000000000002.0 jest dokładnie taka sama dla komputera, ze względu na sposób, w jaki zmiennoprzecinkowe są reprezentowane wewnątrz maszyny. patrz http://en.wikipedia.org/wiki/IEEE_floating_point aby uzyskać więcej informacji.

Będzie to w zasadzie działać w każdym języku, który pozwala na dodawanie liczb całkowitych do liczb zmiennoprzecinkowych i uzyskanie wyniku typu zmiennoprzecinkowego.

Jens Timmerman
źródło
6

Oto rozwiązanie dla C ++ oparte na przeciążeniu operatora. Opiera się na niejawnej konwersji z an enumna 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;
}
Proszę wstać
źródło
Możesz użyć std::boolalphazamiast ?:.
Jon Purdy
5

Wiem, że to wyzwanie kodowe ... ale grałem w golfa. Przepraszam.

Rubin - 13 znaków - Rozwiązanie Infinity

x=1e17;x==x+2

zwraca true

Ruby - 41 znaków - Rozwiązania przeciążania operacyjnego

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

lub

class A;def self.+ y;A end end;x=A;x==x+2
AndrewKS
źródło
5

Jeśli można trochę skorzystać z pytania, dodam nową Javę. Sztuczka na pewno nie jest nowa, ale być może interesujące, że jest to możliwe w Javie.

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));
}

A wyniki:

(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-
źródło
4

To rozwiązanie VBScript działa podobnie do mojego rozwiązania JavaScript. Nie korzystałem z preprocesora, ale rozwiązanie wydaje się trywialne.

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

If x = x + 2 Then
    WScript.Echo "True"
Else
    WScript.Echo "False"
End If
Proszę wstać
źródło
Zamierzałem zamieścić to samo rozwiązanie w rubinie, dopóki nie zobaczyłem twojego - jest to możliwe, ponieważ oba języki pozwalają na pominięcie nawiasów.
waldrumpus,