Napisz program, który sprawia, że ​​2 + 2 = 5 [zamknięty]


393

Napisz program, który pozornie dodaje cyfry 2 i 2 i wyświetla dane wyjściowe 5. Jest to zawiły zawód.

Twój program nie może wygenerować żadnych błędów. Uważaj na dziury w pamięci! Wejście jest opcjonalne.

Ponowne zdefiniowanie 2 + 2 jako 5 nie jest zbyt kreatywne! Nie myśl o tym podwójnie, spróbuj czegoś innego.


48
To pytanie w książce „1984” George'a Orwellla.
bacchusbeale

97
Dlaczego jest to podstępne? Dwa plus dwa to pięć.
Geobity

79
TAM! JESTEŚ! CZTERY! ŚWIATŁA!
Nick T

105
@Geobits - Zgadzam się: 2 + 2 = 5 widać to w tym kalkulatorze .
MT0

47
echo "2+2=5";
user3459110

Odpowiedzi:


669

Jawa

Refleksja jest rzeczywiście właściwym sposobem na nadużywanie Javy ... ale musisz sięgnąć głębiej niż tylko ulepszyć niektóre wartości.

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws Exception {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        array[132] = array[133];

        System.out.printf("%d",2 + 2);
    }
}

Wynik:

5

Wyjaśnienie:

Musisz to zmienić jeszcze głębiej, niż zwykle możesz uzyskać dostęp. Należy pamiętać, że jest to zaprojektowane dla Java 6 bez żadnych funkcyjnych parametrów przekazywanych do JVM, które w przeciwnym razie zmieniłyby IntegerCache .

Wewnątrz klasy Integer znajduje się Flyweight of Integers. Jest to tablica liczb całkowitych od −128 do +127. cache[132]jest miejscem, w którym normalnie byłoby 4. Ustaw na 5.

Ostrzeżenie: wykonanie tego w prawdziwym kodzie sprawi, że ludzie będą bardzo niezadowoleni.

Demo kodu na ideone .


5
Myślałem o tym, gdy tylko zobaczyłem pytanie :)
Octavia Togami

306
Że. Jest. Zło. Absolutnie złe. +1
John Dvorak

75
@JanDvorak na czacie zasugerowano Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Wyobraź sobie, ile rzeczy by się

30
Takie odpowiedzi sprawiają, że uwielbiam tę witrynę bardziej niż SO.
Songo

35
zomg, odpowiedzi java nigdy nie otrzymają najwyższych głosów! +1 za przeniesienie Java na szczyt :)
Cruncher

297

Haskell

Uwielbiam, jak możesz rzucać cokolwiek w ghci i to całkowicie się z nim toczy.

λ> let 2+2=5 in 2+2
5

36
Co ma let 2+2=5 in 5+5zrobić? ಠ_ಠ
John Dvorak

22
@JanDvorak Non-exhaustive patterns in function +- Definiuję tutaj nową funkcję (+), a jeśli podłączę coś, co nie 2+2jest, spowoduje to błąd, ponieważ nigdy nie określiłem, co powinno się w takim przypadku zdarzyć.
Flonk

27
@SHiNKiROU cień, nie redefiniuj
John Dvorak

96
to prawie brzmi: „A Bóg powiedział, niech 2 + 2 = 5 w 2 + 2”))
OutFall

11
@ user3217013 Naucz się Haskell, to jest dobre dla twojego serca.
But

294

do

Całkiem tania sztuczka, ale jestem pewien, że złapię większość z was.

int main() {
    int a = 2 + 2;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     a++;
    printf("%d",a);
    return 0;
}

Wypróbuj tutaj

Przewiń kod w prawo.
Nie jestem pewien w systemie Windows / Linux, ale w OSX, pasek przewijania nie jest widoczny.
W każdym razie jest to dobry powód, aby włączyć „wizualizację przestrzeni” w swoim ulubionym edytorze kodu.


96
Pasek przewijania jest widoczny w Chromium, ale kto na początku zwraca na to uwagę? :)
Ruslan

172
Aby pomylić ludzi, możesz dodać wiersz komentarza, który jest wystarczająco długi, aby „wyjaśnić” istnienie paska przewijania, ale na tyle nudny, że nikomu nie zależy (przewiń, aby go przeczytać).
Hagen von Eitzen

22
W OS X domyślnie widoczność paska przewijania zależy od tego, czy mysz jest podłączona. Jeśli jest tylko touchpad, paski przewijania są nakładane i znikają, gdy nie są używane. Jeśli podłączona jest mysz, paski przewijania kradną przestrzeń z pola kontekstu i są zawsze widoczne. Możesz to sprawdzić, odłączając i podłączając mysz USB do MacBooka. Można to oczywiście skonfigurować w Preferencjach systemowych.
Andrea

49
Sprytne, ale na telefonie komórkowym to tylko pisanie słów :)
Logan

31
To jedyny raz, kiedy przewijanie okien kodu SE nie powoduje, że chcę łamać czyjeś palce.
ObscureRobot

184

GolfScript

4:echo(2+2);

Wydruki 5.

Oczywiście, GolfScript ma składnię, która jest znacząco różna od innych języków, ten program po prostu wygląda jak coś podstawowego lub C-ish.

4  - Połóż cyfrę 4 na stosie. Zawartość stosu: 4
:echo- Zapisz wartość na górze stosu do zmiennej echa. Zawartość stosu: 4
(  - Zmniejsz wartość na górze stosu o 1. Zawartość stosu: 3
2  - Umieść liczbę 2 na stosie. Zawartość stosu: 3 2
+  - Dodaj dwie liczby na górze stosu. Zawartość stosu: 5
2  - Połóż cyfrę 2 na stosie. Zawartość stosu: 5 2
)  - Zwiększ wartość na górze stosu o 1. Zawartość stosu: 5 3
;  - Usuń górny element ze stosu. Zawartość stosu: 5

GolfScript domyślnie drukuje wszystko, co pozostało na stosie po zakończeniu wykonywania.


3
Czy możesz to wyjaśnić osobom, które nie mówią w języku GolfScript, proszę?
MadTux,

1
@MadTux Proszę bardzo.
aaaaaaaaaaaa

1
Dzięki. (Głosuję później, bo osiągnąłem dzienny limit, oto piwo.)
MadTux,

5
Prosty i oszukiwany, uwielbiam to. +1
patrz

9
podoba mi się, ponieważ nie wygląda na to, że oszukuje cię matematyką lub semantyką, wydaje się to takie proste, a jednak 5 ^^
dwana

145

Jawa

Zawsze musicie zaokrąglać swoje dwójki, ludzie

public class TwoPlusTwo {
  public static void main(String... args) {
    double two = two();
    System.out.format("Variable two = %.15f%n", two);
    double four = Math.ceil(two + two); // round just in case
    System.out.format("two + two = %.15f%n", four);
  }

  // 20 * .1 = 2
  private static double two() {
    double two = 0;
    for(int i = 0; i < 20; i++) {
      two += .1;
    }
    return two;
  }
}

Wynik:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Wyjaśnienie:

Nie, poważnie, zawsze musisz zaokrąglać swoje deble. 15 nie wystarcza cyfr, aby pokazać, że two()metoda faktycznie produkuje 2.0000000000000004(16 wystarczy, ale).

W nieprzetworzonych reprezentacjach szesnastkowych liczb jest to tylko 1-bitowa różnica (między 4000000000000001i 4000000000000000) ... co wystarcza, aby Math.ceilmetoda zwróciła 5, a nie 4.


61
Math.ceil(two + two); // round just in caseWidzę, co tam zrobiłeś
Tim S.

17
Tworzenie zarówno funkcji, jak i zmiennej o tej samej nazwie ... Wow.
konfigurator

107
@configurator to nic, nie ma nawet klasy o nazwie two. Java klasy produkcyjnej to Two two = Two.two.two();Two.two jest typu TwoFactory.
Jannis Froese

36
Two.Infinity.And.Beyond ()
CincauHangus

7
@ Tims Ceil to, co tam zrobiłeś
kod lotu

135

BBC BASIC

EDYCJA: Dla Andrei Faulds i Squeamish Ossifrage, bardziej przekonująca wersja z użyciem innego tłumacza: http://sourceforge.net/projects/napoleonbrandy/

  MODE 6
  VDU 23,52,254,192,252,6,6,198,124,0
  PRINT
  PRINT "2+2=";2+2
  PRINT "2+3=";2+3

enter image description here

To faktycznie drukuje liczbę 4, ale VDU 23redefiniuje czcionkę dla ASCII 52, aby wyglądała jak 5 zamiast 4. Tryb ekranu 6 został wybrany ze względów estetycznych (znaki o rozsądnym rozmiarze).

Oryginalny obraz przy użyciu emulatora pod adresem http://bbcbasic.co.uk/bbcwin/bbcwin.html . (z nieco innym kodem) można zobaczyć w historii edycji.


8
Te czcionki wyglądają jednak inaczej. Czy uważasz, że możesz użyć poprawnej czcionki?
Andrea

@AndreaFaulds Używam emulatora z bbcbasic.co.uk/bbcwin/bbcwin.html . Obsługuje redefinicję czcionki oryginalnej BBC Basic na siatce 8x8. Ale domyślna czcionka emulatora ma wyraźnie wyższą rozdzielczość niż 8x8. Prawdopodobnie mógłbym wykonać lepszą robotę, ale nie byłoby to idealne. Przypuszczam, że mógłbym przedefiniować czcionkę dla wszystkich 5, a także 4, wtedy wyglądałyby tak samo.
Level River St

5
@AndreaFaulds Pytanie nie mówiło, że wynik powinien być nie do odróżnienia od innych 5s. Myślę, że to właściwie funkcja. 2+3=5i2+2=5'
Ben Jackson

1
To pasuje do oryginalnej czcionki w BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
piskliwy ossifrage

@squeamishossifrage dzięki za informacje. Jednak nie będzie pasować do czcionki w emulatorze. Twój przykład ma 7 pikseli wysokości, tak jak mój. Ma również zero na dole, podobnie jak moje, podczas gdy wygląda na to, że muszę go nieco przesunąć w dół (tj. Mam zero na górze zamiast na dole). Kluczową różnicą jest to, że mam 126,64 podczas gdy masz 126,96 i masz jakieś 6 zamiast moich 2. To dlatego, że oryginalna czcionka BBC miała grube pionowe linie, dzięki czemu można ją łatwo odczytać w formacie 80 kolumn na standardowym ekranie telewizora.
Level River St

134

Brainfuck

+++++           +++++
    +               +    
    +     +         +     +++++
+++++    +++    +++++     
+         +     +         +++++
+               +
+++++           +++++.

Wynik:

5

Wypróbuj tutaj .

Wiem, że może to zabrzmieć trochę zbyt prosto, ale starałem się być kreatywny, jak sugerowano w oryginalnym poście.


1
Nie wiem, pieprzenie mózgu, zajęło mi to kilka minut, aby to zrozumieć. ASCII 53, prawda?
Level River St

4
Tak długo, jak masz +++++., możesz pomalować wszystko.
Eduard Florinescu,

1
@steveverrill: tak masz rację. (i jest to jedyny sposób na wyświetlanie znaków ascii w BF).
tigrou


105

Grzmotnąć

Ponieważ jest to , powinienem użyć długiej metody ...

Dla osób, które nie znają Bash: $((...expr...))to składnia do oceny wyrażeń arytmetycznych. $(bc<<<...expr...)robi to samo, używając bckalkulatora wiersza poleceń.

v=2                     #v is 2
v+=2                    #v is 4
v=$(($v*5))             #v is 20
v=$(($v-16))            #v is 4
v=$(bc<<<"sqrt($v)+2")  #v is 4 (sqrt(4) is 2)
v=$(bc<<<"$v/4+3")      #v is 4 (4/4 = 1)
echo '2+2=' $v          #So v is 4...?

Wynik

2+2= 5

Wyjaśnienie

Drugi wiersz łączy v i 2 zamiast ich dodawać, aby uzyskać 22.
Rzeczywiste wyjaśnienie:
v=2 #v is 2 v+=2 #v is 22 v=$(($v*5)) #v is 110 v=$(($v-16)) #v is 94 v=$(bc<<<"sqrt($v)+2") #v is 11 (by default, bc rounds to integers) v=$(bc<<<"$v/4+3") #v is 5 (11/4 is 2 with rounding) echo '2+2=' $v #TADAAAM


8
Świetna sztuczka matematyczna tam się dzieje!
tomsmeding

5
@tomsmeding Było całkiem fajnie, chociaż mniej więcej w połowie zdałem sobie sprawę, że wstawiłem 15zamiast 16w wierszu 4. Na szczęście nadal działało z powodu bczaokrąglenia

2
Sprawdź, czy podoba Ci się wygląd tego stylu, który jest również prawidłowy Bash (eliminuje znaki dolara, pozwala spacji wokół znaku równości i pozwala na łączenie operatorów przypisania): ((v = v * 5))lub((v *= 5))
Dennis Williamson

2
Niezły, ale +=natychmiast to zauważyłem .
nyuszika7h

2
@ardnew tak jest. pierwsze dwie linie ( v=2i v+=2): do kogoś, kto nie zna obsługi zmiennych Bash, byłoby to równoważne 2+2, ale tak naprawdę jest "2"+"2", tj "22". pozostałe komentarze w kodzie są błędne tylko z tego powodu. Wiem, że nie wszyscy

101

Pyton

Zainspirowany odpowiedzią Java:

>>> patch = '\x312\x2D7'
>>> import ctypes;ctypes.c_int8.from_address(id(len(patch))+8).value=eval(patch)
>>> 2 + 2
5

Podobnie jak Java, CPython używa tej samej lokalizacji pamięci dla każdej kopii pierwszych kilku małych liczb całkowitych (0-255, jeśli pamięć służy). To wchodzi i bezpośrednio edytuje tę lokalizację pamięci za pośrednictwem ctypes. patchjest tylko zaciemnionym "12-7", ciągiem z len4, czyli eval5.

Bardziej zaciemniona wersja

exec("\x66\x72\x6f\x6d\x20c\x74\x79\x70e\x73\x20\x69\x6d\x70\
\x6f\x72\x74\x20c\x5f\x69\x6e\x748\x20a\x73\x20x\x3bf\x72\x6f\
\x6d\x20\x73\x74\x72\x75c\x74\x20\x69\x6d\x70\x6f\x72\x74\x20\
ca\x6cc\x73\x69\x7ae\x20a\x73\x20x0\x3bx\x2ef\x72\x6f\x6d\x5f\
a\x64\x64\x72e\x73\x73\x28\x69\x64\x284\x29\x2bx0\x28\x27\x50\
\x50\x27\x29\x29\x2e\x76a\x6c\x75e\x3d5")

Powyżej 2 + 2

Jak wspomniano OP, 2 + 2 może być trochę nudne; oto więc czystszy, wieloplatformowy kod o wielu szerokościach do nadużyć.

from __future__ import division, print_function
import struct
import ctypes
import random

# Py 2.7 PyIntObject:
# - PyObject_HEAD
#     - PyObject_HEAD_EXTRA [usually nothing unless compiled with DEBUG]
#     - (Py_ssize_t) ob_refcnt
#     - (_typeobject) *ob_type
# - (long) ob_ival

# two platform-sized (32/64-bit) ints (ob_refcnt and *ob_type from above)
offset = struct.calcsize('PP')

num = 60
nums = list(range(num))
addresses = [id(x) + offset for x in nums]
random.shuffle(nums)

for a, n in zip(addresses, nums):
    ctypes.c_ssize_t.from_address(a).value = n

print('2 + 2 =', 2+2)
print('9 - 4 =', 9-4)
print('5 * 6 =', 5*6)
print('1 / 0 =\n', 1/0)
print('(1 + 2) + 3 = ', (1+2)+3)
print('1 + (2 + 3) = ', 1+(2+3))
print('(2 + 3) + 1 = ', (2+3)+1)
print('2 + (3 + 1) = ', 2+(3+1))

Działa z Python 2.7 ... zignoruj ​​tę linię na końcu. Działa w systemie Windows 64-bit i Ubuntu 32-bit, dwa systemy, do których mam łatwy dostęp.

$ python awful.py 
2 + 2 = 24
9 - 4 = 49
5 * 6 = 55
1 / 0 = 0.76

(1 + 2) + 3 =  50
1 + (2 + 3) =  68
(2 + 3) + 1 =  50
2 + (3 + 1) =  61
Segmentation fault (core dumped)

Nic dziwnego, że możemy przełamać asocjacyjną właściwość dodawania, gdzie ( a + b ) + c = a + ( b + c ), jak widać w pierwszej i drugiej 1+2+3linii, ale w niewytłumaczalny sposób również przełamujemy właściwość przemienną (gdzie a + b = b + a ; 2. i 3. linia). Zastanawiam się, czy interpreter Pythona po prostu ignoruje zbędne nawiasy wokół wyrażeń dodawania.


96
Tak, zdecydowanie wszyscy zwyczajnie ignorujemy segfault ...

10
Warto wspomnieć, że tak naprawdę nie jest to sztuczka w Pythonie i jest specyficzna tylko dla implementacji języka Python w języku C.
xApple

1
@NickT Ah! w porządku. Miałem wrażenie, że wypróbowałeś oryginał w tych samych 64-bitowych oknach, 32-bitowej konfiguracji Ubuntu
DavidJFelix

22
exec('\x66\x72\x6f\x6d\x20\x63\x74\x79\ \x70\x65\x73\x20\x69\x6d\x70\x6f\ \x72\x74\x20\x63\x5f\x69\x6e\x74\ \x38\x3b\x20\x69\x6d\x70\x6f\x72\ \x74\x20\x73\x74\x72\x75\x63\x74\ \x3b\x20\x63\x5f\x69\x6e\x74\x38\ \x2e\x66\x72\x6f\x6d\x5f\x61\x64\ \x64\x72\x65\x73\x73\x28\x69\x64\ \x28\x34\x29\x20\x2b\x20\x73\x74\ \x72\x75\x63\x74\x2e\x63\x61\x6c\ \x63\x73\x69\x7a\x65\x28\x27\x50\ \x50\x27\x29\x29\x2e\x76\x61\x6c\ \x75\x65\x3d\x35')Jest zmodyfikowaną pierwszą wersją. Zrobiłem to, aby móc umieścić go w $ PYTHONSTARTUP w / etc / profile jako czerwony zespół w konkursach hakerskich.
DavidJFelix

2
Tak. Sidenote, wydaje się, że 1, 0 i -1 to niektóre z liczb, z którymi Python natychmiast segfaultuje. Myślałem, że to będzie najgorsze, jeśli popsuję zachowanie programów w języku Python. Może być możliwe wykorzystanie fuckitpy do powstrzymania tych błędów.
DavidJFelix

86

JavaScript:

g = function () {
  H = 3
  return H + H
}

f = function () {
  Η = 2
  return Η + H
}

// 3 + 3 = 6
alert(g())
// 2 + 2 = 5
alert(f())

Sprawdź to na http://jsfiddle.net/qhRJY/

Zarówno H (duża litera łacińska h), jak i Η (duża litera grecka eta) są ustawione na zakres globalny, ponieważ nie zostały zdefiniowane jako lokalne dla funkcji ze słowem kluczowym var. Choć wyglądają podobnie, w rzeczywistości są to 2 różne zmienne o 2 różnych wartościach. Używając Ctrl + F w przeglądarce, przekonasz się, że Η (eta) pokazuje znacznie mniej niż H (h) na tej stronie.


4
@Sam, chociaż dwie litery „H” wyglądają tak samo, w rzeczywistości są to 2 zupełnie różne postacie. W Unicode mogą występować różne znaki, które wyglądają tak samo, ale mają różne punkty kodowe. W tym konkretnym przypadku; drugie „H” to w rzeczywistości grecka litera Eta .
d3dave

79
Używanie homoglifów do „mylenia” czytelników nie jest teraz oficjalnie śmieszne .
John Dvorak

29
Homoglyfy stają się zabawne w połączeniu z absurdalnymi zmiennymi globalnymi javascript.
Konstantin Weitz

3
To nie jest „Unicode Η”, to łaciński H i grecki Eta (Η).
phyzome

4
@Vortico hmm ... czego chcesz, jeśli pytanie FAQ nie wystarczy? Pytanie FAQ połączone z centrum pomocy? Pamiętaj, że tylko moderatorzy mogą zastosować tag faq . Jeśli chodzi o odpowiedź - pytanie brzmi „ocena +5 lub więcej i co najmniej dwa razy więcej głosów pozytywnych niż głosów negatywnych”. Odpowiedź ma 27 głosów pozytywnych i brak głosów negatywnych. To brzmi dla mnie jak spełnienie kryteriów podanych w odpowiedzi, a liczba głosów pozytywnych jest imponująca dla drugiej najstarszej odpowiedzi na pytanie w meta stronie witryny, na której tylko 124 osoby głosowały ponad 10 razy. Ile będzie Ci się podoba? Każdy?
John Dvorak

72

JavaScript

function addDecibels(){return (10*Math.log10([].reduce.call(arguments,(p,c)=>p+Math.pow(10,c/10),0))).toFixed(1);}

alert( addDecibels(2,2) );

Słabo wykorzystany bit polega na tym, że tak naprawdę nie jest on źle wykorzystany - jeśli dodasz źródło dźwięku 2dB do innego źródła dźwięku 2dB, wówczas wynikowy połączony szum wyniesie 5dB (a jeśli dodasz dwa źródła 30dB, wówczas jego 33dB), ponieważ są mierzone w skali logarytmicznej.

Możesz to zobaczyć na innym kalkulatorze tutaj .


Cóż, tak naprawdę to bardziej jak 5,01 decybeli, ale wystarczająco daleko od 4, aby policzyć.
Joe Z.

68

PHP

echo '2 + 2 = ' . (2 + 2 === 4 ? 4 : 2 + 2 === 5 ? 5 : 'dunno');

Który produkuje:

2 + 2 = 5

Jest tak, ponieważ w PHP trójskładniki są obliczane od lewej do prawej, więc tak naprawdę jest
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';


35
obowiązkowa phpsadness
wchargin

1
Mam inny PHPprzykład:$a=2;echo "2+2=".$a++ + $a++;
avall

Oczywiste jest, że $ a ++ daje 3, a wynik wyniesie 6. Nie rozumiem, o czym myślisz.
Ozh

1
@Janus PHPsadness # 30 dobrze to wyjaśnia
wchodząc


66

JavaScript

var total = 2 + 2;

if(total = 5)
{
    alert('I guess 2 + 2 = 5');
}
else
{
    alert('The universe is sane, 2 + 2 = 4');
}

73
=zamiast ==, łatwy do zobaczenia i szczerze mówiąc raczej nieinspirowany.
Zbliża się do

19
I tak mam opinię, często popełniam ten błąd

6
Nadal podoba mi się ta odpowiedź
Sam Creamer

5
Też to lubię. Nie każdy język używa =tylko jako przydziału, ale operator porównania (np. Pascal, SQL, VB)
avall

Uważam to za bardzo oczywiste
Oliver Ni

57

DO#

    static void Main(string[] args)
    {
        var x = 2;
        var y = 2;

        if (1 == 0) ;
        {
            ++x;
        }

        Console.WriteLine(x + y);
    }

7
ah, stara dobra sztuczka z nieuczciwymi postaciami. Dlatego powinieneś używać 1TBS wszędzie.
John Dvorak

11
@JanDvorak Czy to działa z powodu średnika po instrukcji if? Nie znam C #, ale użyłem C ++

5
@professorfish to właśnie zakładam. Również języki, które nie pozwalają wstawiać losowych nawiasów klamrowych FTW.
John Dvorak

12
Bez „;” instrukcja if kontroluje, czy blok kodu zostanie wykonany. Za pomocą „;” tam, jeśli jest oceniane, ale nic nie jest zrobione z wynikiem. Następnie blok kodu jest wykonywany za każdym razem, niezależnie od tego. W języku C # jest całkowicie dopuszczalne, aby mieć losowe bloki kodu.
Grax32

2
Dostałem się z tym innym. Miałem pętlę for z ;potem, co było całkowicie celowe, ponieważ używałem pustej pętli do przesuwania kursora. Przez przypadek usunąłem średnik, wszystko wybuchło i nie mogłem zrozumieć, dlaczego.
mpen

56

Dekorowanie kodu JavaScript w sztuce ASCII jest niebezpieczne.

  -~// JS  \\~-
 ~-// Maths \\-~
-~// Madness \\~-

     (2 + 2)

Gdy komentarze są usuwane, pozostałe symbole i operatory oceniają na
-~~--~(2 + 2) To korzysta z operatora Bitwise Not (~) w JS, wraz z garstką znaków Minus, które negują wartości po drodze.


3
Zastanawiałem się, w jaki sposób --operator był do zaakceptowania, ponieważ powinien się pomylić Invalid left-hand side expression in prefix operation; zdałem sobie jednak sprawę, że między nimi jest spacja.
usandfriends

53

Grzmotnąć

#!/bin/bash

# strings of length 2
x="ab"
y="cd"

# add lengths by concatenation
c="$(cat<<<$x; cat<<<$y)"

# display the lengths of the parts and the sum
echo "${#x} + ${#y} = ${#c}"

Wynik:

2 + 2 = 5

Dane wyjściowe z każdej catbędą miały domyślną nową linię, ale ostatnia nowa linia jest usuwana przez podstawienie polecenia$( )


Oto kolejna:

#!/bin/bash

# Create an array of ascending integers
a=({1..10})

# Use the sum to index into the array
s="2 + 2"
i=$(($s))
echo "$s = ${a[$i]}"

Tablice Bash są indeksowane zerowo


3
Właściwie złapałem pierwszy, ponieważ miałem wiele problemów z takimi rzeczami podczas gry w golfa w Bash. Co do drugiego, gdzie tablice nie są indeksowane zerem?

3
@professorfish Applescript, na przykład:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Cyfrowa trauma

12
@DigitalTrauma Applescript jest dziwny

5
zshużywa tablic 1-indeksowanych (i $arr[0]jest po prostu nieuzbrojony, niezdefiniowany lub coś takiego), chyba że KSH_ARRAYSustawiono opcję, w którym to przypadku tablice są indeksowane 0.
chepner

4
@professorfush: Lua i Fortran mają 1 indeks. Za każdym razem, gdy liczę do 10, zawsze zaczynam od 1, a nie od 0: D
Kyle Kanos

49

Perl

# Generic includes
use strict;
use warnings;
use 5.010;
use Acme::NewMath;

# Ok, time to begin the real program.
if (2 + 2 == 5) {
    say 5;
}
else {
    say "Dunno...";
}

Zależy to od modułu CPAN o nazwie Acme :: NewMath . Z powodu złych nazw plików w module, będzie to działać tylko w systemach plików bez rozróżniania wielkości liter (takich jak Windows lub Mac OS X), ale tutaj obwiniam autora oryginalnego modułu. Acme :: NewMath implementuje matematykę zgodnie z ideologią Ingsoc.


16
To dość chytre. Nikt nigdy nie patrzy na twój import / obejmuje.

44

R

# add the mean of [1,3] to the mean of [4,0] (2 + 2)
mean(1,3) + mean(4,0)

wynik:

5

kod faktycznie dodaje średnią z [1] do średniej z [4]. Właściwy sposób korzystać z funkcji średnią w badania będzie: mean(c(1,3)) + mean(c(4,0))Jest to w przeciwieństwie do niektórych innych funkcji matematycznych w dziedzinie badań, takich jak sum, maxi min; gdzie sum(1,3), max(1,3)i min(3,1)wszyscy dadzą oczekiwaną odpowiedź.


7
Nieźle, trochę mnie oszukałem.
qwr

37

Jawa

public class Five {
    public static void main(final String... args) {
        System.out.println(256.0000000000002 + 256.0000000000002);
    }
}

wynik:

512.0000000000005

Prawdopodobnie działa w każdym języku, który używa tego samego rodzaju podwójnych.


7
To bardzo dziwny główny podpis.
Bertie Wheen

10
Java implementuje różne argumenty jako tablice pod maską.
CodaFi

4
Chwilę zajęło mi uświadomienie sobie, że prawdopodobnie mówisz o ostatnich cyfrach w grze podwójnej. Widziałem, że pierwsze cyfry zostały poprawnie dodane ( _2_56 + _2_56 = _5_12), ale wydaje się bardziej prawdopodobne, że masz na myśli 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(uwaga: podkreślenia były używane do „pogrubienia” cyfr.
Justin

35

Befunge

Jest to napisane w Befunge, ale ma wyglądać jak Python.

#>>>>>>>>>>>>>>>>>v
# Calculate 2 + 2 v
#>>>>>>>>>>>>>>>>>v
def add(v,w):
    return v+w
 # I rewrote this 5 times and it still doesn't work

print add(2,2) #... Still not working

# email: MarkSmith@example.com

Po uruchomieniu (z poprawnym tłumaczem) program wydrukuje 5.

Wyjaśnienie:

Program Befunge składa się z siatki pojedynczych znaków. Pierwsze polecenie jest tym w lewym górnym rogu, a czytanie poleceń przebiega w prawo. Ale kierunek może się zmienić podczas wykonywania programu.

Uruchamiany jest tylko pierwszy rząd znaków i kolumna znaków rozpoczynająca się vod pierwszego rzędu. Znaki, o których mowa, to:

#- pomiń następne polecenie
>- od tej chwili polecenia są odczytywane po prawej stronie bieżącego polecenia
v- od tej chwili polecenia są odczytywane poniżej bieżącego polecenia
5- Wciśnij 5 na stos
.- Pop i wydrukuj numer u góry stosu
@- Zakończ program
<space>- Nic nie rób

Gdybyś wiedział, że programujesz w Befunge, tak naprawdę nikogo to nie oszuka. Ale jeśli natkniesz się na to i nie zdasz sobie sprawy, że to Befunge, najprawdopodobniej by to zrobiło.


11
+1, to jest bardzo przebiegłe, ponieważ kto do diabła patrzy na program, który uruchamia kod źródłowy podczas debugowania?
MrLore,

33

JavaScript

Kod:

var a = 3;
а = 2;
a + а;

Wynik:

5

Możesz to przetestować samodzielnie na konsoli lub sprawdzić to skrzypce


6
Czy możesz wskazać mi zasób lub wyjaśnić, dlaczego to działa. Wiem, że to działa, ponieważ sprawdziłem skrzypce, ale nie rozumiem dlaczego.
Rodzina

29
zmienna „a” nie jest taka sama za każdym razem (przepraszam, jeśli psuję to). Podstępna Unicode rzeczywiście
Sam Creamer

6
Uwielbiam, jak następna postać U+0431to б - prawie 6!
wchargin

73
Używanie homoglifów do „mylenia” czytelników nie jest teraz oficjalnie śmieszne .
John Dvorak

40
@JanDvorak Ta odpowiedź została opublikowana po tej; nie dotyczy to tutaj.
Klamka

30

C (Linux, gcc 4.7.3)

#include <stdio.h>

int main(void)
{
    int a=3, b=2;

    printf("%d + %d = %d", --a, b, a+b);  
}

Drukuje 2 + 2 = 5

Więc a = 2, prawda?

gcc-4.7.3 ocenia parametry funkcji od prawej do lewej. Kiedy a + b jest oceniane, a nadal wynosi 3.


16
Fajne użycie nieokreślonego zachowania
chbaker0

24

FORTRAN 77

       program BadSum
       integer i,a,j
       common i,a
       a = 1
       i = 2
       call addtwo(j) 
       print *,j
       end

       subroutine addtwo(j)
       integer a,i,j
       common a,i
c since a = 1 & i = 2, then 2 + 1 + 1 = 2 + 2 = 4
       j = i + a + a
       end

Standardowe nadużywanie commonbloków: kolejność ma znaczenie; Zamieniłem kolejność w bloku podprogramu, więc naprawdę dodaję 1 + 2 + 2.


6
@JanDvorak: Haha, mogłem użyć FORTRAN IV, w którym mogłem redefiniować literały, np.2=3
Kyle Kanos

1
@KyleKanos, właśnie tak myślałem, kiedy zobaczyłem, że twój post został napisany w FORTRAN.
danmcardle

@KyleKanos Zrób to!
ClickRick

1
@KyleKanos: Czy to działało z literałami całkowitymi, czy tylko zmiennoprzecinkowe? Pomyślałbym, że na maszynie z tej epoki literał całkowity i adres miałyby ten sam rozmiar, ale mniejszy niż liczba zmiennoprzecinkowa, więc łączenie literałów zmiennoprzecinkowych oszczędzałoby miejsce, ale buforowanie literałów całkowitych nie.
supercat

2
@KyleKanos: Rozumiem, że kompilatory nie zezwalają na bezpośrednie przypisanie literału, ale wywołania funkcji są przekazywane przez referencję, a przekazanie literału zmiennoprzecinkowego do funkcji zwykle przekazuje adres wartości w puli liczb zmiennoprzecinkowych -punktowe literały. Przekazanie wartości całkowitej do funkcji spowodowałoby, że byłaby ona pula, ale większość kodu, który używał liczb całkowitych, zawierałaby wartości bezpośrednio.
supercat

24

Pyton

Kod drukuje 5, co jest poprawną odpowiedzią na to zadanie.

def int(a):
    return ~eval(a)

def add(a,b):
    return int(a)+int(b)

print ~add("2","2")

Edycja: Oto alternatywna wersja, która dodaje liczby całkowite, a nie dwójkowe.

def int(a): return ~eval(`a`)
def add(a,b): return int(a)+int(b)
print ~add(2,2)

Tylda jest jednostronnym operatorem odwrotnym, który powraca -x-1, więc pierwszym krokiem jest pobranie, -6a następnie użycie innego operatora w printfunkcji get5


Dlaczego ~eval(`a`)zamiast tylko ~a?
Andrea Corbellini,

2
Chciałem zostawić część int()funkcjonalności i eval()wykonuje to zadanie, jeśli wejście jest liczbą całkowitą striczoną :)
avall

24

Rubin

class Fixnum
    alias plus +

    def + (other)
        plus(other).succ
    end
end

puts 2 + 2

Zwiększa to wynik wszystkich dodatków, których pierwszym argumentem jest Fixnum (którym 2 jest, przynajmniej w MRI) o 1.

Skutki uboczne tego są jeszcze gorsze niż wersja Java.


23

Rubin

Ruby ma środowiska najwyższej klasy. Oznacza to wiele rzeczy. Oznacza to również, że można zrobić wiele rzeczy, które ... może nie powinny.

def mal(&block)
    block.call
    for v in block.binding.eval("local_variables");
      block.binding.eval('if ' + v.to_s + ' == 4 then ' + v.to_s + ' = 5 end')
    end 
end

a = 2 + 2;
b = 2 + 4;
puts "2 + 2 = ", a
puts "2 + 4 = ", b

mal do
  puts "But in 1984..."
end

puts "2 + 2 = ", a
puts "2 + 4 = ", b

Wynikiem tego jest:

2 + 2 = 
4
2 + 4 = 
6
Ale w 1984 roku ...
2 + 2 = 
5
2 + 4 = 
6

Jeśli chcesz dowiedzieć się więcej na temat radości i niebezpieczeństw związanych z tym, Ruby Conf 2011 Utrzymanie Ruby Rozsądne i przeczytaj pierwszorzędne środowiska z bloga Abstract Heresies.


Także:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42

1
Wystarczy zrobić w konkretnym przypadku:class Fixnum; alias_method :orig_plus, :+; protected :orig_plus; def +(n) self == 2 && n == 2 ? 5 : self.orig_plus(n) end end
Gary S. Weaver,

21

Schemat

(define 2+2 5)
2+2 ;=> 5

9
Hej! 2+2to nie jest sposób dodawania w seplenieniu!
John Dvorak

1
Więc co? Pozornie dodaje 2 do 2, jak jest w zadaniu.
Hauleth

119
@JanDvorak Nigdy nie użyłem seplenienia, ale rozumiem, że to coś w rodzaju ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
metro

2
„Ponowne zdefiniowanie 2 + 2 jako 5 nie jest zbyt kreatywne! Nie myśl o tym podwójnie, spróbuj czegoś innego”. --- Cóż, w R5RS mogę przedefiniować + zamiast 2 + 2 lub 2. Odpowiedź jest tutaj: pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli, że adnotacja została zrobiona po mojej odpowiedzi, więc się nie liczy.
Hauleth

20

DO#

var c = Enumerable.Range(2, 2).Sum();

Dla kogoś, kto nie jest zaznajomiony, będzie to wyglądać tak, że otrzymuję zakres zaczynający się i kończący na 2. W rzeczywistości zaczyna się od 2 i obejmuje dwie liczby. Więc 2 + 3 = 5.


6
Zakres zaczynający się i kończący na 2 byłby po prostu { 2 }, prawda?
Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Rangenie bierze początku i końca, wymaga początku i liczby (elementów, które zostaną wyliczone).
MasterMastic

14
@MasterMastic Zrozumiałem to z wyjaśnienia w odpowiedzi. Ale znaczenie „dla kogoś, kto nie jest znany” powinno być takim zakresem (od wyjaśnienia w odpowiedzi), a moim argumentem jest to, że oczekiwany wynik to 2, a nie 4
Paŭlo Ebermann

1
@ PaŭloEbermann, tak, to także jeden ze sposobów, aby na to spojrzeć. Myślałem, że może to wyglądać bardziej, jakbym podawał liczby do dodania. Zatem Enumerable.Range (1,2,3,4) zaczynałby się od 1, kończył na 4 i sumowałby się do 10.
Paul


18

do

int main() {
        char __func_version__[] = "5";  // For source control
        char b[]="2", a=2;
        printf("%d + %s = %s\n", a, b, a+b);
        return 0;
}

5Nie jest zbyt dobrze ukryte, obawiam się. Nie działa z optymalizacją.


1
Miły; Nie mogę głosować, jeśli niezdefiniowane zachowanie nie jest dozwolone.
tego

2
@self., nie widzę, gdzie poleganie na UB jest zabronione. Wiele odpowiedzi na pytania w golfa opiera się na UB i myślę, że jest OK, o ile konsekwentnie dzieje się na rozsądnej platformie.
ugoren

2
Nie wiem, gdzie poleganie na UB jest zabronione. Nie znalazłem też żadnych zasad w tym zakresie. Byłoby miło, gdyby można to wyjaśnić. Wiele odpowiedzi na pytania w golfa opiera się na UB i myślę, że jest w porządku, o ile konsekwentnie dzieje się na rozsądnej platformie. Pewne konkretne reguły byłyby fajne.
tego
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.