Schreiben Sie ein Programm, das 2 + 2 = 5 macht

393

Schreiben Sie ein Programm, das scheinbar die Zahlen 2 und 2 addiert und 5 ausgibt.

Ihr Programm kann keine Fehler ausgeben. Achten Sie auf Erinnerungslöcher! Die Eingabe ist optional.

2 + 2 als 5 neu zu definieren ist nicht sehr kreativ! Denken Sie nicht doppelt, probieren Sie etwas anderes.

qwr
quelle
48
Dies ist Frage in Buch "1984" von George Orwelll.
Bacchusbeale
97
Warum ist das hintergangen? Zwei plus zwei ist fünf.
Geobits
79
DORT! SIND! VIER! LICHTER!
Nick T
105
@ Geobits - ich stimme zu: 2 + 2 = 5 Sie können es in diesem Rechner sehen .
MT0
47
echo "2+2=5";
user3459110

Antworten:

669

Java

Reflexion ist in der Tat der richtige Weg, um Java zu missbrauchen ... aber Sie müssen tiefer gehen, als nur einige Werte zu optimieren.

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

Ausgabe:

5

Erläuterung:

Sie müssen es noch tiefer ändern, als Sie normalerweise zugreifen können. Beachten Sie, dass dies für Java 6 entwickelt wurde und keine funky Parameter an die JVM übergeben wurden, die andernfalls den IntegerCache ändern würden .

Tief in der Integer-Klasse befindet sich ein Flyweight of Integer. Dies ist ein Array von Ganzzahlen von –128 bis +127. cache[132]ist der Punkt, an dem 4 normalerweise sein würde. Stellen Sie es auf 5.

Warnung: Wenn Sie dies in echtem Code tun, werden die Leute sehr unglücklich.

Code Demo auf Ideone .

Dennis
quelle
5
Ich dachte an dieses, sobald ich die Frage sah :)
Octavia Togami
306
Das. Ist. Böse. Absolut böse. +1
John Dvorak
75
@ JanDvorak im Chat wurde vorgeschlagen Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Stellen Sie sich vor , wie viele Dinge brechen würden ...
30
Antworten wie diese bringen mich dazu, diese Seite mehr zu lieben als SO.
Songo
35
zomg, java answers bekomme niemals Top Votes! +1 für das Bringen von Java an die Spitze :)
Cruncher
297

Haskell

Ich liebe es einfach, wie man alles auf ghci wirft und es total mitrollt.

λ> let 2+2=5 in 2+2
5
Flonk
quelle
36
Was macht let 2+2=5 in 5+5das? ಠ_ಠ
John Dvorak
22
@JanDvorak Non-exhaustive patterns in function +- Ich definiere hier eine neue Funktion (+) und wenn ich etwas einstecke, das nicht der 2+2Fall ist , wird ein Fehler ausgegeben, da ich nie definiert habe, was in diesem Fall passieren soll.
Flonk
27
@ SHINKIROU Schatten, nicht neu zu definieren
John Dvorak
96
das klingt fast so: "Und Gott sagte, lass 2 + 2 = 5 in 2 + 2"))
OutFall
11
@ user3217013 Lerne Haskell, es ist gut für dein Herz.
Schuh
294

C

Ziemlich billiger Trick, aber ich bin sicher, ich werde die meisten von Ihnen fangen.

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

Probieren Sie es hier aus

Scrollen Sie den Code nach rechts.
Ich bin mir unter Windows / Linux nicht sicher, aber unter OSX ist die Bildlaufleiste nicht sichtbar.
Auf jeden Fall ist dies ein guter Grund, die "Raumvisualisierung" in Ihrem bevorzugten Code-Editor zu aktivieren.

Michael M.
quelle
96
Die Bildlaufleiste ist in Chromium sichtbar, aber wer achtet zuerst darauf? :)
Ruslan
172
Um die Leute zu verwirren, können Sie eine Kommentarzeile hinzufügen, die lang genug ist, um die Existenz einer Bildlaufleiste zu "erklären", aber langweilig genug, damit sich niemand darum kümmert, sie zu lesen.
Hagen von Eitzen
22
Unter OS X hängt die Sichtbarkeit der Bildlaufleiste standardmäßig davon ab, ob eine Maus angeschlossen ist. Wenn nur ein Touchpad vorhanden ist, werden Bildlaufleisten eingeblendet und ausgeblendet, wenn sie nicht verwendet werden. Wenn eine Maus angeschlossen ist, stehlen Bildlaufleisten Platz aus dem Kontextfeld und sind immer sichtbar. Sie können dies testen, indem Sie eine USB-Maus von einem MacBook trennen und an dieses anschließen. Dies kann natürlich in den Systemeinstellungen konfiguriert werden.
Andrea
49
Clever, aber auf dem Handy nur Zeilenumbrüche :)
Logan
31
Dies ist das einzige Mal, dass das Scrollen von SE-Code-Fenstern nicht dazu führt, dass ich jemandem die Finger brechen möchte.
ObscureRobot
184

GolfScript

4:echo(2+2);

Druckt 5.

Natürlich hat GolfScript eine Syntax, die sich deutlich von anderen Sprachen unterscheidet. Dieses Programm sieht einfach so aus wie Basic oder C-ish.

4  - Legen Sie die Nummer 4 auf den Stapel. Stapelinhalt: 4
:echo- Speichern Sie den Wert oben im Stapel im Variablenecho. Stapelinhalt: 4
(  - Verringern Sie den Wert oben auf dem Stapel um 1. Stapelinhalt: 3
2  - Legen Sie die Zahl 2 oben auf den Stapel. Stapelinhalt: 3 2
+  - Addieren Sie die beiden Zahlen oben auf dem Stapel. Stapelinhalt: 5
2  - Legen Sie die Nummer 2 oben auf den Stapel. Stapelinhalt: 5 2
)  - Erhöhen Sie den Wert am oberen Rand des Stapels um 1. Stapelinhalt: 5 3
;  - Entfernen Sie das obere Element vom Stapel. Stapelinhalt: 5

GolfScript druckt standardmäßig alles, was nach Abschluss der Ausführung noch auf dem Stapel ist.

aaaaaaaaaaa
quelle
3
Können Sie das für Leute erklären, die bitte kein GolfScript sprechen?
MadTux
1
@ MadTux Hier gehts.
aaaaaaaaaaa 10.06.14
1
Vielen Dank. (Ich stimme später zu, weil ich mein Tageslimit erreicht habe. Hier ist ein Bier.)
MadTux
5
Einfach und schummelig, ich liebe es. +1
Siehe auch
9
Ich mag es, weil es nicht so aussieht, als würde es dich mit Mathematik oder Semantik aus der
Fassung bringen.
145

Java

Müssen immer Ihre Doppel runden, Leute

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

Ausgabe:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Erläuterung:

Nein, im Ernst, Sie müssen immer Ihre Doppel runden. 15 sind nicht genug Ziffern, um zu zeigen, dass die two()Methode tatsächlich produziert 2.0000000000000004(16 sind jedoch genug).

In den rohen Hex-Darstellungen der Zahlen ist es nur ein 1-Bit-Unterschied (zwischen 4000000000000001und 4000000000000000) ..., der ausreicht, damit die Math.ceilMethode 5 und nicht 4 zurückgibt.

durron597
quelle
61
Math.ceil(two + two); // round just in caseIch verstehe, was Sie dort getan haben
Tim S.
17
Eine Funktion und eine Variable mit demselben Namen erstellen ... Wow.
Konfigurator
107
@configurator das ist nichts, es gibt nicht einmal eine Klasse namens two. Java in Produktionsqualität ist Two two = Two.two.two();mit Two.two vom Typ TwoFactory.
Jannis Froese
36
Two.Infinity.And.Beyond ()
CincauHangus
7
@ Tims I Ceil, was Sie dort getan haben
thenaglecode
135

BBC BASIC

EDIT: Für Andrea Faulds und Squeamish Ossifrage eine überzeugendere Version mit einem anderen Interpreter: 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

Bildbeschreibung hier eingeben

Dies gibt tatsächlich die Zahl 4 aus, VDU 23definiert jedoch die Schriftart für ASCII 52 neu, sodass sie wie eine 5 anstelle einer 4 aussieht. Der Bildschirmmodus 6 wurde aus ästhetischen Gründen ausgewählt (Zeichen mit einer angemessenen Größe).

Das Originalbild mit dem Emulator unter http://bbcbasic.co.uk/bbcwin/bbcwin.html . (mit etwas anderem Code) ist im Bearbeitungsverlauf zu sehen.

Level River St
quelle
8
Diese Schriftarten sehen jedoch anders aus. Glaubst du, du könntest dafür die richtige Schriftart verwenden?
Andrea
@AndreaFaulds Ich verwende den Emulator von bbcbasic.co.uk/bbcwin/bbcwin.html . Es unterstützt die Neudefinition der Schrift von BBC Basic in einem 8x8-Raster. Die Standardschrift des Emulators ist jedoch deutlich höher als 8x8. Also könnte ich wahrscheinlich einen besseren Job machen, aber es wäre nicht perfekt. Ich nehme an, ich könnte die Schriftart für alle 5 und 4 neu definieren, dann würden sie gleich aussehen.
Level River St
5
@AndreaFaulds Die Frage sagte nicht, dass das Ergebnis nicht von anderen 5s zu unterscheiden sein sollte. Ich denke das ist eigentlich ein Feature. 2+3=5und2+2=5'
Ben Jackson
1
Dies entspricht die Original - Schriftart in der BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
zimperlich ossifrage
@squeamishossifrage danke für die Info. Es stimmt jedoch nicht mit der Schriftart im Emulator überein. Ihr Beispiel ist 7 Pixel hoch, genau wie meins. Es hat auch eine Null am unteren Rand, genau wie meine, während es so aussieht, als ob ich es etwas nach unten verschieben muss (dh die Null am oberen Rand statt am unteren Rand). Ein wesentlicher Unterschied ist, dass ich 126,64 habe während Sie 126,96 haben, und Sie haben einige 6 statt meiner 2. Das liegt daran, dass die ursprüngliche BBC-Schrift dicke vertikale Linien aufwies, sodass sie auf einem Standardfernsehbildschirm problemlos im 80-Spalten-Format gelesen werden konnte.
Level River St
134

Brainfuck

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

Ausgabe:

5

Probieren Sie es hier aus .

Ich weiß, dass dies ein wenig zu einfach klingt, aber ich habe versucht, kreativ zu sein, wie im ursprünglichen Beitrag vorgeschlagen.

tigrou
quelle
1
Ich weiß es nicht, Brainfuck, es hat ein paar Minuten gedauert, bis ich das herausgefunden habe. ASCII 53, richtig?
Level River St
4
Solange du das +++++.hast, kannst du alles malen.
Eduard Florinescu
1
@steveverrill: ja du hast recht. (und dies ist die einzige Möglichkeit, ASCII-Zeichen in BF auszugeben).
Tigrou
1
Ich verstehe nicht und
Leif Willerts
105

Bash

Da dies ein , sollte ich eine langwierige Methode anwenden ...

Für Leute, die Bash nicht kennen: $((...expr...))ist eine Syntax zum Auswerten von arithmetischen Ausdrücken. $(bc<<<...expr...)tut dasselbe mit dem bcKommandozeilenrechner.

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...?

Ausgabe

2+2= 5

Erläuterung

Die zweite Zeile verkettet v und 2, anstatt sie zu addieren, um 22.
Tatsächliche Erklärung:
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


quelle
8
Schöner Mathe-Trick geht da los!
Tomsmeding
5
@tomsmeding Es hat ziemlich viel Spaß gemacht, obwohl ich auf halbem Weg gemerkt habe, dass ich 15statt 16in Zeile 4 geschrieben habe. Zum Glück hat es immer noch funktioniert, weil bc's rundet
2
Sehen Sie, ob Ihnen der Look dieses Stils gefällt, der auch für Bash gilt (eliminiert die Dollarzeichen, lässt Leerzeichen um das Gleichheitszeichen zu und erlaubt kombinierte Zuweisungsoperatoren): ((v = v * 5))oder((v *= 5))
Dennis Williamson
2
Schön, aber ich habe das +=Ding sofort entdeckt.
Nyuszika7h
2
@ardnew ja gibt es. Die ersten beiden Zeilen ( v=2und v+=2): Für jemanden, der mit der Handhabung von Bash-Variablen nicht vertraut ist, wäre dies äquivalent 2+2, aber es ist tatsächlich so "2"+"2", dh "22". Die anderen Kommentare im Code sind nur deswegen falsch. Ich weiß, nicht jeder findet das lustig
101

Python

Inspiriert von der Java-Antwort:

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

Wie Java verwendet CPython denselben Speicherort für jede Kopie der ersten kleinen Ganzzahlen (0-255, wenn der Speicher belegt ist). Dies geht in und bearbeitet diesen Speicherplatz direkt über ctypes. patchist nur eine verschleierte "12-7"Zeichenfolge mit len4, was eval5 entspricht.

Eine verschleierte Version

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")

Jenseits von 2 + 2

Wie OP erwähnt, kann 2 + 2 ein bisschen langweilig sein; Hier ist also ein sauberer, plattformübergreifender Code mit mehreren Breiten für mutwilligen Missbrauch.

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

Läuft mit Python 2.7 ... ignoriere diese Zeile am Ende. Funktioniert unter Windows 64-Bit und Ubuntu 32-Bit, die beiden Systeme, auf die ich einfachen Zugriff habe.

$ 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)

Es ist nicht überraschend, dass wir die assoziative Eigenschaft der Addition brechen können, wobei ( a + b ) + c = a + ( b + c ), wie in der 1. und 2. 1+2+3Zeile gezeigt, aber unerklärlicherweise auch die kommutative Eigenschaft (wobei a + b) = b + a ; 2. und 3. Zeile). Ich frage mich, ob der Python-Interpreter überflüssige Klammern um Additionsausdrücke einfach ignoriert.

Nick T
quelle
96
Ja, wir alle ignorieren Segfaults auf jeden Fall nur beiläufig ...
10
Erwähnenswert ist, dass dies kein wirklicher Python-Trick ist und nur für die C-Implementierung von Python gilt.
xApple
1
@NickT Ah! in Ordnung. Ich hatte den Eindruck, dass Sie das Original unter den gleichen 64-Bit-Windows-32-Bit-Ubuntu-Setup
versucht hatten
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')Ist eine modifizierte erste Version. Ich habe das gemacht, damit ich es als rotes Team in Hacking-Wettbewerben in $ PYTHONSTARTUP in / etc / profile ablegen kann.
DavidJFelix
2
Ja. Nebenbei bemerkt scheinen 1, 0 und -1 einige der Zahlen zu sein, mit denen Python sofort einen Fehler macht. Ich dachte, das wäre das Schlimmste, um das Verhalten von Python-Programmen zu vermasseln. Möglicherweise kann fuckitpy verwendet werden , um diese Fehler einzudämmen.
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())

Überprüfen Sie es auf http://jsfiddle.net/qhRJY/

Sowohl H (lateinisches Großbuchstaben h) als auch Η (griechisches Großbuchstaben eta) werden auf den globalen Gültigkeitsbereich festgelegt, da sie für die Funktionen mit dem Schlüsselwort var nicht als lokal definiert wurden. Während sie ähnlich aussehen, sind sie tatsächlich 2 verschiedene Variablen mit 2 verschiedenen Werten. Wenn Sie Strg + F in Ihrem Browser verwenden, werden Sie feststellen, dass Η (eta) auf dieser Seite deutlich weniger als H (h) anzeigt.

Konstantin Weitz
quelle
4
@Sam, obwohl die beiden Hs gleich aussehen, sind sie tatsächlich zwei völlig verschiedene Charaktere. In Unicode kann es verschiedene Zeichen geben, die gleich aussehen, aber unterschiedliche Codepunkte haben. In diesem speziellen Fall; das andere "H" ist eigentlich der griechische Buchstabe Eta .
d3dave
79
Die Verwendung von Homoglyphen, um Leser zu "verwirren", ist nun offiziell nicht mehr lustig .
John Dvorak
29
Die Homoglyphen werden in Kombination mit den lächerlichen globalen Variablen von Javascript lustig.
Konstantin Weitz
3
Es ist nicht das "Unicode Η-Zeichen", sondern Latein H und Griechisch Eta (Η).
Phyzome
4
@Vortico hmm ... was wünschst du dir, wenn eine FAQ-Frage nicht ausreicht? Eine FAQ-Frage aus der Hilfe verlinkt? Beachten Sie, dass nur Moderatoren das faq- Tag anwenden können . Was die Antwort betrifft, lautet die Frage "Punktzahl +5 oder mehr und mindestens doppelt so viele positive Stimmen wie negative Stimmen". Die Antwort hat 27 positive und keine negative Stimmen. Das hört sich für mich so an, als ob ich die in der Antwort angegebenen Kriterien erfüllte. Die Anzahl der positiven Bewertungen für die zweitälteste Antwort auf eine Frage auf der Meta-Site einer Site, auf der nur 124 Personen mehr als zehn Mal abgestimmt haben, ist beeindruckend. Wie viele möchten Sie ? Jedermann?
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) );

Das unterschwellige Bit ist, dass es nicht tatsächlich unterschwellig ist - wenn Sie eine 2-dB-Tonquelle zu einer anderen 2-dB-Tonquelle hinzufügen, ergibt sich ein kombiniertes Rauschen von 5 dB (und wenn Sie zwei 30-dB-Quellen hinzufügen, dann sind es 33 dB), wie sie auf einer logarithmischen Skala gemessen werden.

Sie können es hier auf einem anderen Rechner sehen .

MT0
quelle
Nun, es ist eigentlich eher 5,01 Dezibel, aber weit genug von 4 entfernt, um zu zählen.
Joe Z.
68

PHP

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

Welches produziert:

2 + 2 = 5

Dies liegt daran, dass in PHP die Ternären von links nach rechts berechnet werden, also tatsächlich
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';

MrLore
quelle
35
obligatorische phpsadness
wchargin
1
Ich habe ein anderes PHPBeispiel:$a=2;echo "2+2=".$a++ + $a++;
Avall
Es ist offensichtlich, dass $ a ++ 3 ergibt und das Ergebnis 6 ist. Ich verstehe nicht, was Sie denken.
Ozh
1
@ Janus PHPsadness # 30 erklärt es gut
wchargin
66

JavaScript

var total = 2 + 2;

if(total = 5)
{
    alert('I guess 2 + 2 = 5');
}
else
{
    alert('The universe is sane, 2 + 2 = 4');
}
user1886419
quelle
73
=statt ==, leicht zu sehen und ehrlich gesagt eher einfallslos.
ApproachingDarknessFish
19
Habe trotzdem eine positive Bewertung, ich mache diesen Fehler viel
6
Diese Antwort gefällt mir immer noch
Sam Creamer
5
Ich mag es auch. Nicht jede Sprache wird =nur als Assigment verwendet, sondern als Vergleichsoperator (z. B. Pascal, SQL, VB)
voraussichtlich
Ich finde es sehr offensichtlich
Oliver Ni
57

C #

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

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

        Console.WriteLine(x + y);
    }
Grax32
quelle
7
Ah, der gute alte Trick mit Schurkenfiguren. Deshalb sollten Sie 1TBS überall verwenden.
John Dvorak
11
@ JanDvorak Funktioniert dies aufgrund des Semikolons nach der if-Anweisung? Ich kenne C # nicht, habe aber C ++
5
@professorfish das nehme ich an. Sprachen, in denen Sie keine zufälligen geschweiften Klammern FTW einfügen können.
John Dvorak
12
Ohne das ";" steuert die if-Anweisung, ob der Codeblock ausgeführt wird. Mit dem ";" dort wird das if ausgewertet, aber mit dem Ergebnis wird nichts gemacht. Dann wird der Codeblock unabhängig davon jedes Mal ausgeführt. In C # ist es durchaus akzeptabel, zufällige Codeblöcke zu haben.
Grax32
2
Ich habe mich neulich damit beschäftigt. Ich hatte eine for-Schleife mit einem ;danach, was durchaus beabsichtigt war, da ich die leere Schleife zum Vorrücken eines Cursors verwendete. Ich habe versehentlich das Semikolon entfernt, alles ist in die Luft gesprengt, und ich konnte nicht herausfinden, warum.
2.
56

Es ist gefährlich, Ihr Javascript mit ASCII-Kunst zu dekorieren.

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

     (2 + 2)

Wenn die Kommentare entfernt werden, werden die verbleibenden Symbole und Operatoren zu ausgewertet.
-~~--~(2 + 2) Dies verwendet den bitweisen Nicht-Operator (~) in JS zusammen mit einigen Minuszeichen, die die Werte auf dem Weg negieren.

Dan Prince
quelle
3
Ich habe mich gefragt, wie der --Operator akzeptabel ist, da er Fehler machen sollte Invalid left-hand side expression in prefix operation. Ich erkannte jedoch, dass zwischen ihnen ein Leerzeichen ist.
Usandfriends
53

Bash

#!/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}"

Ausgabe:

2 + 2 = 5

Die Ausgabe von jedem cathat eine implizite neue Zeile, aber die letzte neue Zeile wird durch die Befehlsersetzung entfernt$( )


Hier ist ein anderes:

#!/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]}"

Bash-Arrays sind mit Nullen indiziert

Digitales Trauma
quelle
3
Den ersten habe ich tatsächlich erwischt, da ich beim Golfen in Bash viele Probleme damit hatte. Was den zweiten betrifft, wo sind Arrays nicht mit Nullindex versehen?
3
@professorfish Applescript, zum Beispiel:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Digitales Trauma
12
@DigitalTrauma Applescript ist komisch
5
zshVerwendet 1-indizierte Arrays (und $arr[0]ist einfach nicht gesetzt oder undefiniert oder so), sofern die KSH_ARRAYSOption nicht gesetzt ist. In diesem Fall sind Arrays 0-indiziert.
Chepner
4
@professorfush: Lua & Fortran sind 1 indiziert. Immer wenn ich bis 10 zähle, beginne ich mit 1, nicht mit 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...";
}

Dies hängt vom CPAN-Modul namens Acme :: NewMath ab . Aufgrund falscher Dateinamen im Modul funktioniert dies nur bei Dateisystemen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird (wie unter Windows oder Mac OS X), aber ich beschuldige hier den Autor des ursprünglichen Moduls. Acme :: NewMath implementiert Mathematik gemäß der Ingsoc-Ideologie.

Konrad Borowski
quelle
16
Das ist ziemlich schlau. Niemand betrachtet jemals Ihre Importe / Einschlüsse.
44

R

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

Ausgabe:

5

Der Code addiert den Mittelwert von [1] zum Mittelwert von [4]. Der richtige Weg , um die mittlere Funktion in R zu verwenden wäre: mean(c(1,3)) + mean(c(4,0))Dies ist im Gegensatz zu einigen anderen mathematischen Funktionen in R, wie sum, max, und min; wo sum(1,3), max(1,3)und min(3,1)würden alle die erwartete Antwort geben.

Klingeln
quelle
7
Nicht schlecht, hat mich ein bisschen reingelegt.
QWR
37

Java

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

Ausgabe:

512.0000000000005

Funktioniert wahrscheinlich in jeder Sprache, die die gleiche Art von Double verwendet.

aditsu
quelle
7
Das ist eine sehr merkwürdige Hauptsignatur.
Bertie Wheen
10
Java implementiert verschiedene Argumente als Arrays unter der Haube.
CodaFi
4
Es dauerte einen Moment, bis mir klar wurde, dass es sich wahrscheinlich um die letzten Ziffern im Doppel handelt. Ich habe gesehen, dass die ersten Ziffern richtig hinzugefügt wurden ( _2_56 + _2_56 = _5_12), aber es ist wahrscheinlicher, dass Sie meinen 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(Hinweis: Unterstriche, die verwendet wurden, um die Ziffern "fett" zu machen.
Justin
35

Befunge

Dies ist in Befunge geschrieben, sieht aber wie Python aus.

#>>>>>>>>>>>>>>>>>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: [email protected]

Beim Ausführen (mit dem richtigen Interpreter) wird das Programm gedruckt 5.

Erläuterung:

Ein Befunge-Programm besteht aus einem Raster von Einzelzeichenbefehlen. Der erste Befehl befindet sich in der oberen linken Ecke, und das Lesen der Befehle erfolgt nach rechts. Die Richtung kann sich jedoch während der Programmausführung ändern.

Es werden nur die erste Zeichenreihe und die mit vder ersten Zeile beginnende Zeichenreihe ausgeführt. Die fraglichen Zeichen tun Folgendes :

#- Den nächsten Befehl überspringen
>- Von nun an werden Befehle rechts neben dem aktuellen Befehl
vgelesen - Von nun an werden Befehle unter dem aktuellen Befehl gelesen
5- 5 auf den Stapel schieben
.- Die Nummer einfügen und ausdrucken ganz oben auf dem Stapel
@- Programm
<space>beenden - Nichts unternehmen

Wenn Sie wüssten, dass Sie in Befunge programmieren, würde dies niemanden wirklich täuschen. Aber wenn Sie darauf gestoßen sind und nicht bemerkt haben, dass es sich um Befunge handelt, wird dies höchstwahrscheinlich der Fall sein.

Matt
quelle
11
+1, Das ist sehr umständlich, denn wer zum Teufel sieht sich das Programm an, das den Quellcode beim Debuggen ausführt?
MrLore
33

JavaScript

Code:

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

Ausgabe:

5

Sie können es selbst auf Ihrer Konsole testen oder diese Geige überprüfen

William Barbosa
quelle
6
Können Sie mir auf eine Ressource verweisen oder mir erklären, warum dies funktioniert? Ich weiß, dass es funktioniert, weil ich die Geige herausgefunden habe, aber ich verstehe nicht warum.
Familie
29
Die "a" -Variable ist nicht beide Male gleich (sorry, wenn ich dies verderbe). Tatsächlich ein hinterhältiger Unicode
Sam Creamer
6
Ich liebe es, wie das nächste Zeichen U+0431á ist - fast 6!
wchargin
73
Die Verwendung von Homoglyphen, um Leser zu "verwirren", ist nun offiziell nicht mehr lustig .
John Dvorak
40
@ JanDvorak Diese Antwort wurde nach dieser Antwort gepostet. es gilt hier nicht.
Türklinke
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);  
}

Es wird 2 + 2 = 5 ausgegeben

Also a = 2, richtig?

gcc-4.7.3 wertet die Funktionsparameter von rechts nach links aus. Wenn a + b ausgewertet wird, ist a immer noch 3.

cpri
quelle
16
Nizza Verwendung von nicht näher bezeichneten Verhaltens
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

Standardmissbrauch von commonBlöcken: Ordnungsangelegenheiten; Ich habe die Reihenfolge im Block im Unterprogramm vertauscht, also füge ich wirklich hinzu 1 + 2 + 2.

Kyle Kanos
quelle
6
@JanDvorak: Haha, ich hätte Fortran IV verwendet , in denen ich Literale neu definieren könnte, zum Beispiel2=3
Kyle Kanos
1
@KyleKanos, das dachte ich mir, als ich sah, dass dein Beitrag in FORTRAN geschrieben wurde.
Danmcardle
@KyleKanos Mach es!
ClickRick
1
@KyleKanos: Hat das mit Integer-Literalen geklappt oder nur mit Floats? Ich würde denken, dass auf einer Maschine dieser Ära ein Integer-Literal und eine Adresse dieselbe Größe hätten, aber kleiner als ein Float, so dass das Poolen von Float-Literalen Platz spart, das Poolen von Int-Literalen jedoch nicht.
Supercat
2
@KyleKanos: Ich verstehe, dass Compiler keine direkte Zuweisung zu einem Literal zulassen. Verwendete Funktionsaufrufe werden jedoch als Referenz übergeben, und die Übergabe eines Gleitkomma-Literal an eine Funktion übergibt im Allgemeinen die Adresse eines Werts in einem Pool von Gleitkommazahlen Literale. Wenn Sie einen Integer-Wert an eine Funktion übergeben, wird dieser zusammengefasst. Die meisten Codes, die Ganzzahlen verwenden, enthalten die Werte jedoch direkt.
Supercat
24

Python

Der Code gibt 5 aus, was die richtige Antwort für diese Aufgabe ist.

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

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

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

Bearbeiten: Hier ist eine alternative Version, in der ganze Zahlen hinzugefügt werden, nicht zwei.

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

Tilde ist ein unärer inverser Operator, der zurückkehrt -x-1. Der erste Schritt besteht also darin, einen -6anderen Operator abzurufen und dann die printFunktion zu erhalten5

avall
quelle
Warum ~eval(`a`)statt nur ~a?
Andrea Corbellini
2
Ich wollte einige der int()Funktionen verlassen und eval()erledige die Aufgabe, wenn die Eingabe eine Ganzzahl mit String ist :)
avall
24

Rubin

class Fixnum
    alias plus +

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

puts 2 + 2

Dies erhöht das Ergebnis aller Zusätze, deren erstes Argument ein Fixnum ist (welches 2 ist, zumindest in der MRT), um 1.

Die Nebenwirkungen sind noch schlimmer als bei der Java-Version.

Lowjacker
quelle
23

Rubin

Ruby hat erstklassige Umgebungen. Das bedeutet viele Dinge. Es bedeutet auch, dass viele Dinge getan werden können, die vielleicht nicht getan werden sollten.

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

Die Ausgabe davon ist:

2 + 2 = 
4
2 + 4 = 
6
Aber im Jahr 1984 ...
2 + 2 = 
5
2 + 4 = 
6

Wenn Sie mehr über die Freuden und Gefahren verstehen möchten, lesen Sie Ruby Conf 2011 Keeping Ruby Reasonable und erstklassige Umgebungen im Abstract Heresies-Blog.


quelle
Außerdem:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42
1
Nur für den konkreten Fall zu tun: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

Planen

(define 2+2 5)
2+2 ;=> 5
Holeth
quelle
9
Hallo! 2+2ist nicht so, wie du Addition in Lisp machst!
John Dvorak
1
Na und? Es kommt scheinbar 2 zu 2 hinzu, wie es in der Aufgabe steht.
Holeth
119
@ JanDvorak Ich habe noch nie lisp verwendet, aber wie ich es verstehe, ist es so etwas wie ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
Undergroundmonorail
2
"Die Neudefinition von 2 + 2 als 5 ist nicht sehr kreativ! Denken Sie nicht zweimal darüber nach, probieren Sie etwas anderes." --- Nun, in R5RS kann ich + stattdessen 2 + 2 oder 2 neu definieren. Die Antwort ist hier: pastebin.com/KHtm9Jmv
Felipe
1
@FelipeMicaroniLalli diese Anmerkung wurde nach meiner Antwort gemacht, also zählt es nicht.
Hauleth
20

C #

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

Für jemanden, der nicht vertraut ist, sieht es so aus, als würde ein Bereich bei 2 beginnen und enden. In Wirklichkeit beginnt er bei 2 und gilt für zwei Zahlen. Also 2 + 3 = 5.

Paul
quelle
6
Ein Bereich, der bei 2 beginnt und endet, wäre gerecht { 2 }, nicht wahr?
Paŭlo Ebermann
1
@ PaŭloEbermann Enumerable.Rangebraucht keinen Anfang und kein Ende, sondern einen Anfang und eine Zählung (von Elementen, die aufgezählt werden).
MasterMastic
14
@MasterMastic Das habe ich aus der Erklärung in der Antwort verstanden. Aber die Bedeutung "für jemanden, der nicht vertraut ist" soll ein solcher Bereich sein (von der Erklärung in der Antwort), und mein Argument ist, dass das erwartete Ergebnis dann 2, nicht 4 sein würde.
Paŭlo Ebermann
1
@PaŭloEbermann, ja so sieht es auch aus. Ich dachte, es könnte eher so aussehen, als würde ich die Zahlen angeben, um sie hinzuzufügen. Enumerable.Range (1,2,3,4) würde also bei 1 beginnen, bei 4 enden und bis 10 summieren.
Paul
19

F #

Lassen Sie uns folgende Anweisung in fsi einfügen:

let ``2+2``= 5

Ausgabe:

val ( 2+2 ) : int = 5
Krzysztof Cieslak
quelle
18

C

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

Das 5ist leider nicht so gut versteckt. Funktioniert nicht mit Optimierung.

ugoren
quelle
1
Nett; Ich kann nicht upvoten, wenn undefiniertes Verhalten nicht erlaubt ist.
dieser
2
Ich sehe nicht, wo es verboten ist, sich auf UB zu verlassen. Viele Code Golf Antwort verlassen sich auf UB, und ich denke, es ist in Ordnung, solange es konsequent auf einer vernünftigen Plattform geschieht.
Ugoren
2
Ich verstehe nicht, wo es verboten ist, sich auf UB zu verlassen. Ich habe auch keine Regeln dafür gefunden. Es wäre schön, wenn das geklärt werden könnte. Viele Code Golf Antwort verlassen sich auf UB, und ich denke, es ist in Ordnung, solange es konsequent auf einer vernünftigen Plattform passiert. Einige spezifische Regeln dazu wären nett.
dieser