编写一个使2 + 2 = 5的程序


393

编写一个看似将数字2和2相加并输出5的程序。

您的程序无法输出任何错误。当心内存孔!输入是可选的。

将2 + 2重新定义为5 不是很有创意!不要三思而后行,尝试其他方法。


48
这是乔治·奥威尔(George Orwelll)在“ 1984”一书中的问题。
bacchusbeale 2014年

97
为什么这不明智?二加二等于五。
Geobits 2014年

79
那里!是!四!灯!
尼克T

105
@Geobits-我同意:2 + 2 = 5您可以在此计算器中看到它。
MT0

47
echo "2+2=5";
user3459110 2014年

Answers:


669

爪哇

反思确实是滥用Java的正确方法……但是您需要更深入,而不仅仅是调整一些价值。

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

输出:

5

说明:

您需要对其进行比通常可以访问的更深的更改。请注意,这是为Java 6设计的,没有在JVM上传递的时髦参数,否则这些参数会更改IntegerCache

在Integer类的最深处是Flyweight of Integers。这是从-128到+127的整数数组。 cache[132]通常是4。设置为5。

警告:用真实代码执行此操作会使人非常不高兴。

ideone上的代码演示


5
我一看到问题就想到了这个:)
Octavia Togami,2014年

306
那。是的。邪恶。绝对邪恶。+1
约翰·德沃夏克

75
@JanDvorak在聊天中被建议 Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); 只是想像会破坏多少东西……

30
这样的回答使我比这个网站更爱这个网站。
松戈2014年

35
zomg,java答案永远不会获得最高投票!+1使Java达到顶峰:)
Cruncher

297

哈斯克尔

我只是喜欢您如何在ghci上扔任何东西,它随它而生。

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

36
怎么let 2+2=5 in 5+5办?ಠ_ಠ–
约翰·德沃夏克

22
@JanDvorak- Non-exhaustive patterns in function +我在这里定义一个新函数(+),如果我插入不2+2正确的函数,它将出错,因为我从未定义过那种情况。
弗隆克2014年

27
@SHiNKiROU阴影,没有重新定义
约翰·德沃夏克

96
几乎听起来像是:“上帝说让2 + 2 = 5 in 2 + 2”))
2014年

11
@ user3217013了解Haskell,这对您的心脏有好处。
Shoe 2014年

294

C

很便宜的把戏,但我敢肯定我会困住你们中的大多数。

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

在这里尝试

将代码向右滚动。
我不确定在Windows / Linux上,但是在OSX上,滚动条不可见。
无论如何,这是在您喜欢的代码编辑器上启用“空间可视化”的一个很好的理由。


96
滚动条在Chromium中可见,但是谁首先关注它?:)
Ruslan

172
为了使人们感到困惑,您可以添加一条注释行,该注释行的长度足以“解释”滚动条的存在,但又很枯燥,以至于没人愿意(滚动)来阅读它。
哈根·冯·埃岑

22
在OS X中,默认情况下滚动条的可见性取决于是否连接了鼠标。如果只有触摸板,则滚动条会在不使用时覆盖并淡出。如果连接了鼠标,则滚动条会从上下文框中窃取空间,并且始终可见。您可以通过将USB鼠标拔出并插入MacBook进行测试。当然,可以在“系统偏好设置”中进行配置。
Andrea 2014年

49
聪明,但在移动设备上只是自动换行:)
Logan

31
这是唯一一次滚动SE代码窗口不让我想打断别人的手指的情况。
ObscureRobot 2014年

184

高尔夫脚本

4:echo(2+2);

印刷品5

当然,GolfScript具有与其他语言明显不同的语法,该程序看起来就像是Basic或C-ish。

4  -将数字4放在堆栈上。堆栈内容:4-
:echo将堆栈顶部的值保存到变量echo中。堆栈内容:4-
(  将堆栈顶部的值减1。堆栈内容:3-
2  将数字2放在堆栈顶部。堆栈内容:3 2-
+  在堆栈顶部添加两个数字。堆栈内容:5-
2  将数字2放在堆栈顶部。堆栈内容:5 2-
)  将堆栈顶部的值增加1。堆栈内容:5 3-
;  从堆栈中删除顶部元素。堆栈内容:5

默认情况下,GolfScript将在执行完成后打印堆栈上剩余的所有内容。


3
您能为不讲GolfScript的人解释一下吗?
MadTux 2014年

1
@MadTux来吧。
2014年

1
谢谢。(我会稍后
投票

5
简单而狡猾,我喜欢它。+1
seequ 2014年

9
我喜欢它,因为它似乎并没有在用数学或语义欺骗您,它看起来是如此简单,但是5 ^^
dwana 2014年

145

爪哇

伙计们,总是要打双打

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

输出:

Variable two = 2.000000000000000
two + two = 5.000000000000000

说明:

不,说真的,您总是必须双打。15位数字不足以显示该two()方法实际产生的值2.0000000000000004(不过16位就足够了)。

在数字的原始十六进制表示形式中,4000000000000001和之间仅相差1位4000000000000000...足以使Math.ceil方法返回5,而不是4。


61
Math.ceil(two + two); // round just in case我看到你在那儿做什么
蒂姆·S。

17
使函数和变量都具有相同的名称...哇。
配置器

107
@configurator没什么,甚至没有名为的类two。生产级java的Two two = Two.two.two();Two.two 是TwoFactory类型。
Jannis Froese 2014年

36
Two.Infinity.And.Beyond()
CincauHangus 2014年

7
@TimS我在这里
告诉

135

英国广播公司

编辑:对于Andrea Faulds和Squeamish Ossifrage,使用其他解释器的更令人信服的版本: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

在此处输入图片说明

实际上,这会打印数字4,但是会VDU 23重新定义ASCII 52的字体,以使其看起来像5而不是4。出于美观的原因,选择了屏幕模式6(字符大小合理)。

使用模拟器的原始图像位于http://bbcbasic.co.uk/bbcwin/bbcwin.html。(代码略有不同)可以在编辑历史记录中看到。


8
这些字体看起来不同。您认为可以使用正确的字体吗?
Andrea 2014年

@AndreaFaulds我正在使用bbcbasic.co.uk/bbcwin/bbcwin.html中的模拟器。它支持在8x8网格上重新定义原始BBC Basic的字体。但是,仿真器的默认字体显然比8x8高。因此,我可能可以做得更好,但这并不是完美的。我想我可以重新定义所有5和4的字体,然后它们看起来是一样的。
级圣河

5
@AndreaFaulds问题并没有说明结果应该与其他5s没有区别。我认为这实际上是一个功能。 2+3=52+2=5'
本杰克逊

1
这与BBC Micro中的原始字体匹配:VDU 23,52,126,96,124,6,6,102,60,0
sosmif ossifrage

@squeamishossifrage感谢您的信息。但是,它与模拟器中的字体不匹配。您的示例是7像素高,就像我的一样。像我的一样,它的底部也有一个零,而我需要向下移动一点(即,顶部而不是底部有一个零。)一个关键的区别是我有126,64而您有126,96,而您有一些6,而不是我的2。那是因为原始的BBC字体的竖线很粗,因此可以在标准电视屏幕上轻松地以80列格式阅读。
级圣河

134

脑干

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

输出:

5

在这里尝试。

我知道这听起来有些简单,但正如原始文章中所建议的那样,我试图发挥创造力。


1
我不知道该死,这花了我几分钟的时间才弄清楚。ASCII 53,对吗?
级圣河

4
只要有,+++++.您就可以绘画任何东西。
Eduard Florinescu 2014年

1
@steveverrill:是的,您是对的。(这是在BF中输出ASCII字符的唯一方法)。
tigrou 2014年


105

重击

由于这是一场,我想我应该使用一种漫长的方法...

对于不了解Bash的人:$((...expr...))是一种用于评估算术表达式的语法。$(bc<<<...expr...)使用bc命令行计算器执行相同的操作。

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

输出量

2+2= 5

说明

第二行将v和2连接起来而不是将它们相加,得到22。
实际说明:
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
不错的数学技巧正在继续!
tomsmeding

5
@tomsmeding这是相当有趣,尽管约一半,我意识到,我已经把15代替16排队4.幸运的是,它仍然工作,因为bc的舍入

2
看看您是否喜欢这种风格的外观,它也是有效的Bash(消除了美元符号,在等号周围留有空格,并允许组合赋值运算符):((v = v * 5))((v *= 5))
Dennis Williamson

2
不错,但我+=立即发现了这件事。
nyuszika7h 2014年

2
@ardnew是的。前两行(v=2v+=2):对于不熟悉Bash变量处理的人来说,这等效于2+2,但实际上是"2"+"2",即"22"。因此,代码中的其他注释都是错误的。我知道,并不是每个人都觉得这很有趣

101

蟒蛇

受Java答案启发:

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

与Java一样,CPython将相同的内存位置用于前几个小整数的任何副本(如果有内存,则为0-255)。这将进入并通过直接编辑该内存位置ctypespatch只是一个模糊"12-7"的字符串,带有len4 的字符串,等于eval5。

更加混淆的版本

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

超越2 + 2

如OP所述,2 + 2可能很无聊;因此,这里有一些更干净,跨平台,多宽度的代码,可以肆意滥用。

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

使用Python 2.7运行...最后忽略该行。我可以轻松访问Windows 64位和Ubuntu 32位两个系统。

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

毫不奇怪,我们可以破坏加法的关联性质,其中(a + b)+ c = a +(b + c),如第一1+2+3行和第二行所示,但莫名其妙地,我们也破坏了交换性质(其中a + b = b + a;第二和第三行)。我想知道Python解释器是否只是忽略加法表达式周围的多余括号。


96
是的,我们绝对都只是随随便便忽略了段错误...

10
值得一提的是,这并不是Python的把戏,它仅适用于Python的C实现。
xApple

1
@NickT啊!好的。我给您的印象是,您在相同的64位Windows,32位ubuntu设置下尝试过原始版本
DavidJFelix 2014年

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')是修改后的第一个版本。我做了这个,所以我可以把它放到/ etc / profile中的$ PYTHONSTARTUP中,作为黑客竞赛中的红队。
DavidJFelix 2014年

2
是的 旁注,似乎1、0和-1是python立即进行段错误处理的一些数字。我以为那是搞砸python程序行为的最糟糕的过程。可能有可能利用fuckitpy包含这些错误。
DavidJFelix 2014年

86

JavaScript:

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

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

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

http://jsfiddle.net/qhRJY/上进行检查

H(拉丁文大写字母h)和Η(希腊文大写字母eta)都被设置为全局范围,因为它们未使用var关键字定义为函数的局部变量。虽然它们看起来很相似,但实际上是2个不同的变量,具有2个不同的值。在浏览器中使用Ctrl + F,您会发现Η(eta)在此页面上的显示明显小于H(h)。


4
@Sam即使两个'H'看起来相同,但实际上它们是2个完全不同的字符。在Unicode中,可以有看起来相同但具有不同代码点的不同字符。在这种情况下;另一个“ H”实际上是希腊字母Eta
d3dave 2014年

79
现在正式使用象形文字来“迷惑”读者并不好笑
John Dvorak 2014年

29
结合了javascript荒谬的全局变量,这些同形文字变得很有趣。
康斯坦丁·威茨

3
它不是“ UnicodeΗ字符”,而是拉丁字母H和希腊语Eta(Η)。
phyzome 2014年

4
@Vortico嗯...当常见问题解答不足时您希望什么?来自帮助中心的常见问题解答链接?请注意,只有主持人可以应用常见问题标签。至于答案-问题指出“分数+5或更多,并且投票数至少是投票数的两倍”。答案有27票赞成票,没有票数。对我来说,这听起来像是满足了答案中所述的标准,并且对于只有124人进行了10次以上投票的网站的meta网站上的第二个最古老的问题,其支持投票的数量非常可观。将有多少喜欢的?大家?
John Dvorak 2014年

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

不足的地方是它实际上并没有被使用-如果您将2dB的声源添加到另一个2dB的声源,则最终的组合噪声将为5dB(如果您添加两个30dB的声源,则其噪声为33dB),因为它们是以对数刻度测量的。

您可以在这里其他计算器上看到它。


好吧,它实际上更像是5.01分贝,但距离4还远远不够。
Joe Z.

68

的PHP

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

产生:

2 + 2 = 5

这是因为在PHP中,三元数是从左到右计算的,因此实际上
(2 + 2 === 4 ? 4 : 2 + 2 === 5) // 2 + 2 is == 4, and 4 == true, therefore echo 5 ? 5 : 'dunno';


35
强制性phpsadness
wchargin

1
我再举一个PHP例子:$a=2;echo "2+2=".$a++ + $a++;
avall 2014年

显然,$ a ++产生3,结果将是6。我不明白您的想法。
2014年

1
@Janus PHPsadness#30很好地解释了
wchargin 2014年


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
=而不是==,很容易看到,并且坦率地说没有灵感。
2014年

19
无论如何,都有一个反对意见,我犯了很多错误

6
我仍然喜欢这个答案
Sam Creamer

5
我也喜欢这个。并非每种语言都=仅用作辅助,而是用作比较运算符(例如Pascal,SQL,VB)
2014年

我发现它很明显
Oliver Ni

57

C#

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

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

        Console.WriteLine(x + y);
    }

7
啊,好老流氓的招数。这就是为什么您应该在任何地方都使用1TBS的原因。
约翰·德沃夏克

11
@JanDvorak是否可以使用if语句后的分号?我不知道C#,但我使用过C ++

5
@professorfish这就是我的假设。另外,不允许您插入随机花括号FTW的语言。
约翰·德沃夏克

12
没有“;”,if语句控制是否执行代码块。用“;” 在那里,对if进行评估,但结果不做任何事情。然后,每次都会执行代码块,无论如何。在C#中,具有随机代码块是完全可以接受的。
Grax32

2
前几天我有了这个。我;在它后面有一个for循环,这完全是故意的,因为我正在使用空循环来推进游标。我不小心删除了分号,所有内容都炸毁了,我不知道为什么。
mpen 2014年

56

用ASCII艺术装饰Javascript是很危险的。

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

     (2 + 2)

删除注释后,其余符号和运算符的计算结果为。
-~~--~(2 + 2) 这利用了JS中的按位非运算符(〜)以及少数的减号,这些负号将一路取反。


3
我想知道--操作员如何接受,因为它应该会出错Invalid left-hand side expression in prefix operation;但是我意识到它们之间有一个空格字符。
usandfriends 2015年

53

重击

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

输出:

2 + 2 = 5

每个命令的输出cat都有一个隐式换行符,但是最后的换行符被命令替换剥离$( )


这是另一个:

#!/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数组的索引为零


3
实际上我确实赶上了第一个,因为在巴什(Bash)打高尔夫球时我遇到了很多类似的问题。至于第二个,数组零索引不是哪里?

3
@professorfish Applescript,例如:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
数字创伤

12
@DigitalTrauma Applescript很奇怪

5
zsh$arr[0]除非KSH_ARRAYS设置了选项,否则使用1索引数组(并且只是未设置或未定义等),在这种情况下,数组将使用0索引。
chepner 2014年

4
@professorfush:Lua和Fortran索引为1。每当我数到10时,我总是从1开始,而不是
0。:D

49

佩尔

# 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...";
}

这取决于名为Acme :: NewMath的 CPAN模块。由于模块中的文件名错误,因此仅适用于不区分大小写的文件系统(例如,在Windows或Mac OS X上),但是我在这里怪罪了原始模块的作者。Acme :: NewMath根据Ingsoc意识形态实现数学。


16
这很狡猾。没人看过您的进口/包含品。

44

[R

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

输出:

5

该代码实际上将[1]的平均值与[4]的平均值相加。使用R中的平均功能将是正确的方法: mean(c(1,3)) + mean(c(4,0))这不像R中一些其他的数学函数,比如summaxmin; 其中sum(1,3)max(1,3)min(3,1)都会给出预期的答案。


7
还不错,骗了我一下。
qwr

37

爪哇

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

输出:

512.0000000000005

可能适用于使用相同双打的任何语言。


7
这是一个非常奇怪的主要特征。
Bertie Wheen 2014年

10
Java在内部将可变参数作为数组实现。
CodaFi 2014年

4
我花了一点时间才意识到,您可能正在谈论双打的最后几位。我看到前几位数字正确添加了(_2_56 + _2_56 = _5_12),但您似乎更想说一下256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(请注意:下划线用来“加粗”这些数字。)
Justin

35

Befunge

这是用Befunge编写的,但看起来像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

运行(使用正确的解释器)时,程序将打印5

说明:

Befunge程序由单字符命令网格组成。第一个命令是左上角的命令,命令的读取向右进行。但是方向可以在程序执行期间改变。

仅运行第一行字符,以及第一行中以开头的字符v列。有问题的字符会执行以下操作:

#-跳过下一个命令
>-从现在开始,命令将在当前命令的右侧读取
v-从现在开始,命令将在当前命令的下方读取
5-将5压入堆栈
.-弹出并打印数字在堆栈的顶部
@-结束程序
<space>-不执行任何操作

如果您知道自己正在使用Befunge进行编程,那真的不会欺骗任何人。但是,如果您遇到此问题,但没有意识到这是Befunge,则很有可能会做到。


11
+1,这是非常狡猾的,因为在调试时谁在看运行源代码的程序?
MrLore 2014年

33

的JavaScript

码:

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

输出:

5

您可以在控制台上自行测试或检查此小提琴


6
您能否指出我一个资源或向我解释为什么这样有效。我知道它确实有用,因为我检查了它的小提琴,但是我不明白为什么。
家庭

29
“ a”变量两次都不相同(对不起,如果我破坏了它)。确实是偷偷摸摸的unicode
Sam Creamer 2014年

6
我喜欢下一个字符U+0431б-几乎是6!
wchargin 2014年

73
现在正式使用象形文字来“迷惑”读者并不好笑
John Dvorak 2014年

40
@JanDvorak这个答案发布在这个答案之后;它不适用于这里。
门把手

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

打印2 + 2 = 5

所以a = 2对吧?

gcc-4.7.3从右到左评估函数参数。当评估a + b时,a仍为3。


16
很好地使用未指定的行为
chbaker0 2014年

24

福特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

common块的标准滥用:订单很重要;我在子程序的块中交换了顺序,所以我真的添加了1 + 2 + 2


6
@JanDvorak:哈哈,我本可以使用FORTRAN IV来重新定义文字,例如2=3
Kyle

1
@KyleKanos,当我看到您的帖子是用FORTRAN编写时,这就是我的想法。
danmcardle 2014年

@KyleKanos做到这一点!
ClickRick 2014年

1
@KyleKanos:它适用于整数文字还是仅浮点数?我认为在那个时代的机器上,整数文字和地址将具有相同的大小,但小于浮点数,因此,对浮点文字进行池化将节省空间,而对整数文字进行池化则不会。
超级猫2014年

2
@KyleKanos:我的理解是编译器不允许直接分配给文字,但是使用的函数调用是通过引用传递的,而将浮点文字传递给函数通常会传递浮点数池中的值的地址点文字。将整数值传递给函数将导致将其合并,但是大多数使用整数的代码将直接包含这些值。
2014年

24

蟒蛇

代码打印5,这是此任务的正确答案。

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

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

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

编辑:这是添加整数,而不是字符串化的二进制数的替代版本。

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

Tilde是返回的一元逆运算符-x-1,因此第一步是获取-6,然后在print函数get中使用另一个运算符5


为什么~eval(`a`)不只是~a
Andrea Corbellini 2014年

2
我想保留一些int()功能,eval()如果输入是字符串化整数,就可以完成工作:)
avall 2014年

24

红宝石

class Fixnum
    alias plus +

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

puts 2 + 2

这会将所有第一个自变量为Fixnum(至少在MRI中为2)的加法运算的结果加1。

这样做的副作用甚至比Java版本还要糟。


23

红宝石

Ruby具有一流的环境。这意味着很多事情。这也意味着可以做很多事情……也许不应该。

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

输出为:

2 + 2 = 
4
2 + 4 = 
6
但是在1984年...
2 + 2 = 
5
2 + 4 = 
6

如果您想更多地了解这种乐趣和危险,请参阅Ruby Conf 2011保持Ruby合理,并从Abstract Heresies博客中阅读一流的环境


另外:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42 2014年

1
仅针对特定情况做: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 2014年

21

方案

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

9
嘿!2+2不是在Lisp中做加法的方法!
约翰·德沃夏克

1
所以呢?它似乎按原样在任务中添加2到2。
Hauleth

119
@JanDvorak我从未用过Lisp,但据我了解,它就像((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(())))
地下

2
“将2 + 2定义为5并不是很有创意!不要三思而后行,尝试其他方法。” ---好吧,在R5RS中,我可以重新定义+,而不是2 + 2或2。答案在这里:pastebin.com/KHtm9Jmv
Felipe

1
@FelipeMicaroniLalli注释是在我的回答之后进行的,因此不算在内。
Hauleth 2014年

20

C#

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

对于不熟悉的人来说,这看起来像是我在2范围开始和结束的范围。实际上,它是从2开始并具有两个数字。所以2 + 3 = 5


6
以2开始和结束的范围是{ 2 },不是吗?
圣保罗Ebermann

1
@PaŭloEbermann Enumerable.Range不需要起点和终点,它需要起点和计数(将被枚举的元素)。
2014年

14
@MasterMastic我从答案中的解释中了解了这一点。但是“对不熟悉的人”的含义应该是这样的范围(根据答案中的解释),我的观点是,预期结果将是2,而不是4。
PaŭloEbermann 2014年

1
@PaŭloEbermann,是的,这也是一种查看方式。我以为它看起来更像是在提供要添加的数字。所以Enumerable.Range(1,2,3,4)将在1,端部开始,在4,并且将总结至10
保罗

19

F#

让我们在fsi中输入以下语句:

let ``2+2``= 5

输出:

val ( 2+2 ) : int = 5

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

5是不太好隐藏的,我害怕。不适用于优化。


1
不错 如果不允许未定义的行为,我无法投票。
这个

2
@self。,我看不出在哪里禁止使用UB。高尔夫的许多代码答案都依赖于UB,我认为只要在某个合理的平台上持续发生就可以了。
ugoren 2014年

2
我看不出在哪里禁止使用UB。我也没有找到任何规则。如果可以澄清那将是很好。许多代码高尔夫答案都依赖于UB,我认为只要在某个合理的平台上始终如一地执行就可以了。
这个
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.