Wyzwanie: Zdefiniuj x
w 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.
- 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
int
jest to uzupełnienie 32-bitowe 2) jest OK. - Prosty - powinien być mały, używaj podstawowych funkcji językowych.
- 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.
- 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:
- Preprocesor C.
#define x 2|0
zasugerowano, ale istnieje wiele innych możliwości. - Zmiennoprzecinkowy. Duże liczby, nieskończoność
lub NaNdziałają wszystkie. Wskaźnik arytmetyczny. Wskaźnik do ogromnej struktury powoduje dodanie 2 w celu zawinięcia.
Reszta nie działa z C:
- Przeciążenie operatora - A
+
nie dodaje się lub==
zawsze zwraca true. - Wykonywanie
x
połączenia funkcji (niektóre języki pozwoli go bezx()
składni). Następnie za każdym razem może zwrócić coś innego. - Jednobitowy typ danych. Potem
x == x+2 (mod 2)
. - Zmiana
2
- jakiś język pozwala ci to przypisać0
.
math
arithmetic
c
ugoren
źródło
źródło
4. Quick
? Masz na myśli „Ktokolwiek zna i ma szczęście, by najpierw przeczytać to pytanie”?add to Set
standardową bibliotekę, bez redefiniowania+
siebie, nie pasuje do tych 7 kategorii, IMHO.Odpowiedzi:
Wyjścia 1.
Link: http://ideone.com/dL6A5
źródło
float x=1./0
jest nieco krótszy i być może bardziej elegancki. Ale tak czy inaczej, to z pewnością pierwsza dobra odpowiedź.float x=1e20
wystarczyłobyFortran IV:
Po tym każda stała 2 w programie wynosi zero. Zaufaj mi, zrobiłem to (ok 25 lat temu)
źródło
To wydaje się działać:
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.źródło
2|(0+2)
być1
?|
jest bitowe LUB ;||
jest logiczne LUB.Brainfuck
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
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ł.źródło
x
?x
więc tutajx
jest zdefiniowane jakox
.need
nic oprócz+
FA#
źródło
=
?==
nie jest nawet domyślnie zdefiniowany.do
Uwaga: może nie działać, jeśli
FLT_EVAL_METHOD != 0
(patrz komentarze poniżej).źródło
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.∞ + 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 IMHOFLT_EVAL_METHOD == 1
matematyka jest wykonywana jakodouble
. Polecam większą wartość FP, która z pewnością przewyższy nawetlong double
precyzję, jak1.0e37f
DO#
Nie krótki, ale nieco elegancki.
http://ideone.com/x56Ul
źródło
Scala:
{ val x = Set(2); (x == x + 2) }
Haskell: Zdefiniuj ℤ / 2ℤ na
Bool
eans:wtedy dla każdego
x :: Bool
będziemy mielix == x + 2
.Aktualizacja: Dzięki za pomysły w komentarzu odpowiednio zaktualizowałem instancję.
źródło
fromInteger = odd
(+)
może być zdefiniowana jako(/=)
wierzę.()
.Pyton
źródło
__cmp__
jakoclass X(int):__cmp__=lambda*x:0
(lub__eq__
nieco dłużejclass X(int):__eq__=lambda*x:True
class X:__add__=lambda s,o:s
__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.GNU C obsługuje struktury bez elementów i rozmiar 0:
źródło
PHP:
Lub:
Wynik:
źródło
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:
Wydruki
1
.źródło
x == x+2
nadal jest fałszywe). Ale kiedy pojawi się ten pomysł, myślę, że#define x -2*__LINE__
jest bardziej elegancki._CAT
jest zastrzeżonym identyfikatorem. Wszystko, co zaczyna się od podkreślenia i wielkiej litery, jest zastrzeżone w C.do
Jest to bardziej interesujące bez użycia makr i bez nadużywania nieskończoności.
Wypróbuj, jeśli w to nie wierzysz!
źródło
0
. Nie, wciąż w to nie wierz.??\
??\
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.Matematyka:
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 symbolemx
. Teraz, gdy Mathematica widzi symbolx
, sprawdza, czy jest on obsługiwany przez operatora dodawania+
według wzoru, wx + 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+2
zwracax+y
, ale wyrażeniex+3
zwracax+3
; ponieważ w pierwszym przypadku wzorzec można dopasować, ale w drugim przypadku wzorzec nie może być dopasowany bez dodatkowego uproszczenia.źródło
JavaScript:
Przetestuj skrzypce
źródło
Infinity
lub-Infinity
, i z tego powodu możesz użyć skrótux = 1/0
.(99999999999999999 == 99999999999999999+2)
ponieważ myślę, że jest to trochę bardziej interesująca niż(Infinity == Infinity+2)
, choć jak mówi OP „to subiektywne” :)-1
liczbach 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.false
; gdziekolwiek otrzymujesz te informacje w JS są błędne i nie należy im ufać.schemat
źródło
(x == x + 2)
wygląda podobnie do C, ale oznacza zupełnie inną rzecz.(= x 2)
.(define (x a b c d) #t)
:)Oczywista odpowiedź:
Kiedy to się skończy:
źródło
while(!(x == x+2)) {}
byłoby bardziej w duchuOto rozwiązanie dla JavaScript, które nie wykorzystuje
Infinity
i-Infinity
skrajnych 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 tegowith
oświadczenia i pobierających szczególnie „zaawansowanymi” funkcjami.Edytowano, aby dodać: Powyższa sztuczka jest również możliwa bez użycia
with
iget
, jak zauważył Andy E w Wskazówki dotyczące gry w JavaScript w JavaScript, a także jncraton na tej stronie:źródło
x
wywoł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).Następujące C nie jest zgodne ze standardami C , ale powinno działać na dowolnej platformie 64-bitowej:
źródło
x
będą zwiększane w krokach 2 ^ 61, więcx + 8
będą równex
.int
.int
, a niechar
.Szałwia:
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
źródło
Common Lisp
Jest to dość łatwe, gdy
x
nie musi być rzeczywistą wartością.źródło
APL (Dyalog)
APL nawet nie nieskończoność, to po prostu, że pływaki nie są wystarczająco precyzyjne, aby odróżnić
1.000.000.000.000.000
a1.000.000.000.000.002
. Jest to, o ile wiem, jedyny sposób, aby to zrobić w APL.źródło
Perl 6
Jestem zaskoczony, że nie widziałem wcześniej tego rozwiązania. W każdym razie rozwiązaniem jest - co, jeśli
x
jest0
i2
od razu?my \x
w tym przykładzie deklaruje zmienną sigilless - to pytanie dotyczyx
, a nie stylu Perla$x
.?? !!
Jest operatorem trójskładnikowych.Ale...
x
to wiele wartości jednocześnie.x
jest równy0
i2
od razu.x + 2
jest równy2
i4
od razu. Więc logicznie są równi.źródło
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:
Oznacza to, że struktura z
size_t
,void *
ilong
obiektu, w tej kolejności.Kiedy już użyjemy, a zatem buforujemy liczbę całkowitą, możemy użyć
ctypes
modułu Pythona do przedefiniowania tej liczby całkowitej, aby nie tylko to zrobiłox == x+2
, ale2 == 0
Wydruki
źródło
Perl
za pomocą podprogramu z efektami ubocznymi na zmienną pakietu:
Wynik:
true!
źródło
sub x{}
„działa” również… (przynajmniej w mojej wersji 5.10.1), ale nie mogę zrozumieć, dlaczego…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=Deparse
ujawniaprint "true\n" if x() == x(2);
Pyton
wykorzystanie precyzji zmiennoprzecinkowej sprawia, że jest to bardzo proste.
Aby uczynić go mniej specyficznym dla systemu, wymaga dodatkowego importu
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.
źródło
Oto rozwiązanie dla C ++ oparte na przeciążeniu operatora. Opiera się na niejawnej konwersji z an
enum
naint
.źródło
std::boolalpha
zamiast?:
.Wiem, że to wyzwanie kodowe ... ale grałem w golfa. Przepraszam.
Rubin - 13 znaków - Rozwiązanie Infinity
zwraca true
Ruby - 41 znaków - Rozwiązania przeciążania operacyjnego
lub
źródło
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.
A wyniki:
źródło
To rozwiązanie VBScript działa podobnie do mojego rozwiązania JavaScript. Nie korzystałem z preprocesora, ale rozwiązanie wydaje się trywialne.
źródło