Напишите программу, которая делает 2 + 2 = 5 [закрыто]


393

Напишите программу, которая, казалось бы, добавляет числа 2 и 2 и выводит 5. Это закулисный конкурс.

Ваша программа не может вывести никаких ошибок. Остерегайтесь дыр в памяти! Ввод необязателен.

Переопределение 2 + 2 как 5 не очень креативно! Не думай дважды, попробуй что-нибудь еще.


48
Это вопрос в книге Джорджа Оруэлла "1984".
bacchusbeale

97
Почему это закулисно? Два плюс два - это пять.
Geobits

79
ТАМ! НАХОДЯТСЯ! ЧЕТЫРЕ! ОГНИ!
Ник Т

105
@ Geobits - я согласен: 2 + 2 = 5 вы можете увидеть это в этом калькуляторе .
MT0

47
echo "2+2=5";
user3459110

Ответы:


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 целых чисел. Это массив целых чисел от −128 до +127. cache[132]это место, где обычно 4. Установите это к 5.

Предупреждение: выполнение этого в реальном коде сделает людей очень несчастными.

Демонстрация кода на ideone .


5
Думал об этом, как только увидел вопрос :)
Октавия Тогами

306
Это. Является. Зло. Абсолютно зло. +1
Джон Дворжак

75
@JanDvorak в чате было предложено. Integer[] array = (Integer[]) c.get(cache); fisherYatesShuffle(array); Представьте, сколько вещей сломается ...

30
Подобные ответы заставляют меня любить этот сайт больше, чем ТАК.
Сонго

35
zomg, java ответы никогда не получают лучших голосов! +1 за доведение Java до вершины :)
Cruncher

297

Haskell

Я просто люблю, как вы можете бросить что-нибудь в 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это приведет к ошибке, потому что я никогда не определял, что должно произойти в этом случае.
Флонк

27
@SHiNKiROU тень, а не переопределять
Джон Дворжак

96
это звучит почти так: «И сказал Бог, пусть 2 + 2 = 5 в 2 + 2»))
OutFall

11
@ user3217013 Учите Haskell, это полезно для вашего сердца.
Чистка

294

С

Довольно дешевый трюк, но я уверен, что поймаю большинство из вас.

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

Попробуй здесь

Прокрутите код вправо.
Я не уверен в Windows / Linux, но в OSX полоса прокрутки не видна.
В любом случае, это хорошая причина включить «визуализацию пространства» в вашем любимом редакторе кода.


96
Полоса прокрутки видна в Chromium, но кто сначала обращает на это внимание? :)
Руслан

172
Чтобы сбить с толку людей, вы можете добавить строку комментария, которая достаточно длинна, чтобы «объяснить» существование полосы прокрутки, но достаточно скучна, чтобы никто не заботился (прокручивать ее), чтобы прочитать ее.
Хаген фон Айцен

22
В OS X видимость полосы прокрутки по умолчанию зависит от того, подключена ли мышь. Если есть только тачпад, полосы прокрутки накладываются и исчезают, когда они не используются. Если подключена мышь, полосы прокрутки крадут пространство из контекстного окна и всегда видны. Вы можете проверить это, отсоединив и подключив USB-мышь к MacBook. Конечно, это можно настроить в Системных настройках.
Андреа

49
Умно, но на мобильном это просто обертки :)
Logan

31
Это единственный раз, когда прокрутка окон SE-кода не заставляет меня ломать кому-то пальцы.
ObscureRobot

184

GolfScript

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

1
@MadTux Вот, пожалуйста.
aaaaaaaaaaaa

1
Благодарю. (Я проголосую позже, потому что я достиг своего дневного лимита, вот пиво.)
MadTux

5
Просто и обманчиво, я люблю это. +1
seequ

9
мне это нравится, потому что не похоже, что он обманывает вас математикой или семантикой, это кажется таким простым и все же 5 ^^
dwana

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 достаточно).

В необработанных шестнадцатеричных представлениях чисел разница только в 1 бит (между 4000000000000001и 4000000000000000) ... этого достаточно, чтобы Math.ceilметод возвращал 5, а не 4.


61
Math.ceil(two + two); // round just in caseЯ вижу, что вы там сделали
Тим С.

17
Создание функции и переменной с одинаковым именем ... Вау.
конфигуратор

107
@configurator - это ничего, там даже нет класса с именем two. Производственный класс Java Two two = Two.two.two();с Two.two существо типа TwoFactory.
Jannis Froese

36
Two.Infinity.And.Beyond ()
CincauHangus

7
@TimS Я прекращаю делать то, что ты там делал
коды

135

BBC BASIC

РЕДАКТИРОВАТЬ: Для Андреа Фолдс и 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
Эти шрифты выглядят по-другому, хотя. Как вы думаете, вы могли бы сделать это, используя правильный шрифт?
Андреа

@AndreaFaulds Я использую эмулятор из bbcbasic.co.uk/bbcwin/bbcwin.html . Он поддерживает переопределение шрифта оригинального BBC Basic на сетке 8x8. Но шрифт по умолчанию эмулятора явно выше разрешения, чем 8x8. Так что я мог бы, вероятно, сделать лучшую работу, но это не было бы идеально. Я полагаю, я мог бы переопределить шрифт для всех 5, а также 4, тогда они будут выглядеть одинаково.
Уровень River St

5
@AndreaFaulds В вопросе не сказано, что результат должен быть неотличим от других 5. Я думаю, что это на самом деле особенность. 2+3=5и2+2=5'
Бен Джексон

1
Это соответствует оригинальному шрифту в BBC Micro:VDU 23,52,126,96,124,6,6,102,60,0
брезгливое ossifrage

@squeamishossifrage спасибо за информацию. Это не будет соответствовать шрифт в эмуляторе, хотя. Ваш пример 7 пикселей в высоту, так же, как мой. Кроме того, он имеет ноль внизу, точно так же, как у меня, в то время как, похоже, мне нужно немного его сдвинуть (т. Е. Иметь ноль сверху, а не снизу). Ключевое отличие в том, что у меня 126,64 тогда как у вас есть 126,96, и у вас есть несколько 6 вместо моих 2. Это потому, что оригинальный шрифт BBC имел толстые вертикальные линии, поэтому его можно было легко прочитать в формате 80 колонок на стандартном экране телевизора.
Уровень Река St

134

Brainfuck

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

Выход:

5

Попробуй это здесь .

Я знаю, что это может показаться немного простым, но я старался быть креативным, как это предлагалось в оригинальном посте.


1
Я не знаю, придурок, мне потребовалось несколько минут, чтобы понять это. ASCII 53, верно?
Уровень Река St

4
Пока у вас есть, +++++.вы можете рисовать что угодно.
Эдуард Флоринеску

1
@steveverrill: да, вы правы. (и это единственный способ вывести символы ascii в BF).
Tigrou


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
Хороший математический трюк происходит там!
Томсминг

5
@tomsmeding Это было довольно забавно, хотя примерно на полпути я понял, что поставил 15вместо 16строки 4. К счастью, это все еще работало из-за bcокругления

2
Посмотрите, нравится ли вам стиль этого стиля, который также является допустимым Bash (исключает знаки доллара, допускает пробелы вокруг знака равенства и допускает комбинированные операторы присваивания): ((v = v * 5))или((v *= 5))
Деннис Уильямсон

2
Хорошо, но я сразу заметил +=это.
nyuszika7h

2
@ardnew да, есть. первые две строки ( v=2а v+=2): кому - то не знаком с Баш переменной обработки, что будет эквивалентно 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, если память служит). Это входит и непосредственно редактирует эту ячейку памяти через ctypes. patchэто просто запутанный "12-7", строка с len4, который evalдо 5.

Более запутанная версия

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

Как уже упоминалось, 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-bit и Ubuntu 32-bit, две системы, к которым у меня есть легкий доступ.

$ 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-й 1+2+3строках, но необъяснимым образом мы также нарушаем коммутативное свойство (где a + b = b + a ; 2-я и 3-я строки). Интересно, интерпретатор Python просто игнорирует лишние скобки вокруг выражений сложения?


96
Да, мы определенно все просто игнорируем segfaults ...

10
Стоит отметить, что на самом деле это не уловка Python, а только специфическая реализация C на Python.
xApple

1
@NickT Ах! Хорошо. У меня сложилось впечатление, что вы попробовали оригинал под теми же 64-битными окнами, 32-битной установкой Ubuntu
DavidJFelix

22
exec('\x66\x72\x6f\x6d\x20\x63\x74\x79\ \x70\x65\x73\x20\x69\x6d\x70\x6f\ \x72\x74\x20\x63\x5f\x69\x6e\x74\ \x38\x3b\x20\x69\x6d\x70\x6f\x72\ \x74\x20\x73\x74\x72\x75\x63\x74\ \x3b\x20\x63\x5f\x69\x6e\x74\x38\ \x2e\x66\x72\x6f\x6d\x5f\x61\x64\ \x64\x72\x65\x73\x73\x28\x69\x64\ \x28\x34\x29\x20\x2b\x20\x73\x74\ \x72\x75\x63\x74\x2e\x63\x61\x6c\ \x63\x73\x69\x7a\x65\x28\x27\x50\ \x50\x27\x29\x29\x2e\x76\x61\x6c\ \x75\x65\x3d\x35')Это модифицированная первая версия. Я сделал это, чтобы добавить его в $ PYTHONSTARTUP в / etc / profile в качестве красной команды на соревнованиях по хакерству.
DavidJFelix

2
Да уж. Sidenote, кажется, что 1, 0 и -1 - это некоторые из чисел, с которыми python немедленно перешагивает. Я думал, что это будет наихудшим для того, чтобы испортить поведение программ на Python. Может быть возможно использовать fuckitpy, чтобы содержать эти ошибки.
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())

Проверьте это на http://jsfiddle.net/qhRJY/

И H ​​(латинская буква h), и Η (греческая буква eta) установлены в глобальную область, потому что они не были определены как локальные для функций с ключевым словом var. Хотя они выглядят одинаково, на самом деле это две разные переменные с двумя разными значениями. Используя Ctrl + F в вашем браузере, вы обнаружите, что Η (eta) отображается значительно меньше, чем H (h) на этой странице.


4
@ Сэм, хотя эти два Н выглядят одинаково, на самом деле это два совершенно разных символа. В Unicode могут быть разные символы, которые выглядят одинаково, но имеют разные кодовые точки. В этом конкретном случае; другая буква «H» на самом деле - греческая буква Eta .
d3dave

79
Использование гомоглифов, чтобы «запутать» читателей, теперь официально не смешно .
Джон Дворак

29
Гомоглифы становятся смешными в сочетании с нелепыми глобальными переменными в JavaScript.
Константин Вайц

3
Это не «Unicode Η персонаж», это латинская H и греческая Eta (Η).
хорошо относитесь к своим модам

4
@Vortico хм ... что вы хотите, если вопрос часто не хватает? Часто задаваемые вопросы, связанные со справочным центром? Обратите внимание, что только модераторы могут применять тег faq . Что касается ответа - вопрос гласит: «Набери +5 или больше и как минимум вдвое больше голосов, чем голосов». Ответ имеет 27 голосов "против" и "нет". Это звучит для меня как выполнение критериев, указанных в ответе, и количество откликов довольно впечатляюще для второго самого старого ответа на вопрос на мета-сайте сайта, где только 124 человека проголосовали более 10 раз. Сколько бы вы хотели? Каждый?
Джон Дворжак

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

Подбитый бит состоит в том, что он фактически не скрыт - если вы добавляете источник звука 2 дБ к другому источнику звука 2 дБ, тогда результирующий объединенный шум будет 5 дБ (и если вы добавите два источника 30 дБ, то его 33 дБ), поскольку они измеряются в логарифмическом масштабе.

Вы можете увидеть это на другом калькуляторе здесь .


Ну, на самом деле это больше похоже на 5,01 децибела, но достаточно далеко от 4 для подсчета.
Джо З.

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

Очевидно, что $ a ++ составляет 3, а результат - 6. Я не понимаю, о чем вы думаете.
Ож

1
@Janus PHPsadness # 30 это хорошо объясняет
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');
}

73
=вместо этого ==, легко увидеть и откровенно скучно.
Приближается к

19
В любом случае, воздержитесь, я часто совершаю эту ошибку

6
Мне все еще нравится этот ответ
Сэм Кример

5
Мне тоже это нравится. Не каждый язык использует =только в качестве назначения, но оператор сравнения (например, Pascal, SQL, VB)
avall

Я нахожу это очень очевидным
Оливер Ни

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
@professfishfish, это то, что я предполагаю. Кроме того, языки, которые не позволяют вставлять случайные фигурные скобки FTW.
Джон Дворжак

12
Без «;» оператор if определяет, будет ли выполняться блок кода. С ";" там вычисляется if, но с результатом ничего не делается. Затем блок кода выполняется каждый раз, независимо. В C # вполне допустимо иметь случайные кодовые блоки.
Grax32

2
Я получил себя с этим на днях. У меня был цикл for с ;последующим после него, что было совершенно преднамеренным, поскольку я использовал пустой цикл для перемещения курсора. Я случайно удалил точку с запятой, все взорвалось, и я не мог понять, почему.
mpen

56

Опасно украшать ваш Javascript искусством ASCII.

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

     (2 + 2)

Когда комментарии удаляются, оставшиеся символы и операторы оцениваются как.
-~~--~(2 + 2) В нем используется оператор Bitwise Not (~) в JS, а также несколько знаков минус, которые будут сбрасывать значения по пути.


3
Мне было интересно, как --оператор был приемлемым, поскольку он должен с ошибкой Invalid left-hand side expression in prefix operation; однако я понял, что между ними есть пробельные символы.
usandfriends

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
Я действительно поймал первый, потому что у меня было много проблем с такими вещами во время игры в гольф в Баше. Что касается второго, где массивы не проиндексированы?

3
@professfishfish Applescript, например:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Цифровая травма

12
@DigitalTrauma Applescript странный

5
zshиспользует массивы с 1 индексом (и $arr[0]просто не установлен или не определен или что-то в этом роде), если не установлена KSH_ARRAYSопция, в этом случае массивы с 0 индексами.
chepner

4
@prof Professorfush: Lua & Fortran 1 проиндексированы. Каждый раз, когда я считаю до 10, я всегда начинаю с 1, а не с 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...";
}

Это зависит от CPAN модуля с именем Acme :: NewMath . Из-за неправильных имен файлов в модуле это будет работать только в нечувствительных к регистру файловых системах (например, в Windows или Mac OS X), но я обвиняю автора оригинального модуля здесь. Acme :: NewMath реализует математику в соответствии с идеологией Ingsoc.


16
Это довольно хитро. Никто никогда не смотрит на ваш импорт / включает.

44

р

# 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, таких как sum, maxи min; где 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
Это очень странная главная подпись.
Берти Уин

10
Java реализует переменные аргументы как массивы под капотом.
CodaFi

4
Мне потребовалось время, чтобы понять, что вы, вероятно, говорите о последних цифрах в парном разряде. Я видел, что первые цифры добавлены правильно ( _2_56 + _2_56 = _5_12), но более вероятно, что вы имеете в виду 256.000000000000_2_ + 256.000000000000_2_ = 512.000000000000_5_(примечание: подчеркивание используется для "полужирного" цифр.
Джастин

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

33

JavaScript

Код:

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

Выход:

5

Вы можете проверить это самостоятельно на своей консоли или проверить эту скрипку


6
Можете ли вы указать мне на ресурс или объяснить, почему это работает. Я знаю, что это работает, потому что я проверил Скрипку этого, но я не понимаю почему.
Семья

29
переменная "a" не одинакова оба раза (извините, если я это испортила). Подлый юникод действительно
Сэм Кример

6
Я люблю, как следующий персонаж U+0431, - почти 6!
wchargin

73
Использование гомоглифов, чтобы «запутать» читателей, теперь официально не смешно .
Джон Дворак

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

Так а = 2, верно?

gcc-4.7.3 оценивает параметры функции справа налево. Когда a + b оценивается, a по-прежнему равен 3.


16
Хорошее использование неопределенного поведения
chbaker0

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
Кайл Канос,

1
@KyleKanos, это то, что я думал, что это будет, когда я увидел, что ваш пост был написан на Фортране.
danmcardle

@KyleKanos Сделай это!
ClickRick

1
@KyleKanos: Это работало с целочисленными литералами или только с плавающей точкой? Я бы подумал, что на машине той эпохи целочисленный литерал и адрес были бы того же размера, но меньше, чем float, поэтому объединение литералов с плавающей точкой сэкономило бы место, а объединение литералов int - нет.
Суперкат

2
@KyleKanos: Насколько я понимаю, компиляторы не разрешают прямое присваивание литералу, но вызовы функций, используемые для передачи по ссылке, и передача литерала с плавающей точкой в ​​функцию, как правило, передают адрес значения в пуле плавающих точечные литералы. Передача целочисленного значения в функцию вызовет его объединение, но большая часть кода, использующего целые числа, будет включать значения напрямую.
суперкат

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)

Тильда - это унарный обратный оператор, который возвращает -x-1, поэтому первый шаг - это получить-6 а затем с другим оператором в printфункции получить5


Почему ~eval(`a`)вместо просто ~a?
Андреа Корбеллини

2
Я хотел оставить некоторые int()функции и делать eval()работу, если ввод представляет собой строковое целое число :)
avall

24

Рубин

class Fixnum
    alias plus +

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

puts 2 + 2

Это увеличивает результат всех добавлений, первый аргумент которых является Fixnum (который 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 Keeping Ruby Reasonable и прочтите первоклассные среды из блога Abstract Heresies.


Также:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
film42

1
Чтобы просто сделать для конкретного случая:class Fixnum; alias_method :orig_plus, :+; protected :orig_plus; def +(n) self == 2 && n == 2 ? 5 : self.orig_plus(n) end end
Гари С. Уивер

21

Схема

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

9
Привет! 2+2не так, как вы делаете дополнение в LISP!
Джон Дворжак

1
И что? Это, казалось бы, добавить 2 к 2, как в задаче.
Хаулет

119
@JanDvorak Я никогда не использовал lisp, но, насколько я понимаю, это что-то вроде ((((2))(()()))()()(()((((+))))()(((()(())((((2)))))()))(()))).
подземный

2
«Переопределение 2 + 2 как 5 не очень креативно! Не думай дважды, попробуй что-нибудь еще». --- Ну, в R5RS я могу переопределить + вместо 2 + 2 или 2. Ответ здесь: pastebin.com/KHtm9Jmv
Фелипе

1
@FelipeMicaroniLalli эта пометка была сделана после моего ответа, поэтому она не считается.
Хаулет

20

C #

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

Для кого-то незнакомого это будет выглядеть так, как будто я получаю диапазон, начинающийся и заканчивающийся на 2. На самом деле, он начинается с 2 и идет для двух чисел. Так что 2 + 3 = 5.


6
Диапазон, начинающийся и заканчивающийся на 2, был бы просто { 2 }, не так ли?
Paŭlo Ebermann

1
@ PaŭloEbermann Enumerable.Rangeне берет начало и конец, он требует начала и количества (элементов, которые будут перечислены).
MasterMastic

14
@MasterMastic Я понял это из объяснения в ответе. Но предполагается, что значение «кому-то не знакомому» должно быть таким диапазоном (из объяснения в ответе), и мой аргумент состоит в том, что ожидаемый результат тогда будет 2, а не 4.
Paŭlo Ebermann

1
@ PaŭloEbermann, да, это тоже один из способов взглянуть на это. Я думал, что это могло бы быть больше похоже на то, что я поставляю числа для добавления. Итак, Enumerable.Range (1,2,3,4) будет начинаться с 1, заканчиваться на 4 и будет суммироваться до 10.
Пол


18

С

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, и я думаю, что все в порядке, если это постоянно происходит на какой-то разумной платформе.
Угорен

2
Я не вижу, где запрещено полагаться на UB. Я тоже не нашел никаких правил по этому поводу. Было бы хорошо, если бы это можно было уточнить. Многие кодовые ответы в гольф опираются на UB, и я думаю, что это нормально, если это постоянно происходит на какой-то разумной платформе. Некоторые конкретные правила на этот счет были бы хорошими.
это
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.