Tulis program yang menghasilkan 2 + 2 = 5 [ditutup]

393

Tulis sebuah program yang sepertinya menambah angka 2 dan 2 dan hasilnya 5. Ini adalah kontes curang.

Program Anda tidak dapat menghasilkan kesalahan. Hati-hati terhadap lubang memori! Masukan adalah opsional.

Mendefinisikan ulang 2 + 2 sebagai 5 tidak terlalu kreatif! Jangan ragu untuk memikirkannya, coba sesuatu yang lain.

qwr
sumber
48
Ini adalah pertanyaan dalam buku "1984" karya George Orwelll.
bacchusbeale
97
Mengapa ini curang? Dua tambah dua adalah lima.
Geobits
79
SANA! ADALAH! EMPAT! LAMPU!
Nick T
105
@ Geobits - Saya setuju: 2 + 2 = 5 Anda dapat melihatnya di kalkulator ini .
MT0
47
echo "2+2=5";
user3459110

Jawaban:

669

Jawa

Refleksi memang cara yang tepat untuk menyalahgunakan Java ... tetapi Anda harus lebih dalam dari sekadar mengubah beberapa nilai.

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

Keluaran:

5

Penjelasan:

Anda perlu mengubahnya lebih dalam daripada yang biasanya Anda akses. Perhatikan bahwa ini dirancang untuk Java 6 tanpa parameter funky yang dilewatkan pada JVM yang jika tidak akan mengubah IntegerCache .

Jauh di dalam kelas Integer adalah Flyweight of Integers. Ini adalah array bilangan bulat dari −128 hingga +127. cache[132]adalah tempat di mana 4 biasanya. Atur ke 5.

Peringatan: Melakukan ini dalam kode nyata akan membuat orang sangat tidak bahagia.

Demo kode pada ideone .

Dennis
sumber
5
Memikirkan hal ini segera setelah saya melihat pertanyaan :)
Octavia Togami
306
Bahwa. Aku s. Jahat. Benar-benar jahat. +1
John Dvorak
75
@JanDvorak dalam obrolan disarankan Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Bayangkan berapa banyak hal yang akan rusak ...
30
Jawaban seperti ini membuat saya lebih menyukai situs ini daripada SO.
Songo
35
zomg, jawaban java tidak pernah mendapatkan suara teratas! +1 untuk membawa java ke atas :)
Cruncher
297

Haskell

Saya hanya suka bagaimana Anda bisa melempar apa saja ke ghci dan benar-benar cocok dengannya.

λ> let 2+2=5 in 2+2
5
Flonk
sumber
36
Apa yang let 2+2=5 in 5+5harus dilakukan ಠ_ಠ
John Dvorak
22
@ JanDvorak Non-exhaustive patterns in function +- Saya mendefinisikan fungsi baru (+) di sini, dan Jika saya memasukkan apa pun yang tidak 2+2akan kesalahan karena saya tidak pernah menentukan apa yang harus terjadi dalam kasus itu.
Flonk
27
@SHiNKiROU bayangan, bukan mendefinisikan ulang
John Dvorak
96
yang hampir terdengar seperti: "Dan Tuhan berkata biarkan 2 + 2 = 5 in 2 + 2"))
OutFall
11
@ user3217013 Pelajari Haskell, itu baik untuk hatimu.
Sepatu
294

C

Trik yang cukup murah tapi saya yakin saya akan menjebak Anda semua.

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

Coba di sini

Gulirkan kode ke kanan.
Saya tidak yakin tentang Windows / Linux tetapi pada OSX, scrollbar tidak terlihat.
Bagaimanapun, ini adalah alasan yang bagus untuk mengaktifkan "visualisasi ruang" pada editor kode favorit Anda.

Michael M.
sumber
96
Scrollbar terlihat di Chromium, tetapi siapa yang memperhatikannya pada awalnya? :)
Ruslan
172
Untuk membingungkan orang, Anda dapat menambahkan baris komentar yang cukup panjang untuk "menjelaskan" keberadaan bilah gulir, tetapi cukup membosankan sehingga tidak ada yang peduli (gulir untuk) membacanya.
Hagen von Eitzen
22
Pada OS X, visibilitas scrollbar secara default tergantung pada apakah mouse terhubung. Jika hanya ada touchpad, bilah gulir dilapis dan menghilang saat tidak digunakan. Jika ada mouse yang terhubung, scrollbar mencuri ruang dari kotak konteks dan selalu terlihat. Anda dapat menguji ini dengan mencabut dan mencolokkan mouse USB ke MacBook. Ini dapat dikonfigurasi dalam System Preferences, tentu saja.
Andrea
49
Pintar, tetapi di ponsel itu hanya wordwraps :)
Logan
31
Ini adalah satu-satunya waktu bergulir jendela kode SE tidak membuat saya ingin mematahkan jari seseorang.
ObscureRobot
184

GolfScript

4:echo(2+2);

Cetakan 5.

Tentu saja GolfScript memiliki sintaks yang sangat berbeda dari bahasa lain, program ini kebetulan terlihat seperti sesuatu yang Basic atau C-ish.

4  - Letakkan nomor 4 di tumpukan. Konten tumpukan: 4
:echo- Simpan nilai di bagian atas tumpukan ke gema variabel. Isi tumpukan: 4
(  - Mengurangi nilai di bagian atas tumpukan dengan 1. Konten tumpukan: 3
2  - Letakkan angka 2 di atas tumpukan. Isi tumpukan: 3 2
+  - Tambahkan dua angka di atas tumpukan. Isi tumpukan: 5
2  - Letakkan nomor 2 di atas tumpukan. Konten tumpukan: 5 2
)  - Menambah nilai di bagian atas tumpukan dengan 1. Konten tumpukan: 5 3
;  - Hapus elemen atas dari tumpukan. Isi tumpukan: 5

GolfScript secara default akan mencetak apa pun yang tersisa di tumpukan setelah eksekusi selesai.

aaaaaaaaaaaa
sumber
3
Bisakah Anda jelaskan itu untuk orang-orang yang tidak berbicara GolfScript?
MadTux
1
@ MadTux Ini dia.
aaaaaaaaaaaa
1
Terima kasih. (Saya akan angkat suara nanti karena saya mencapai batas harian saya, ini bir.)
MadTux
5
Sederhana dan curang, saya menyukainya. +1
seequ
9
saya suka itu karena sepertinya tidak menipu Anda dengan matematika atau semantik, tampaknya sangat mudah namun 5 ^^
dwana
145

Jawa

Selalu harus membulatkan dobel Anda, kawan

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

Keluaran:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Penjelasan:

Tidak, serius, Anda harus selalu membulatkan dobel Anda. Angka 15 tidak cukup untuk menunjukkan bahwa two()metode tersebut benar-benar menghasilkan 2.0000000000000004(16 sudah cukup, meskipun).

Dalam representasi Hex baku angka, itu hanya perbedaan 1 bit (antara 4000000000000001dan 4000000000000000) ... yang cukup untuk membuat Math.ceilmetode mengembalikan 5, bukan 4.

durron597
sumber
61
Math.ceil(two + two); // round just in caseSaya melihat apa yang Anda lakukan di sana
Tim S.
17
Membuat fungsi dan variabel dengan nama yang sama ... Wow.
konfigurator
107
@configurator bukan apa-apa, bahkan tidak ada kelas bernama two. Two two = Two.two.two();Tingkat produksi java adalah dengan Dua. Menjadi tipe TwoFactory.
Jannis Froese
36
Two.Infinity.And.Beyond ()
CincauHangus
7
@TimSaya tidak tahu apa yang Anda lakukan di sana
thenaglecode
135

BBC BASIC

EDIT: Untuk Andrea Faulds dan Squeamish Ossifrage, versi yang lebih meyakinkan menggunakan penerjemah berbeda: 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

Ini sebenarnya mencetak angka 4, tetapi VDU 23mendefinisikan ulang font untuk ASCII 52 sehingga terlihat seperti 5 bukannya 4. Mode layar 6 dipilih karena alasan estetika (karakter dengan ukuran yang masuk akal.)

Gambar asli menggunakan emulator di http://bbcbasic.co.uk/bbcwin/bbcwin.html . (dengan kode yang sedikit berbeda) dapat dilihat pada riwayat edit.

Level River St
sumber
8
Font-font tersebut terlihat berbeda. Apakah Anda pikir Anda bisa membuatnya menggunakan font yang benar?
Andrea
@AndreaFaulds Saya menggunakan emulator dari bbcbasic.co.uk/bbcwin/bbcwin.html . Ini mendukung redefinisi font dari BBC Basic asli pada grid 8x8. Tetapi font default dari emulator jelas lebih tinggi dari 8x8. Jadi saya mungkin bisa melakukan pekerjaan yang lebih baik, tetapi itu tidak akan sempurna. Saya kira saya bisa mendefinisikan ulang font untuk semua 5 dan 4, maka mereka akan terlihat sama.
Level River St
5
@AndreaFaulds Pertanyaannya tidak mengatakan bahwa hasilnya harus dapat dibedakan dari 5s lainnya. Saya pikir ini sebenarnya fitur. 2+3=5dan2+2=5'
Ben Jackson
1
Ini cocok dengan font asli di BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
squeamish ossifrage
@squeamishossifrage terima kasih atas informasinya. Itu tidak akan cocok dengan font di emulator. Contoh Anda adalah 7 piksel, sama seperti milik saya. Juga memiliki nol di bagian bawah, sama seperti milik saya, sedangkan sepertinya saya perlu memindahkannya sedikit (yaitu, memiliki nol di bagian atas, bukan bagian bawah.) Perbedaan utama adalah bahwa saya memiliki 126,64 sedangkan Anda memiliki 126,96, dan Anda memiliki beberapa 6 bukannya 2 saya. Itu karena font BBC asli memiliki garis vertikal tebal, sehingga dapat dibaca dengan mudah dalam format 80 kolom pada layar TV standar.
Level River St
134

Brainfuck

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

Keluaran:

5

Coba di sini .

Saya tahu ini mungkin terdengar agak sederhana, tetapi saya mencoba untuk menjadi kreatif, seperti yang disarankan dalam posting asli.

tigrou
sumber
1
Saya tidak tahu apa-apa, saya perlu beberapa menit untuk mencari tahu. ASCII 53, kan?
Level River St
4
Selama kamu punya, +++++.kamu bisa mengecat apa saja.
Eduard Florinescu
1
@steveverrill: ya Anda benar. (dan ini adalah satu-satunya cara untuk menghasilkan karakter ascii dalam BF).
tigrou
1
Saya tidak mengerti dan
Leif Willerts
105

Pesta

Karena ini adalah , kurasa aku harus menggunakan metode bertele-tele ...

Untuk orang yang tidak tahu Bash: $((...expr...))adalah sintaks untuk mengevaluasi ekspresi aritmatika. $(bc<<<...expr...)melakukan hal yang sama menggunakan bckalkulator baris perintah.

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

Keluaran

2+2= 5

Penjelasan

Baris kedua menggabungkan v dan 2 alih-alih menambahkannya, untuk membuat 22.
Penjelasan aktual:
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


sumber
8
Trik matematika bagus terjadi di sana!
mulai
5
@tomsmeding Itu cukup menyenangkan, meskipun sekitar setengah jalan saya menyadari bahwa saya telah menempatkan 15bukannya 16pada baris 4. Untungnya, itu masih berhasil karena bcpembulatan
2
Lihat apakah Anda menyukai tampilan gaya ini yang juga berlaku Bash (menghilangkan tanda dolar, memungkinkan spasi di sekitar tanda sama dan memungkinkan operator penugasan gabungan): ((v = v * 5))atau((v *= 5))
Dennis Williamson
2
Bagus sekali, tapi aku +=segera melihatnya .
nyuszika7h
2
@ baru ya ada. dua baris pertama ( v=2dan v+=2): untuk seseorang yang tidak terbiasa dengan penanganan variabel Bash, itu akan setara dengan 2+2, tetapi sebenarnya "2"+"2", yaitu "22". komentar lain dalam kode hanya salah karena ini. Saya tahu, tidak semua orang menganggap ini lucu
101

Python

Terinspirasi oleh jawaban Java:

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

Seperti Java, CPython menggunakan lokasi memori yang sama untuk setiap salinan dari bilangan bulat kecil pertama (0-255 jika memori berfungsi). Ini masuk dan langsung mengedit lokasi memori melalui ctypes. patchhanya sebuah dikaburkan "12-7", sebuah string dengan len4, yang evalke 5.

Versi yang lebih dikaburkan

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

Melampaui 2 + 2

Seperti yang disebutkan OP, 2 + 2 bisa agak membosankan; jadi inilah beberapa kode multi-lebar yang lebih bersih, multi platform, untuk penyalahgunaan tanpa izin.

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

Menjalankan dengan Python 2.7 ... abaikan baris itu di akhir. Bekerja di Windows 64-bit dan Ubuntu 32-bit, dua sistem yang mudah saya akses.

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

Tidak mengherankan, kita dapat menghancurkan properti asosiatif dari penambahan, di mana ( a + b ) + c = a + ( b + c ), seperti yang terlihat pada baris 1 dan 2 1+2+3, tetapi entah kenapa kita juga merusak properti komutatif (di mana a + b = b + a ; Baris ke-2 dan ke-3). Saya bertanya-tanya apakah interpreter Python hanya mengabaikan tanda kurung berlebihan di sekitar ekspresi tambahan.

Nick T
sumber
96
Ya, kita semua mengabaikan abaikan saja ...
10
Perlu disebutkan bahwa ini bukan trik Python dan hanya khusus untuk implementasi C dari Python.
xApple
1
@NickT Ah! baik. Saya mendapat kesan bahwa Anda telah mencoba yang asli di bawah jendela 64-bit yang sama, pengaturan ubuntu 32-bit
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')Merupakan versi pertama yang dimodifikasi. Saya membuat ini sehingga saya bisa memasukkannya ke $ PYTHONSTARTUP di / etc / profile sebagai tim merah dalam kompetisi hacking.
DavidJFelix
2
Ya. Sidenote, tampaknya 1, 0 dan -1 adalah beberapa angka yang python segfaults dengan segera. Saya berpikir itu akan menjadi yang terburuk untuk mengacaukan perilaku program python. Dimungkinkan untuk menggunakan fuckitpy untuk mengandung kesalahan ini.
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())

Lihat di http://jsfiddle.net/qhRJY/

Baik H (huruf latin kapital h) dan Η (huruf Yunani capital eta) diatur ke lingkup global karena mereka tidak didefinisikan sebagai lokal ke fungsi dengan kata kunci var. Sementara mereka terlihat mirip, mereka sebenarnya 2 variabel yang berbeda dengan 2 nilai yang berbeda. Dengan menggunakan Ctrl + F di browser Anda, Anda akan menemukan bahwa Η (eta) muncul secara signifikan kurang dari H (h) pada halaman ini.

Konstantin Weitz
sumber
4
@ Sam meskipun kedua H terlihat sama, mereka sebenarnya 2 karakter yang sama sekali berbeda. Dalam Unicode mungkin ada karakter yang berbeda yang terlihat sama tetapi memiliki titik kode yang berbeda. Dalam kasus khusus ini; yang lainnya "H" sebenarnya adalah huruf yunani Eta .
d3dave
79
Menggunakan homoglyphs untuk "membingungkan" pembaca sekarang secara resmi tidak lucu .
John Dvorak
29
Homoglyphs menjadi lucu dalam kombinasi dengan variabel global konyol javascript.
Konstantin Weitz
3
Ini bukan "Unicode Η karakter", itu Latin H dan Greek Eta (Η).
perlakukan mod Anda dengan baik
4
@Vortico hmm ... apa yang Anda inginkan ketika pertanyaan FAQ tidak cukup? Pertanyaan FAQ yang ditautkan dari pusat bantuan? Perhatikan bahwa hanya moderator yang dapat menerapkan tag faq . Adapun jawabannya - pertanyaannya menyatakan "skor +5 atau lebih dan setidaknya dua kali lebih banyak upvotes daripada downvotes". Jawabannya memiliki 27 upvote dan tidak ada downvote. Kedengarannya bagi saya seperti memenuhi kriteria yang dinyatakan dalam jawaban, dan jumlah upvotes cukup mengesankan untuk jawaban tertua kedua pada pertanyaan di situs meta situs di mana hanya 124 orang telah memilih lebih dari 10 kali. Berapa banyak yang kamu mau? Semua orang?
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) );

Bit underhanded adalah bahwa itu tidak benar-benar curang - jika Anda menambahkan sumber suara 2dB ke sumber suara 2dB lain maka kebisingan gabungan akan menjadi 5dB (dan jika Anda menambahkan dua sumber 30dB maka 33dB) karena diukur pada skala log.

Anda dapat melihatnya di kalkulator berbeda di sini .

MT0
sumber
Sebenarnya ini lebih seperti 5,01 desibel, tetapi cukup jauh dari 4 untuk dihitung.
Joe Z.
68

PHP

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

Yang menghasilkan:

2 + 2 = 5

Ini karena dalam PHP, ternary dihitung dari kiri ke kanan, jadi sebenarnya
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';

TuanLore
sumber
35
phpsadness
wchargin
1
Saya punya PHPcontoh lain :$a=2;echo "2+2=".$a++ + $a++;
avall
Jelas bahwa $ a ++ menghasilkan 3 dan hasilnya adalah 6. Saya tidak mengerti apa yang Anda pikirkan.
Ozh
1
@Janus PHPsadness # 30 menjelaskannya dengan baik
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');
}
pengguna1886419
sumber
73
=alih-alih ==, mudah dilihat dan terus terang agak tidak terinspirasi.
ApproachingDarknessFish
19
Punya upvote, saya membuat kesalahan itu banyak
6
Saya masih suka jawaban ini
Sam Creamer
5
Aku juga menyukainya. Tidak setiap bahasa =hanya menggunakan sebagai assigment tetapi operator perbandingan (misalnya Pascal, SQL, VB)
avall
Saya merasa sangat jelas
Oliver Ni
57

C #

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

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

        Console.WriteLine(x + y);
    }
Grax32
sumber
7
ah, trik lama yang bagus dengan karakter nakal. Itu sebabnya Anda harus menggunakan 1TBS di mana-mana.
John Dvorak
11
@ JanDvorak Apakah ini berfungsi karena tanda titik koma setelah pernyataan if? Saya tidak tahu C # tetapi saya telah menggunakan C ++
5
@pressorfish itulah yang saya asumsikan. Juga, bahasa yang tidak memungkinkan Anda memasukkan kurung kurawal FTW.
John Dvorak
12
Tanpa ";", pernyataan if mengontrol apakah blok kode akan dieksekusi. Dengan ";" di sana, jika dievaluasi tetapi tidak ada yang dilakukan dengan hasilnya. Kemudian blok kode dieksekusi setiap kali, terlepas dari apa pun. Dalam C #, sangat diterima untuk memiliki blok kode acak.
Grax32
2
Saya mendapatkan diri saya dengan ini satu hari yang lalu. Saya memiliki for for dengan ;after it, yang sangat disengaja karena saya menggunakan loop kosong untuk memajukan kursor. Saya tidak sengaja menghilangkan titik koma, semuanya meledak, dan saya tidak tahu mengapa.
mpen
56

Menghias Javascript Anda dengan seni ASCII berbahaya.

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

     (2 + 2)

Ketika komentar dihapus, simbol dan operator yang tersisa akan dievaluasi
-~~--~(2 + 2) Ini menggunakan operator Bitwise Not (~) di JS, bersama dengan beberapa tanda Minus yang akan meniadakan nilai-nilai di sepanjang jalan.

Dan Prince
sumber
3
Saya bertanya-tanya bagaimana --operator dapat diterima karena seharusnya kesalahan Invalid left-hand side expression in prefix operation; namun saya menyadari bahwa ada karakter spasi putih di antara mereka.
usandfriends
53

Pesta

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

Keluaran:

2 + 2 = 5

Output dari masing cat- masing akan memiliki baris baru implisit, tetapi baris baru akhir dilucuti oleh substitusi perintah$( )


Ini yang lain:

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

Array Bash diindeks nol

Trauma Digital
sumber
3
Saya benar-benar menangkap yang pertama, karena saya punya banyak masalah dengan hal-hal seperti itu ketika bermain golf di Bash. Adapun yang kedua, di mana array tidak diindeks nol?
3
@professorfish Applescript, misalnya:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Trauma Digital
12
@DigitalTrauma Applescript aneh
5
zshmenggunakan array 1-diindeks (dan $arr[0]hanya tidak disetel atau tidak terdefinisi atau sesuatu), kecuali KSH_ARRAYSopsi diatur, di mana array kasus adalah 0-diindeks.
chepner
4
@professorfush: Lua & Fortran 1 diindeks. Kapan saja saya hitung sampai 10, saya selalu mulai dari 1, bukan 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...";
}

Itu tergantung pada modul CPAN yang disebut Acme :: NewMath . Karena nama file yang salah dalam modul, ini hanya akan bekerja pada sistem file case sensitif (seperti pada Windows atau Mac OS X), tapi saya menyalahkan penulis modul asli di sini. Acme :: NewMath mengimplementasikan matematika sesuai dengan ideologi Ingsoc.

Konrad Borowski
sumber
16
Ini cukup licik. Tidak ada yang pernah melihat impor / termasuk Anda.
44

R

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

keluaran:

5

kode sebenarnya menambahkan rata-rata [1] ke rata-rata [4]. Cara yang benar untuk menggunakan fungsi rata-rata di R akan menjadi: mean(c(1,3)) + mean(c(4,0))Ini tidak seperti beberapa fungsi matematika lainnya di R, seperti sum, max, dan min; dimana sum(1,3),, max(1,3)dan min(3,1)semuanya akan memberikan jawaban yang diharapkan.

ping
sumber
7
Tidak buruk, menipu saya sebentar.
qwr
37

Jawa

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

keluaran:

512.0000000000005

Mungkin berfungsi dalam bahasa apa pun yang menggunakan jenis ganda yang sama.

aditsu
sumber
7
Itu tanda tangan utama yang sangat aneh.
Bertie Wheen
10
Java mengimplementasikan argumen variadic sebagai array di bawah tenda.
CodaFi
4
Butuh waktu sejenak untuk menyadari bahwa Anda mungkin berbicara tentang angka terakhir dalam ganda. Saya melihat bahwa digit pertama ditambahkan dengan benar ( _2_56 + _2_56 = _5_12), tetapi tampaknya lebih mungkin maksud Anda 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(catatan: garis bawah dulu digunakan untuk "tebal" digit.
Justin
35

Dibalik

Ini ditulis dalam Befunge, tetapi dirancang agar terlihat seperti 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: [email protected]

Saat dijalankan (dengan juru bahasa yang benar) program akan mencetak 5.

Penjelasan:

Program Befunge terdiri dari kotak perintah karakter tunggal. Perintah pertama adalah yang ada di sudut kiri atas, dan pembacaan perintah berlanjut ke kanan. Tapi arahnya bisa berubah selama eksekusi program.

Hanya baris karakter pertama, dan kolom karakter yang dimulai dengan vdi baris pertama dijalankan. Karakter yang dimaksud lakukan:

#- lewati perintah berikutnya
>- Mulai sekarang, perintah dibaca di sebelah kanan perintah saat ini
v- Mulai sekarang, perintah dibaca di bawah perintah saat ini
5- Dorong 5 ke tumpukan
.- Pop dan cetak nomornya di bagian atas tumpukan
@- Akhiri program
<space>- Jangan lakukan apa pun

Jika Anda tahu Anda pemrograman di Befunge, ini tidak akan menipu siapa pun. Tetapi jika Anda menemukan ini dan tidak menyadari itu adalah Befunge, kemungkinan besar akan melakukannya.

Mat
sumber
11
+1, Ini sangat licik, karena siapa yang melihat program yang menjalankan kode sumber saat debugging?
MrLore
33

JavaScript

Kode:

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

Keluaran:

5

Anda dapat mengujinya sendiri di konsol Anda atau memeriksa Fiddle ini

William Barbosa
sumber
6
Bisakah Anda mengarahkan saya ke sumber daya atau menjelaskan kepada saya mengapa ini berhasil? Aku tahu itu berhasil karena aku memeriksa biola itu, tapi aku tidak mengerti mengapa.
Keluarga
29
variabel "a" tidak sama dua kali (maaf jika saya merusak ini). Uniknya unicode
Sam Creamer
6
Saya suka bagaimana karakter berikutnya U+0431, adalah б — hampir 6!
wchargin
73
Menggunakan homoglyphs untuk "membingungkan" pembaca sekarang secara resmi tidak lucu .
John Dvorak
40
@JanDvorak Jawaban itu diposting setelah ini; itu tidak berlaku di sini.
Gagang Pintu
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);  
}

Mencetak 2 + 2 = 5

Jadi a = 2, kan?

gcc-4.7.3 mengevaluasi parameter fungsi dari kanan ke kiri. Ketika a + b dievaluasi, a masih 3.

cpri
sumber
16
Penggunaan yang baik dari perilaku yang tidak ditentukan
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

Penyalahgunaan standar commonbalok: masalah pesanan; Saya menukar urutan di blok dalam subrutin jadi saya benar-benar menambahkan 1 + 2 + 2.

Kyle Kanos
sumber
6
@ JanDvorak: Haha, saya bisa menggunakan FORTRAN IV di mana saya bisa mendefinisikan kembali literal, misalnya2=3
Kyle Kanos
1
@KyleKanos, itulah yang saya pikir akan terjadi ketika saya melihat posting Anda ditulis dalam FORTRAN.
danmcardle
@KyleKanos Lakukan!
ClickRick
1
@KyleKanos: Apakah itu berfungsi dengan literal bilangan bulat atau hanya mengapung? Saya akan berpikir bahwa pada mesin pada zaman itu, sebuah integer literal dan sebuah alamat akan memiliki ukuran yang sama, tetapi lebih kecil dari float, sehingga pooling float literals akan menghemat ruang tetapi pooling int literals tidak akan.
supercat
2
@KyleKanos: Pemahaman saya adalah bahwa kompiler tidak akan mengizinkan penugasan langsung ke literal, tetapi pemanggilan fungsi yang digunakan lewat referensi, dan meneruskan literal titik-mengambang ke fungsi umumnya akan meneruskan alamat dari nilai dalam kumpulan floating -titik literal. Melewati nilai integer ke suatu fungsi akan menyebabkannya dikumpulkan, tetapi sebagian besar kode yang menggunakan integer akan memasukkan nilai-nilai secara langsung.
supercat
24

Python

Kode mencetak 5 jawaban yang benar untuk tugas ini.

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

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

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

Sunting: Ini adalah versi alternatif yang menambahkan bilangan bulat, bukan dua string.

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

Tilde adalah operator terbalik unary yang kembali -x-1, jadi langkah pertama adalah mendapatkan -6dan kemudian dengan operator lain dalam printfungsi get5

avall
sumber
Kenapa ~eval(`a`)bukannya adil ~a?
Andrea Corbellini
2
Saya ingin meninggalkan beberapa int()fungsionalitas dan eval()melakukan pekerjaan jika inputnya adalah bilangan bulat yang diketikkan :)
avall
24

Rubi

class Fixnum
    alias plus +

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

puts 2 + 2

Ini meningkatkan hasil dari semua penambahan yang argumen pertamanya adalah Fixnum (yang 2 adalah, setidaknya dalam MRI) sebesar 1.

Efek samping dari ini bahkan lebih buruk daripada versi Java.

Lowjacker
sumber
23

Rubi

Ruby memiliki lingkungan kelas satu. Ini berarti banyak hal. Ini juga berarti bahwa banyak hal dapat dilakukan yang ... mungkin tidak boleh.

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

Output dari ini adalah:

2 + 2 = 
4
2 + 4 = 
6
Tetapi pada tahun 1984 ...
2 + 2 = 
5
2 + 4 = 
6

Jika Anda ingin lebih memahami tentang kegembiraan dan bahaya ini, Ruby Conf 2011 Menjaga Ruby Wajar dan membaca lingkungan kelas satu dari blog Abstract Heresies.


sumber
Juga:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42
1
Untuk hanya melakukan untuk kasus tertentu: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

Skema

(define 2+2 5)
2+2 ;=> 5
Hauleth
sumber
9
Hei! 2+2bukan bagaimana Anda melakukan penambahan dalam lisp!
John Dvorak
1
Terus? Tampaknya menambah 2 hingga 2 seperti dalam tugas.
Hauleth
119
@ JanDvorak Saya tidak pernah menggunakan lisp, tapi seperti yang saya mengerti itu seperti ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
undergroundmonorail
2
"Mendefinisikan ulang 2 + 2 sebagai 5 tidak terlalu kreatif! Jangan ragu, coba yang lain." --- Nah, di R5RS saya dapat mendefinisikan ulang + sebagai gantinya 2 + 2 atau 2. Jawabannya ada di sini: pastebin.com/KHtm9Jmv
Felipe
1
@FelipeMicaroniLalli bahwa adotasi dibuat setelah jawaban saya sehingga tidak masuk hitungan.
Hauleth
20

C #

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

Untuk seseorang yang tidak terbiasa, ini akan terlihat seperti saya mendapatkan rentang mulai dan berakhir pada 2. Pada kenyataannya, ini dimulai pada 2 dan berlaku untuk dua angka. Jadi 2 + 3 = 5.

Paul
sumber
6
Kisaran mulai dan berakhir pada 2 akan adil { 2 }, bukan?
Paŭlo Ebermann
1
@ PaŭloEbermann Enumerable.Rangetidak mengambil awal dan akhir, dibutuhkan awal dan hitungan (elemen yang akan disebutkan).
MasterMastic
14
@MasterMastic Saya mengerti ini dari penjelasan dalam jawaban. Tetapi makna "kepada seseorang yang tidak familar" seharusnya adalah kisaran seperti itu (dari penjelasan dalam jawaban), dan argumen saya adalah bahwa hasil yang diharapkan adalah 2, bukan 4.
Paŭlo Ebermann
1
@ PaŭloEbermann, ya itu salah satu cara untuk melihatnya juga. Saya berpikir itu mungkin terlihat lebih seperti saya memasok angka untuk ditambahkan. Jadi Enumerable.Range (1,2,3,4) akan mulai dari 1, berakhir pada 4, dan akan berjumlah hingga 10.
Paul
19

F #

Mari kita letakkan di fsi pernyataan berikut:

let ``2+2``= 5

Keluaran:

val ( 2+2 ) : int = 5
Krzysztof Cieslak
sumber
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;
}

Tidak 5terlalu tersembunyi, aku takut. Tidak berfungsi dengan optimasi.

ugoren
sumber
1
Bagus; Saya tidak dapat memilih jika perilaku yang tidak terdefinisi tidak diizinkan.
ini
2
@ sendiri., Saya tidak melihat di mana mengandalkan UB dilarang. Banyak jawaban kode golf bergantung pada UB, dan saya pikir itu boleh saja asalkan konsisten terjadi pada beberapa platform yang masuk akal.
ugoren
2
Saya tidak melihat di mana mengandalkan UB dilarang. Saya juga tidak menemukan aturan tentang itu. Alangkah baiknya jika itu bisa diklarifikasi. Banyak jawaban kode golf bergantung pada UB, dan saya pikir itu boleh saja selama itu konsisten terjadi pada beberapa platform yang masuk akal. Beberapa aturan khusus tentang itu akan menyenangkan.
ini