Как вы, возможно, знаете, есть математический забавный факт: если вы добавите все натуральные числа, вы получите ... -1/12 (см. Википедию здесь) .
Конечно, это очень странный результат, и его нельзя получить, просто добавив одно число за другим, но некоторые специальные математические приемы.
Однако ваша задача - написать программу, которая выглядит так, как будто она пытается добавить все натуральные числа, но когда вы запускаете ее - она возвращает -1/12.
В псевдокоде это может выглядеть так:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Вы можете делать это любым удобным для вас способом - вы можете использовать некоторое переполнение буфера, играть с ошибками, возникающими, когда некоторая переменная становится слишком большой, или просто скрывать важные вещи в коде каким-то умным способом. Единственными условиями является то, что код должен сначала выглядеть так, как будто он пытается добавить все натуральные числа, а при запуске он возвращает -1/12 (в любом формате это может быть десятичный, двоичный, текстовый, ascii art любой тип данных).
Код, конечно, может содержать гораздо больше, чем показано выше, но он должен быть достаточно понятным, чтобы обмануть читателя.
Это конкурс популярности - проголосуй за самую умную идею!
источник
Ответы:
С
Должен работать на платформах, где оба
sizeof(float)
иsizeof(int)
равны 4 и следуют стандарту IEEE с плавающей запятой (я думаю).Версия 1:
Выход:
-0.083
Объяснение:
Отдельное спасибо @Geobits за идею завершить цикл, сравнив сумму вместо счетчика.
Редактировать: версия 2
Выход:
-0.083333
Объяснение:
источник
79776
есть137A0
, что есть((int) "\rz") << 4
. Не уверен, насколько это полезноwhile(!(abs<delta))
вместоwhile(abs>delta)
сброса проверки NaN.питон
Результат:
Так в чем же подвох?
источник
Mathematica
(Примечание: вставка этого в блокнот Mathematica, вероятно, покажет, что происходит.)
источник
68+{0,37,46,37,31,36,40,33,48}
, поскольку ониPlus
имеютListable
атрибут. Лично я нахожу это более идиоматичным.С
Приятно форматирует ответ как
-1/12
нет0.8333
.Как это устроено?
источник
Brainfuck
Код просто оцените 1 + 2 + 3 + ...
источник
1 + 2 + 3 + ...
что означает, что 256 должно быть треугольным,i == 256
как вы также заявляете, но 256 не является треугольным числом. Кроме того, где ваш код выводится-1/12
?1/12
вместо-1/12
(Happy сегодня? +.
- -.
+ +.
+ Пожалуйста, проголосуйте за меня.
) Эти четыре.
предназначены для вывода.256
.i
при достижении нуля становятся равными нулю256
(это я и имел в виду под переполнением). На этом этапе внешний цикл завершается, и выполняются строки, следующие (которые кажутся комментариями), отсюда вывод-1/12
.Просто добавив немного лучшего запутывания, оставляя петлю к ответу туза.
Намек нет переполнения ...
источник
average=sum/i;
достигну нуля из-за переполнения, и в этот момент выдается SIGFPE, пойманный приhandler
печати -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
это пустая распродажа того, что там что-то происходит, и то, что он находится в обработчике для SIGFPE, делает это слишком очевидным для моих вкусов.Perl 6
Это вычисляет сумму, используя дзета-функцию. Я бы использовал
[+] 1..*
(сумма всех чисел от 1 до бесконечности), за исключением того, что работает в бесконечное время.источник
Ява
Это добавляет все числа от 0 до максимального значения, умноженного на 12, а также добавляет 1 в конце. Результат равен 0, поэтому сумма чисел должна быть (0 - 1) / 12.
Объяснение:
источник
Рубин
демонстрация
Хорошо, предполагаемая семантика и синтаксис вывода здесь не имеют большого смысла, но, возможно, это неочевидно на первый взгляд.
Также обратите внимание, что это, на самом деле, не зависит от платформы и версии Ruby. Это зависит от того, какие другие константы определены как ожидаемые.
источник
С
Чтобы разобраться с (почти) бесконечной суммой за разумное время, скомпилируйте следующие параметры для некоторых оптимизаций компилятора (обязательно):
Пример вывода:
источник
??/
трюк с триграфами давно перестал быть умным. :(Ява
По идее это будет печатать
true
. Тем не менее, я думаю, что мой компьютер рассыпется в пыль, прежде чем он закончит свою работу.источник
-1/12
оно практически равно нулю. Итак, я предполагаю, что это некое поведение переполнения, которое приводит к завершению цикла и по совпадениюsum
переполняется до нуля?long
. Возможно, к тому времени Вселенная больше не будет существовать, но это только теоретически, верно? И да, младшие 32 битаsum
будут равны нулю - вот почему важноsum
бытьint
, а не аlong
. Конечно, как сказал @ace, Java использует целочисленное деление для оценки-1/12
, поэтому оно равно нулю.Ява
Как это устроено:
Хотел бы я опубликовать это как спойлер, но я не могу понять, как. Вот остальная часть кода, который скрытно скрыт.
источник
Нет решений Haskell, неприемлемо!
Мы можем использовать бесконечные списки Хаскелла, чтобы получить точный ответ!
Haskell:
Решение довольно простое, если принять во внимание стрелки ....
Так в чем же подвох?
источник
С
В соответствии со стандартом C это вполне можно распечатать,
Answer = -1/12
поскольку будет переполнение целых чисел со знаком, что является неопределенным поведением. Поиск компилятора, который сделает это, оставлен читателю в качестве упражнения.источник
printf
Mathematica
источник
Python 3.x
Вроде новый здесь. Какие-нибудь советы?
источник
JavaScript (ECMAScript 6)
Как это устроено:
1:
2:
3:
4:
источник
C ++
Если эти два
#define
s удалены, код все равно будет действительным кодом C ++ и фактически попытается (но, конечно, потерпит неудачу) вычислить сумму всех целых чисел.Как это устроено:
Учитывая псевдокод постеров, я не удержался, чтобы добавить этот. Он использует ту же самую основную и другую маленькую идею, но я не думаю, что это так элегантно.
Как это устроено:
И почему вы не должны пытаться запустить его:
источник