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


393

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

Ваша програма не може вивести жодних помилок. Слідкуйте за отворами пам’яті! Введення необов’язкове.

Перевизначення 2 + 2 як 5 - це не дуже креативно! Не думайте про це, спробуйте щось інше.


48
Це питання у книзі "1984" Джорджа Орвелла.
bacchusbeale

97
Чому це недостатньо? Два плюс два - п’ять.
Геобіт

79
ТАМ! Є! ЧЕТВЕР! СВІТЛИ!
Нік Т

105
@Geobits - Я згоден: 2 + 2 = 5 ви можете побачити це в цьому калькуляторі .
MT0

47
echo "2+2=5";
user3459110

Відповіді:


669

Java

Рефлексія - це справді правильний шлях із зловживанням 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 - це легкий вага цілих літ. Це масив цілих чисел від -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

Хаскелл

Мені просто подобається, як ти можеш кинути що завгодно на 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
Розумний, але на мобільних це просто перебір слів :)
Логан

31
Це єдиний раз, коли прокручування вікон SE коду не змушує мене зламати когось пальці.
ObscureRobot

184

GolfScript

4:echo(2+2);

Друкує 5.

Звичайно, у GolfScript є синтаксис, який помітно відрізняється від інших мов, ця програма просто виглядає як щось базове або C-ish.

4  - Поставте число 4 на стек. Вміст стеку: 4
:echo- Збережіть значення у верхній частині стека до змінної відлуння. Вміст стеку: 4
(  - Зменшіть значення у верхній частині стека на 1. Вміст стеку: 3
2  - Поставте число 2 на вершину стека. Вміст стеку: 3 2
+  - Додайте два числа вгорі стека. Вміст стеку: 5 GolfScript за замовчуванням надрукує все, що залишилося в стеку після завершення виконання.
2   - Поставте число 2 поверх стека. Вміст стеку: 5 2
)  - Збільште значення у верхній частині стека на 1. Вміст стеку: 5 3
;  - Видаліть верхній елемент зі стека. Вміст стеку: 5


3
Чи можете ви пояснити це людям, які не говорять про GolfScript, будь ласка?
MadTux

1
@MadTux Ось ви йдете.
aaaaaaaaaaaa

1
Дякую. (Пізніше я проголосую, бо досягла щоденного ліміту, ось пиво.)
MadTux

5
Простий і обманливий, мені це подобається. +1
seequ

9
мені це подобається, бо це не здається, що це обдурює вас математикою чи семантикою, це здається простою і все-таки 5 ^^
dwana

145

Java

Завжди доводиться обходити ваші дублі, люди

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 Я припиняю те, що ви там зробили
thenaglecode

135

BBC BASIC

EDIT: Для 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

enter image description here

Це насправді друкує число 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, тоді вони виглядатимуть однаково.
Рівень річки Св.

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 стовпців на стандартному екрані телевізора.
Рівень річки Св.

134

Брейнфук

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

Вихід:

5

Спробуйте тут .

Я знаю, що це може здатися трохи простим, але я намагався бути творчим, як це пропонується в оригінальній публікації.


1
Я не знаю, марево, мені знадобилося пару хвилин, щоб зрозуміти це. ASCII 53, правда?
Рівень річки Св.

4
Поки у вас є, +++++.ви можете малювати що завгодно.
Едуард Флоринеску

1
@steveverrill: так, ти маєш рацію. (і це єдиний спосіб вивести символи ascii в BF).
tigrou


105

Баш

Оскільки це , я думаю, що я повинен використовувати метод довгострокової ...

Для людей, які не знають Баша: $((...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))
Денніс Вільямсон

2
Гарний, але я помітив +=річ одразу.
nyuszika7h

2
@ardnew так є. перші два рядки ( v=2і v+=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, якщо пам'ять служить). Це входить і безпосередньо редагує це місце в пам'яті через 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 ... ігноруйте цей рядок наприкінці. Працює в 64-розрядному і 32-бітному Ubuntu, до двох систем, до яких я легко отримую доступ.

$ 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
Так. З іншого боку, здається, що 1, 0 і -1 - це деякі числа, з якими пітон негайно переходить у відповідність. Я думав, що це буде найгірше для викручування поведінки програм 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), і capital (грецька літера капіталу eta) встановлені в глобальному масштабі, оскільки вони не були визначені як локальні для функцій з ключовим словом var. Хоча вони схожі, вони насправді є 2 різними змінними з двома різними значеннями. Використовуючи Ctrl + F у своєму браузері, ви побачите, що Η (eta) відображається значно менше ніж H (h) на цій сторінці.


4
@Sam, хоча два 'H виглядають однаково, вони насправді є 2 абсолютно різними персонажами. У Unicode можуть бути різні символи, які виглядають однаково, але мають різні кодові точки. У цьому конкретному випадку; інша «Н» - це насправді грецька літера Ета .
d3dave

79
Використовувати гомогліфи для «заплутування» читачів зараз офіційно не смішно .
Джон Дворак

29
Гомогліфи стають смішними в поєднанні зі смішними глобальними змінними JavaScript.
Костянтин Вайц

3
Це не символ "Unicode Η", це латинська мова H та грецька ета (Η).
фізоме

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

Недостатній біт полягає в тому, що він насправді не піддається обробці - якщо ви додасте 2dB джерело звуку до іншого 2dB джерела звуку, то результуючий комбінований шум буде 5dB (а якщо ви додасте два 30dB джерела, то його 33dB), як вони вимірюються в журнальній шкалі.

Ви можете побачити його на іншому калькуляторі тут .


Ну це насправді більше схоже на 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
@professorfish це я припускаю. Також мови, які не дозволяють вставляти випадкові фігурні фігурні дужки FTW.
Джон Дворак

12
Без ";" оператор if контролює, чи буде виконаний блок коду. За допомогою ";" там оцінюється "if", але з результатом нічого не робиться. Потім блок коду виконується кожен раз, незалежно. У C # цілком прийнятно мати блоки випадкових кодів.
Grax32

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

56

Небезпечно прикрашати ваш Javascript мистецтвом ASCII.

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

     (2 + 2)

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


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
@professorfish Applescript, наприклад:set a to {1, 2, 3, 4, 5, 6, 7, 8} item 4 of a
Digital Trauma

12
@DigitalTrauma Applescript дивний

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

4
@professorfush: Lua & Fortran - 1 індексований. Коли я рахую 10, я завжди починаю з 1, а не 0.: D
Кайл Канос

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

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, таких як sum, maxі min; де sum(1,3), max(1,3)і min(3,1)всі дадуть очікувану відповідь.


7
Непогано, трохи обдурив мене.
qwr

37

Java

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

вихід:

512.0000000000005

Можливо, працює будь-якою мовою, яка використовує один і той же вид парних.


7
Це дуже дивний головний підпис.
Bertie Wheen

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" хіба що однакова обидва рази (вибачте, якщо я їх псую). Підлий unicode дійсно
Сем Кремер

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

Так a = 2, правда?

gcc-4.7.3 оцінює параметри функції справа наліво. Коли а + b оцінюється, а все одно дорівнює 3.


16
Гарне використання невстановленої поведінки
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

Стандартне зловживання commonблоками: питання порядку; Я поміняв порядок у блоці в підпрограмі, тому я дійсно додаю 1 + 2 + 2.


6
@JanDvorak: Ха-ха, я міг би використати FORTRAN IV, в якому я міг би переосмислити літерали, наприклад2=3
Кайл Канос

1
@KyleKanos, саме так я думав, що це станеться, коли я побачив, що ваш пост написано на FORTRAN.
danmcardle

@KyleKanos Зробіть це!
ClickRick

1
@KyleKanos: Це працювало з цілими літералами чи тільки плаває? Я б подумав, що на машині тієї епохи ціле літеральне значення і адреса мали б однаковий розмір, але менші, ніж плаваючий, тому об'єднання плаваючих літералів заощаджує простір, але об'єднання int літералів не буде.
supercat

2
@KyleKanos: Я розумію, що компілятори не дозволять прямого присвоєння літералу, але виклики функцій, що використовуються, передають посиланням, і передача літералу з плаваючою комою в функцію зазвичай передає адресу значення в пулі плаваючих -точкові літерали. Передача функції цілому значенню функції призведе до його об'єднання, але більшість кодів, які використовували цілі числа, включали б ці значення безпосередньо.
supercat

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функції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 Зберігаючи Ruby розумним та читайте середовище першокласного з блогу «Анотація єресей».


Також:class Fixnum; def +(n) 5 end end; 2 + 2 # => 5
фільм42

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

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
Феліпе

1
@FelipeMicaroniLalli, що оголошення було зроблено після моєї відповіді, тому воно не враховується.
Hauleth

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, так, це теж один із способів поглянути на це. Я думав, що це може виглядати більше, як я постачаю номери для додавання. Таким численним. Ранг (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.