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

393

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

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

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

qwr
источник
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
Flonk
источник
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 по умолчанию напечатает все, что осталось в стеке после завершения выполнения.

AAAAAAAAAAAA
источник
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.

durron597
источник
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 . (с немного другим кодом) можно увидеть в истории редактирования.

Уровень реки St
источник
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

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

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

tigrou
источник
1
Я не знаю, придурок, мне потребовалось несколько минут, чтобы понять это. ASCII 53, верно?
Уровень Река St
4
Пока у вас есть, +++++.вы можете рисовать что угодно.
Эдуард Флоринеску
1
@steveverrill: да, вы правы. (и это единственный способ вывести символы ascii в BF).
Tigrou
1
Я не понимаю и
Лейф Виллертс
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 дБ), поскольку они измеряются в логарифмическом масштабе.

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

mt0
источник
Ну, на самом деле это больше похоже на 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';

MrLore
источник
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');
}
user1886419
источник
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);
    }
Grax32
источник
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

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

aditsu
источник
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, скорее всего, так и будет.

Matt
источник
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.

CPRI
источник
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

Avall
источник
Почему ~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.

Lowjacker
источник
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
Hauleth
источник
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.
Пол
19

F #

Давайте поместим в ФСИ следующее утверждение:

let ``2+2``= 5

Выход:

val ( 2+2 ) : int = 5
Кшиштоф Цислак
источник
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Не слишком хорошо скрыты, я боюсь. Не работает с оптимизацией.

ugoren
источник
1
Приятно; Я не могу поднять голос, если не определено поведение.
это
2
@self., я не вижу, где запрещено полагаться на UB. Многие ответы по гольф-кодам полагаются на UB, и я думаю, что все в порядке, если это постоянно происходит на какой-то разумной платформе.
Угорен
2
Я не вижу, где запрещено полагаться на UB. Я тоже не нашел никаких правил по этому поводу. Было бы хорошо, если бы это можно было уточнить. Многие кодовые ответы в гольф опираются на UB, и я думаю, что это нормально, если это постоянно происходит на какой-то разумной платформе. Некоторые конкретные правила на этот счет были бы хорошими.
это