Viết chương trình làm cho 2 + 2 = 5 [đóng]


393

Viết một chương trình dường như thêm các số 2 và 2 và kết quả đầu ra 5. Đây là một cuộc thi ngầm.

Chương trình của bạn không thể xuất ra bất kỳ lỗi nào. Coi chừng lỗ hổng bộ nhớ! Đầu vào là tùy chọn.

Xác định lại 2 + 2 là 5 không sáng tạo lắm! Đừng nghi ngờ điều đó, hãy thử một cái gì đó khác.


48
Đây là câu hỏi trong cuốn sách "1984" của George Orwelll.
bacchusbeale

97
Tại sao điều này là ngầm? Hai cộng hai năm.
Geobits

79
ĐÓ! ĐƯỢC! BỐN! QUYỀN!
Nick T

105
@Geobits - Tôi đồng ý: 2 + 2 = 5 bạn có thể thấy nó trong máy tính này .
MT0

47
echo "2+2=5";
user3459110

Câu trả lời:


669

Java

Sự phản chiếu thực sự là cách đúng đắn để lạm dụng Java ... nhưng bạn cần đi sâu hơn là chỉ điều chỉnh một số giá trị.

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

Đầu ra:

5

Giải trình:

Bạn cần thay đổi nó sâu hơn mức bạn có thể truy cập. Lưu ý rằng điều này được thiết kế cho Java 6 không có tham số thú vị nào được truyền vào JVM, nếu không sẽ thay đổi IntegerCache .

Sâu bên trong lớp Integer là một Fly weight of Integers. Đây là một mảng các số nguyên từ −128 đến +127. cache[132]là vị trí mà 4 thường sẽ là. Đặt nó thành 5.

Cảnh báo: Làm điều này trong mã thực sẽ khiến mọi người rất không hài lòng.

Mã demo trên ideone .


5
Nghĩ về điều này ngay khi tôi thấy câu hỏi :)
Octavia Togami

306
Cái đó. Là. Quỷ dữ. Hoàn toàn xấu xa. +1
John Dvorak

75
@JanDvorak trong trò chuyện, nó được đề xuất Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Chỉ cần tưởng tượng có bao nhiêu thứ sẽ phá vỡ ...

30
Câu trả lời như thế này khiến tôi yêu trang web này hơn SO.
Songo

35
zomg, câu trả lời java không bao giờ có được phiếu bầu hàng đầu! +1 để đưa java lên hàng đầu :)
Cruncher

297

Haskell

Tôi chỉ thích làm thế nào bạn có thể ném bất cứ thứ gì vào ghci và nó hoàn toàn cuộn với nó.

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

36
Không gì let 2+2=5 in 5+5làm gì? _ಠ
John Dvorak

22
@JanDvorak Non-exhaustive patterns in function +- Tôi đang xác định một hàm mới (+) ở đây và Nếu tôi cắm bất cứ thứ gì không 2+2có lỗi thì tôi sẽ không bao giờ xác định điều gì sẽ xảy ra trong trường hợp đó.
Flonk

27
@SHiNKiROU bóng, không xác định lại
John Dvorak

96
điều đó gần giống như: "Và Chúa nói hãy để 2 + 2 = 5 trong 2 + 2"))
OutFall

11
@ user3217013 Tìm hiểu Haskell, nó tốt cho trái tim của bạn.
Giày

294

C

Thủ thuật khá rẻ nhưng tôi chắc chắn tôi sẽ bẫy hầu hết các bạn.

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

Hãy thử nó ở đây

Di chuyển mã sang phải.
Tôi không chắc chắn trên Windows / Linux nhưng trên OSX, thanh cuộn không hiển thị.
Dù sao, đây là một lý do tốt để kích hoạt "trực quan hóa không gian" trên trình soạn thảo mã yêu thích của bạn.


96
Thanh cuộn có thể nhìn thấy trong Chromium, nhưng ai là người chú ý đến nó lúc đầu? :)
Ruslan

172
Để gây nhầm lẫn cho mọi người, bạn có thể thêm một dòng nhận xét đủ dài để "giải thích" sự tồn tại của thanh cuộn, nhưng đủ buồn tẻ để không ai quan tâm (cuộn để) đọc nó.
Hagen von Eitzen

22
Trong OS X, khả năng hiển thị của thanh cuộn theo mặc định tùy thuộc vào việc chuột có được kết nối hay không. Nếu chỉ có một bàn di chuột, thanh cuộn sẽ bị che khuất và mờ dần khi không sử dụng. Nếu có một con chuột được kết nối, thanh cuộn sẽ đánh cắp không gian từ hộp ngữ cảnh và luôn hiển thị. Bạn có thể kiểm tra điều này bằng cách rút và cắm chuột USB vào MacBook. Điều này có thể được cấu hình trong System Preferences, tất nhiên.
Andrea

49
Thông minh, nhưng trên thiết bị di động, nó chỉ là wordwraps :)
Logan

31
Đây là lần duy nhất mà việc cuộn các cửa sổ mã SE không khiến tôi muốn bẻ ngón tay của ai đó.
ObscureRobot

184

GolfScript

4:echo(2+2);

In 5.

Tất nhiên GolfScript có một cú pháp khác biệt rõ rệt với các ngôn ngữ khác, chương trình này tình cờ trông giống như một cái gì đó Cơ bản hoặc C-ish.

4  - Đặt số 4 trên ngăn xếp. Nội dung ngăn xếp: 4
:echo- Lưu giá trị ở đầu ngăn xếp vào tiếng vang biến. Nội dung ngăn xếp: 4
(  - Giảm giá trị ở đầu ngăn xếp bằng 1. Nội dung ngăn xếp: 3
2  - Đặt số 2 lên trên cùng của ngăn xếp. Nội dung ngăn xếp: 3 2
+  - Thêm hai số trên đầu ngăn xếp. Nội dung ngăn xếp: 5
2  - Đặt số 2 lên trên cùng của ngăn xếp. Nội dung ngăn xếp: 5 2
)  - Tăng giá trị ở đầu ngăn xếp bằng 1. Nội dung ngăn xếp: 5 3
;  - Loại bỏ phần tử trên cùng khỏi ngăn xếp. Nội dung ngăn xếp: 5

GolfScript sẽ mặc định in bất cứ thứ gì còn lại trên ngăn xếp sau khi thực hiện xong.


3
Bạn có thể giải thích rằng với những người không nói được GolfScript không?
MadTux

1
@MadTux Bạn đi đây.
aaaaaaaaaaaa

1
Cảm ơn. (Tôi sẽ nâng cấp sau vì tôi đã đạt đến giới hạn hàng ngày của mình, đây là bia.)
MadTux

5
Đơn giản và gian lận, tôi yêu nó. +1
xem

9
tôi thích nó vì nó dường như không lừa bạn bằng toán học hay ngữ nghĩa, nó có vẻ rất đơn giản và 5 ^^
dwana 26/12/14

145

Java

Luôn luôn phải làm tròn đôi của bạn, folks

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

Đầu ra:

Variable two = 2.000000000000000
two + two = 5.000000000000000

Giải trình:

Không, nghiêm túc, bạn luôn phải làm tròn số đôi của mình. 15 không đủ chữ số để chỉ ra rằng two()phương thức thực sự tạo ra 2.0000000000000004(16 là đủ).

Trong các biểu diễn Hex thô của các số, chỉ chênh lệch 1 bit (giữa 40000000000000014000000000000000) ... là đủ để làm cho Math.ceilphương thức trả về 5, không phải 4.


61
Math.ceil(two + two); // round just in caseTôi thấy những gì bạn đã làm ở đó
Tim S.

17
Tạo cả hàm và biến có cùng tên ... Wow.
cấu hình

107
@configurator không có gì, thậm chí không có một lớp có tên two. Lớp sản xuất java là Two two = Two.two.two();với Two.two thuộc loại TwoFactory.
Jannis Froese

36
Two.Infinity.And.Beyond ()
CincauHangus

7
@TimS Tôi trần những gì bạn đã làm ở đó
thenaglecode

135

BBC CƠ BẢN

EDIT: Dành cho Andrea Faulds và Squeamish Ossifrage, một phiên bản thuyết phục hơn bằng cách sử dụng một trình thông dịch khác: 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

nhập mô tả hình ảnh ở đây

Điều này thực sự in số 4, nhưng VDU 23xác định lại phông chữ cho ASCII 52 để nó trông giống như số 5 thay vì 4. Chế độ màn hình 6 được chọn vì lý do thẩm mỹ (ký tự có kích thước hợp lý.)

Hình ảnh gốc sử dụng trình giả lập tại http://bbcbasic.co.uk/bbcwin/bbcwin.html . (với mã hơi khác nhau) có thể được nhìn thấy trong lịch sử chỉnh sửa.


8
Những phông chữ trông khác nhau mặc dù. Bạn có nghĩ rằng bạn có thể làm cho nó sử dụng đúng phông chữ?
Andrea

@AndreaFaulds Tôi đang sử dụng trình giả lập từ bbcbasic.co.uk/bbcwin/bbcwin.html . Nó hỗ trợ xác định lại phông chữ của BBC Basic gốc trên lưới 8x8. Nhưng phông chữ mặc định của trình giả lập rõ ràng là độ phân giải cao hơn so với 8x8. Vì vậy, tôi có thể có thể làm một công việc tốt hơn, nhưng nó sẽ không hoàn hảo. Tôi cho rằng tôi có thể xác định lại phông chữ cho cả 5 cũng như 4, sau đó chúng sẽ trông giống nhau.
Cấp sông St

5
@AndreaFaulds Câu hỏi không nói rằng kết quả không thể phân biệt được với các 5s khác. Tôi nghĩ rằng đây thực sự là một tính năng. 2+3=52+2=5'
Ben Jackson

1
Điều này phù hợp với phông chữ gốc trong BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
squossish ossifrage

@squeamishossifrage cảm ơn thông tin. Nó sẽ không phù hợp với phông chữ trong trình giả lập. Ví dụ của bạn cao 7 pixel, giống như của tôi. Ngoài ra, nó có số 0 ở dưới cùng, giống như của tôi, trong khi có vẻ như tôi cần di chuyển nó xuống một chút (nghĩa là có số 0 ở trên cùng thay vì dưới cùng.) Một điểm khác biệt chính là tôi có 126,64 trong khi bạn có 126,96 và bạn có một số 6 thay vì 2 của tôi. Đó là vì phông chữ BBC gốc có các đường thẳng đứng dày, do đó có thể dễ dàng đọc được định dạng 80 cột trên màn hình TV tiêu chuẩn.
Cấp sông St

134

Brainfuck

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

Đầu ra:

5

Hãy thử nó ở đây .

Tôi biết điều này nghe có vẻ hơi đơn giản, nhưng tôi đã cố gắng sáng tạo, như đề xuất trong bài viết gốc.


1
Tôi không biết brainfuck, tôi mất vài phút để tìm ra điều này. ASCII 53, phải không?
Cấp sông St

4
Miễn là bạn có +++++.bạn có thể vẽ bất cứ điều gì.
Eduard Florinescu

1
@steveverrill: vâng bạn đúng. (và đây là cách duy nhất để xuất các ký tự ascii trong BF).
tigrou


105

Bash

Vì đây là một , tôi đoán tôi nên sử dụng một phương pháp dài hơi ...

Đối với những người không biết Bash: $((...expr...))là một cú pháp để đánh giá các biểu thức số học. $(bc<<<...expr...)thực hiện tương tự bằng cách sử dụng bcmáy tính dòng lệnh.

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

Đầu ra

2+2= 5

Giải trình

Dòng thứ hai nối v và 2 thay vì thêm chúng, để thực hiện 22.
Giải thích thực tế:
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
Thủ thuật toán học hay đang diễn ra ở đó!
tomsmeding

5
@tomsmeding Điều đó khá thú vị, mặc dù khoảng nửa chừng tôi nhận ra rằng tôi đã đặt 15thay 16vào dòng 4. May mắn thay, nó vẫn hoạt động vì bclàm tròn số

2
Xem nếu bạn thích giao diện của phong cách này cũng là Bash hợp lệ (loại bỏ các ký hiệu đô la, cho phép các khoảng trắng xung quanh dấu bằng và cho phép các toán tử gán kết hợp): ((v = v * 5))hoặc((v *= 5))
Dennis Williamson

2
Đẹp một, nhưng tôi phát hiện ra +=điều ngay lập tức.
nyuszika7h

2
@ardnew vâng có. hai dòng đầu tiên ( v=2v+=2): đối với người không quen với việc xử lý biến Bash, điều đó sẽ tương đương với 2+2, nhưng thực tế "2"+"2", đó là, thực tế "22". Các ý kiến ​​khác trong mã chỉ sai vì điều này. Tôi biết, không phải ai cũng thấy điều này buồn cười

101

Con trăn

Lấy cảm hứng từ câu trả lời Java:

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

Giống như Java, CPython sử dụng cùng một vị trí bộ nhớ cho bất kỳ bản sao nào của một vài số nguyên nhỏ đầu tiên (0-255 nếu bộ nhớ phục vụ). Điều này đi vào và trực tiếp chỉnh sửa vị trí bộ nhớ thông qua ctypes. patchchỉ là một obfuscated "12-7", một chuỗi có len4, evalđến 5.

Một phiên bản khó hiểu hơn

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

Ngoài 2 + 2

Như OP đã đề cập, 2 + 2 có thể hơi nhàm chán; Vì vậy, đây là một số mã đa chiều, sạch hơn, đa chiều cho lạm dụng bừa bãi.

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

Chạy với Python 2.7 ... bỏ qua dòng đó ở cuối. Hoạt động trong Windows 64-bit và Ubuntu 32-bit, hai hệ thống tôi có thể truy cập dễ dàng.

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

Không có gì đáng ngạc nhiên, chúng ta có thể phá vỡ thuộc tính kết hợp của phép cộng, trong đó ( a + b ) + c = a + ( b + c ), như đã thấy trong dòng 1 và 2 1+2+3, nhưng không hiểu sao chúng ta cũng phá vỡ tính chất giao hoán (trong đó a + b = b + a ; dòng thứ 2 và thứ 3). Tôi tự hỏi nếu trình thông dịch Python chỉ bỏ qua các dấu ngoặc đơn thừa xung quanh các biểu thức bổ sung.


96
Vâng, tất cả chúng ta chắc chắn chỉ bỏ qua segfaults ...

10
Điều đáng nói là đây không thực sự là một thủ thuật Python và chỉ dành riêng cho việc triển khai C của Python.
xApple

1
@NickT À! Được chứ. Tôi có ấn tượng rằng bạn đã thử bản gốc dưới cùng các cửa sổ 64 bit, thiết lập 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')Là một phiên bản đầu tiên sửa đổi. Tôi đã thực hiện điều này để tôi có thể thả nó vào $ PYTHONSTARTUP trong / etc / profile với tư cách là đội đỏ trong các cuộc thi hack.
DavidJFelix

2
Vâng. Sidenote, có vẻ như 1, 0 và -1 là một số con số mà python lập tức tách ra. Tôi đã nghĩ rằng đó sẽ là điều tồi tệ nhất để làm hỏng hành vi của chương trình python. Có thể sử dụng fuckitpy để chứa các lỗi này.
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())

Kiểm tra nó tại http://jsfiddle.net/qhRJY/

Cả H (chữ cái viết hoa Latin h) và (chữ cái viết hoa tiếng Hy Lạp eta) được đặt thành phạm vi toàn cầu vì chúng không được định nghĩa là cục bộ cho các hàm với từ khóa var. Mặc dù trông giống nhau, nhưng thực tế chúng là 2 biến khác nhau với 2 giá trị khác nhau. Sử dụng Ctrl + F trong trình duyệt của bạn, bạn sẽ thấy rằng (eta) hiển thị ít hơn đáng kể so với H (h) trên trang này.


4
@Sam mặc dù hai chữ 'H trông giống nhau, nhưng thực tế chúng là 2 nhân vật hoàn toàn khác nhau. Trong Unicode có thể có các ký tự khác nhau trông giống nhau nhưng có các điểm mã khác nhau. Trong trường hợp cụ thể này; chữ "H" khác thực ra là chữ Hy Lạp Eta .
d3dave

79
Sử dụng homoglyphs để "gây nhầm lẫn" cho người đọc bây giờ chính thức không buồn cười .
John Dvorak

29
Các từ đồng nhất trở nên buồn cười khi kết hợp với các biến toàn cục lố bịch của javascript.
Konstantin Weitz

3
Đó không phải là "ký tự Unicode", đó là tiếng Latin H và tiếng Hy Lạp Eta ().
phyzome

4
@Vortico hmm ... bạn muốn gì khi một câu hỏi thường gặp không đủ? Một câu hỏi thường gặp được liên kết từ trung tâm trợ giúp? Lưu ý rằng chỉ người điều hành mới có thể áp dụng thẻ faq . Đối với câu trả lời - câu hỏi nêu rõ "điểm +5 trở lên và ít nhất gấp đôi số lần upvote so với downvote". Câu trả lời có 27 upvote và không downvote. Điều đó nghe có vẻ như tôi đã hoàn thành các tiêu chí được nêu trong câu trả lời, và số lượng upvote khá ấn tượng cho câu trả lời lâu đời thứ hai cho một câu hỏi trên trang web meta của một trang web chỉ có 124 người đã bỏ phiếu hơn 10 lần. Có bao nhiêu sẽ bạn như thế nào? Tất cả mọi người?
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) );

Điểm yếu là nó không thực sự bị lép vế - nếu bạn thêm nguồn âm thanh 2dB vào nguồn âm thanh 2dB khác thì kết quả là tiếng ồn kết hợp sẽ là 5dB (và nếu bạn thêm hai nguồn 30dB thì 33dB) khi chúng được đo trên thang đo log.

Bạn có thể thấy nó trên một máy tính khác ở đây .


Chà, nó thực sự giống như 5,01 decibel, nhưng đủ xa từ 4 đến đếm.
Joe Z.

68

PHP

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

Sản xuất:

2 + 2 = 5

Điều này là do trong PHP, các ternary được tính từ trái sang phải, vì vậy nó thực sự
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';



1
Tôi đã có một PHPví dụ khác :$a=2;echo "2+2=".$a++ + $a++;
năm14

Rõ ràng là $ a ++ tạo ra 3 và kết quả sẽ là 6. Tôi không hiểu bạn nghĩ gì.
Ozh

1
@Janus PHPsadness # 30 giải thích điều đó tốt
wchargein


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
=thay vì ==, dễ nhìn và thẳng thắn thay vì không mệt mỏi.
Tiếp

19
Dù sao cũng có một upvote, tôi mắc lỗi đó rất nhiều

6
Tôi vẫn thích câu trả lời này
Sam Creamer

5
Tôi thích nó quá. Không phải mọi ngôn ngữ =chỉ sử dụng như một giả định mà là một toán tử so sánh (ví dụ: Pascal, SQL, VB)
02

Tôi thấy nó rất rõ ràng
Oliver Ni

57

C #

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

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

        Console.WriteLine(x + y);
    }

7
ah, thủ thuật cũ tốt với các nhân vật lừa đảo. Đó là lý do tại sao bạn nên sử dụng 1TBS ở mọi nơi.
John Dvorak

11
@JanDvorak Điều này có hoạt động vì dấu chấm phẩy sau câu lệnh if không? Tôi không biết C # nhưng tôi đã sử dụng C ++

5
@professorfish đó là những gì tôi giả sử. Ngoài ra, các ngôn ngữ không cho phép bạn chèn niềng răng ngẫu nhiên FTW.
John Dvorak

12
Không có ";", câu lệnh if sẽ kiểm soát xem khối mã có được thực thi hay không. Với dấu ";" trong đó, nếu được đánh giá nhưng không có gì được thực hiện với kết quả. Sau đó, khối mã được thực hiện mọi lúc, bất kể. Trong C #, việc có các khối mã ngẫu nhiên là hoàn toàn chấp nhận được.
Grax32

2
Tôi đã nhận được với cái này một ngày khác. Tôi đã có một vòng lặp for ;sau nó, điều này hoàn toàn có chủ ý khi tôi đang sử dụng vòng lặp trống để tiến con trỏ. Tôi vô tình loại bỏ dấu chấm phẩy, mọi thứ nổ tung và tôi không thể hiểu tại sao.
mở cửa

56

Thật nguy hiểm khi trang trí Javascript của bạn bằng nghệ thuật ASCII.

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

     (2 + 2)

Khi các bình luận bị xóa, các ký hiệu và toán tử còn lại sẽ đánh giá
-~~--~(2 + 2) Điều này sử dụng toán tử Bitwise Not (~) trong JS, cùng với một số dấu hiệu Minus sẽ phủ nhận các giá trị trên đường đi.


3
Tôi đã tự hỏi làm thế nào các --nhà điều hành được chấp nhận vì nó nên lỗi với Invalid left-hand side expression in prefix operation; tuy nhiên tôi nhận ra rằng có một nhân vật khoảng trắng giữa chúng.
bè và bạn bè

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

Đầu ra:

2 + 2 = 5

Đầu ra từ mỗi catsẽ có một dòng mới ẩn, nhưng dòng mới cuối cùng bị loại bỏ bởi sự thay thế lệnh$( )


Đây là một:

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

Mảng Bash không được lập chỉ mục


3
Tôi thực sự đã bắt được người đầu tiên, vì tôi đã gặp nhiều vấn đề với những thứ như thế khi chơi golf ở Bash. Đối với cái thứ hai, trong đó không có mảng nào được lập chỉ mục?

3
@professorfish Applescript, ví dụ:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Chấn thương kỹ thuật số

12
@DigitalTrauma Applescript thật kỳ lạ

5
zshsử dụng các mảng 1 chỉ mục (và $arr[0]đơn giản là không được đặt hoặc không xác định hoặc một cái gì đó), trừ khi KSH_ARRAYStùy chọn được đặt, trong trường hợp đó là các mảng được lập chỉ mục 0.
chepner

4
@professorfush: Lua & Fortran là 1 chỉ mục. Bất cứ khi nào tôi đếm đến 10, tôi luôn bắt đầu lúc 1, không phải 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...";
}

Nó phụ thuộc vào mô-đun CPAN được gọi là Acme :: NewMath . Do tên tệp trong mô-đun sai, điều này sẽ chỉ hoạt động trên các hệ thống tệp không nhạy cảm trường hợp (như trên Windows hoặc Mac OS X), nhưng tôi đổ lỗi cho tác giả của mô-đun gốc ở đây. Acme :: NewMath thực hiện toán học theo hệ tư tưởng Ingsoc.


16
Điều này là khá ranh mãnh. Không ai từng nhìn vào hàng nhập khẩu của bạn / bao gồm.

44

R

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

đầu ra:

5

mã thực sự thêm giá trị trung bình của [1] vào giá trị trung bình của [4]. Các cách chính xác để sử dụng chức năng bình trong R sẽ là: mean(c(1,3)) + mean(c(4,0))Đây là không giống như một số chức năng toán học khác trong nghiên cứu, chẳng hạn như sum, maxmin; ở đâu sum(1,3), max(1,3)min(3,1)tất cả sẽ đưa ra câu trả lời mong đợi.


7
Không tệ, lừa tôi một chút.
qwr

37

Java

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

đầu ra:

512.0000000000005

Có lẽ hoạt động trong bất kỳ ngôn ngữ sử dụng cùng một loại đôi.


7
Đó là một chữ ký chính rất lạ.
Bertie Wheen

10
Java thực hiện các đối số biến đổi như các mảng dưới mui xe.
CodaFi

4
Mất một lúc tôi mới nhận ra rằng có lẽ bạn đang nói về những chữ số cuối cùng trong đôi. Tôi thấy rằng các chữ số đầu tiên được thêm chính xác ( _2_56 + _2_56 = _5_12), nhưng có vẻ như bạn muốn nói 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(lưu ý: dấu gạch dưới được sử dụng để "in đậm" các chữ số.
Justin

35

Befunge

Điều này được viết bằng Befunge, nhưng được thiết kế để trông giống như 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

Khi chạy (với trình thông dịch chính xác), chương trình sẽ in 5.

Giải trình:

Một chương trình Befunge được tạo thành từ một lưới các lệnh ký tự đơn. Lệnh đầu tiên là lệnh ở góc trên cùng bên trái và việc đọc lệnh tiến hành sang phải. Nhưng hướng có thể thay đổi trong khi thực hiện chương trình.

Chỉ có hàng ký tự đầu tiên và cột ký tự bắt đầu bằng vhàng đầu tiên được chạy. Các ký tự trong câu hỏi làm:

#- bỏ qua lệnh tiếp theo
>- Từ bây giờ, các lệnh được đọc ở bên phải của lệnh hiện tại
v- Từ bây giờ, các lệnh được đọc bên dưới lệnh hiện tại
5- Đẩy 5 vào ngăn xếp
.- Pop và in số ở đầu ngăn xếp
@- Kết thúc chương trình
<space>- Không làm gì cả

Nếu bạn biết bạn đang lập trình trong Befunge, điều này sẽ không thực sự lừa ai cả. Nhưng nếu bạn bắt gặp điều này và không nhận ra đó là Befunge, rất có thể nó sẽ xảy ra.


11
+1, Điều này rất sai lệch, bởi vì ai sẽ nhìn vào chương trình chạy mã nguồn khi gỡ lỗi?
MrLore

33

JavaScript

Mã số:

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

Đầu ra:

5

Bạn có thể tự kiểm tra nó trên bàn điều khiển hoặc kiểm tra Fiddle này


6
Bạn có thể chỉ cho tôi một tài nguyên hoặc giải thích cho tôi tại sao điều này hoạt động. Tôi biết nó hoạt động được vì tôi đã kiểm tra Fiddle của nó, nhưng tôi không hiểu tại sao.
Gia đình

29
biến "a" không giống nhau cả hai lần (xin lỗi nếu tôi làm hỏng cái này). Snicty unicode thực sự
Sam Creamer

6
Tôi thích cách nhân vật tiếp theo U+0431, là б, gần 6!
wchargein

73
Sử dụng homoglyphs để "gây nhầm lẫn" cho người đọc bây giờ chính thức không buồn cười .
John Dvorak

40
@JanDvorak Câu trả lời đó đã được đăng sau cái này; nó không áp dụng ở đây.
Doorknob

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

Nó in 2 + 2 = 5

Vậy a = 2, phải không?

gcc-4.7.3 đánh giá các tham số chức năng từ phải sang trái. Khi a + b được ước tính, a vẫn là 3.


16
Sử dụng tốt các hành vi không xác định
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

Lạm dụng tiêu chuẩn của commoncác khối: vấn đề trật tự; Tôi đã hoán đổi thứ tự trong khối trong chương trình con để tôi thực sự thêm vào 1 + 2 + 2.


6
@JanDvorak: Haha, tôi có thể đã sử dụng FORTRAN IV, trong đó tôi có thể xác định lại chữ, ví dụ:2=3
Kyle Kanos

1
@KyleKanos, đó là những gì tôi nghĩ rằng điều này sẽ xảy ra khi tôi thấy bài viết của bạn được viết bằng FORTRAN.
danmcardle

@KyleKanos Làm đi!
ClickRick

1
@KyleKanos: Điều đó có hoạt động với chữ nguyên hay chỉ nổi? Tôi nghĩ rằng trên một cỗ máy của thời đại đó, một số nguyên và một địa chỉ sẽ có cùng kích thước, nhưng nhỏ hơn một số float, do đó, các chữ nổi trôi nổi sẽ tiết kiệm không gian nhưng gộp các chữ int thì không.
supercat

2
@KyleKanos: Sự hiểu biết của tôi là các trình biên dịch sẽ không cho phép gán trực tiếp cho một nghĩa đen, nhưng các lệnh gọi hàm được sử dụng qua tham chiếu và chuyển một ký tự dấu phẩy động cho một hàm thường sẽ chuyển địa chỉ của một giá trị trong một nhóm nổi điểm chữ. Truyền một giá trị số nguyên cho một hàm sẽ khiến nó được gộp lại, nhưng hầu hết các mã sử dụng số nguyên sẽ bao gồm các giá trị trực tiếp.
supercat

24

Con trăn

Mã in 5 là câu trả lời đúng cho nhiệm vụ này.

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

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

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

Chỉnh sửa: Đây là phiên bản thay thế có thêm số nguyên, không phải chuỗi twos.

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

Tilde là một toán tử nghịch đảo unary trả về -x-1, vì vậy bước đầu tiên là lấy-6 và sau đó với một toán tử khác trong printhàm get5


Tại sao ~eval(`a`)thay vì chỉ ~a?
Andrea Corbellini

2
Tôi muốn để lại một số int()chức năng và eval()thực hiện công việc nếu đầu vào là một số nguyên được
xâu chuỗi

24

Hồng ngọc

class Fixnum
    alias plus +

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

puts 2 + 2

Điều này làm tăng kết quả của tất cả các bổ sung có đối số đầu tiên là Fixnum (trong đó 2, ít nhất là trong MRI) thêm 1.

Các tác dụng phụ của điều này thậm chí còn tồi tệ hơn phiên bản Java.


23

Hồng ngọc

Ruby có môi trường hạng nhất. Điều này có nghĩa là rất nhiều thứ. Điều đó cũng có nghĩa là rất nhiều thứ có thể được thực hiện mà ... có lẽ không nên.

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

Đầu ra của điều này là:

2 + 2 = 
4
2 + 4 = 
6
Nhưng vào năm 1984 ...
2 + 2 = 
5
2 + 4 = 
6

Nếu bạn muốn hiểu thêm về niềm vui và sự nguy hiểm của việc này, Ruby Conf 2011 Giữ Ruby hợp lý và đọc môi trường hạng nhất từ blog Tóm tắt Heresies.


Ngoài ra:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
phim42

1
Chỉ làm cho trường hợp cụ thể: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

Kế hoạch

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

9
Chào! 2+2không phải là cách bạn làm bổ sung trong lisp!
John Dvorak

1
Vậy thì sao? Nó dường như thêm 2 đến 2 như trong nhiệm vụ.
Hauleth

119
@JanDvorak Tôi chưa bao giờ sử dụng lisp, nhưng theo tôi hiểu thì nó giống như thế ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
undergroundmonorail

2
"Xác định lại 2 + 2 là 5 không sáng tạo lắm! Đừng nghi ngờ về điều đó, hãy thử một cái gì đó khác." --- Chà, trong R5RS tôi có thể xác định lại + thay vì 2 + 2 hoặc 2. Câu trả lời là đây: pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli rằng chú thích đã được đưa ra sau câu trả lời của tôi để nó không được tính.
Hauleth

20

C #

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

Đối với một người không quen thuộc, điều này sẽ giống như tôi đang bắt đầu một phạm vi bắt đầu và kết thúc ở mức 2. Trong thực tế, nó bắt đầu từ 2 và đi cho hai số. Vậy 2 + 3 = 5.


6
Một phạm vi bắt đầu và kết thúc ở 2 sẽ chỉ là { 2 }, phải không?
Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Rangekhông bắt đầu và kết thúc, nó bắt đầu và đếm (các yếu tố sẽ được liệt kê).
MasterMastic

14
@MasterMastic Tôi hiểu điều này từ lời giải thích trong câu trả lời. Nhưng ý nghĩa "với ai đó không quen thuộc" được cho là một phạm vi như vậy (từ lời giải thích trong câu trả lời), và lập luận của tôi là kết quả mong đợi sau đó sẽ là 2, chứ không phải 4.
Paŭlo Ebermann

1
@ PaŭloEbermann, vâng, đó cũng là một cách để xem xét nó. Tôi đã nghĩ rằng nó có thể trông giống như tôi đang cung cấp các con số để thêm vào. Vì vậy, Enumerable.Range (1,2,3,4) sẽ bắt đầu từ 1, kết thúc ở 4 và sẽ tổng hợp lên 10.
Paul


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

Điều 5này không được giấu quá kỹ, tôi sợ. Không hoạt động với tối ưu hóa.


1
Đẹp; Tôi không thể nâng cấp nếu hành vi không xác định không được phép.
này

2
@ mình., Tôi không thấy nơi nào dựa vào UB bị cấm. Nhiều câu trả lời golf mã dựa vào UB, và tôi nghĩ rằng nó ổn miễn là nó luôn xảy ra trên một số nền tảng hợp lý.
ugoren

2
Tôi không thấy nơi nào dựa vào UB bị cấm. Tôi cũng không tìm thấy bất kỳ quy tắc nào về điều đó. Sẽ thật tốt nếu điều đó có thể được làm rõ. Nhiều câu trả lời golf mã dựa vào UB, và tôi nghĩ rằng nó ổn miễn là nó luôn xảy ra trên một số nền tảng hợp lý Một số quy tắc cụ thể về điều đó sẽ tốt.
này
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.