Задача: определить x
таким образом, чтобы выражение (x == x+2)
оценивалось как истинное.
Я пометил вопрос буквой C, но ответы на других языках приветствуются, если они творческие или выделяют интересный аспект языка.
Я намерен принять решение C, но другие языки могут получить мой голос.
- Правильно - работает на стандартных реализациях. Исключение - при условии реализации основных типов, если это обычная реализация (например, при условии, что
int
это 32-битное дополнение 2), это нормально. - Просто - должно быть мало, использовать основные языковые функции.
- Интересно - это субъективно, я признаю. У меня есть несколько примеров того, что я считаю интересным, но я не хочу давать подсказки. Обновление : избегать препроцессора интересно.
- Быстрый - Первый хороший ответ будет принят.
После получения 60 ответов (я никогда не ожидал такого упоминания), возможно, было бы неплохо суммировать их.
60 ответов делятся на 7 групп, 3 из которых могут быть реализованы на C, остальные на других языках:
- Препроцессор C
#define x 2|0
было предложено, но есть много других возможностей. - Плавающая точка. Большие числа, бесконечность
или NaNвсе работают. Указатель арифметики. Указатель на огромную структуру приводит к добавлению 2 для переноса.
Остальные не работают с C:
- Перегрузка оператора - A
+
, который не добавляет, или a,==
который всегда возвращает true. - Выполнение
x
вызова функции (некоторые языки допускают это безx()
синтаксиса). Тогда он может возвращать что-то еще каждый раз. - Однобитный тип данных. Тогда
x == x+2 (mod 2)
. - Изменение
2
- какой-то язык позволяет вам назначить0
его.
math
arithmetic
c
угорен
источник
источник
4. Quick
? Ты имеешь в виду: «Кто знает, и кому посчастливилось прочитать этот вопрос первым»?add to Set
стандартную библиотеку, не переопределяя+
себя, не вписывается в эти 7 категорий, ИМХО.Ответы:
Выходы 1.
Ссылка: http://ideone.com/dL6A5
источник
float x=1./0
немного короче и, возможно, более элегантно. Но в любом случае, это, безусловно, первый хороший ответ.float x=1e20
будет достаточноФортран IV:
После этого каждая постоянная 2 в программе равна нулю. Поверьте мне, я сделал это (хорошо, 25 лет назад)
источник
Это похоже на работу:
В основном, выражение расширяется до
(2|0 == 2|(0+2))
. Это хороший пример того, почему нужно использовать скобки при определении макросов.источник
2|(0+2)
быть1
?|
это побитовое ИЛИ ;||
это логическое ИЛИ.Brainfuck
Это делает конечно растянуть «вычисляться правда» немного, потому что в Brainfuck ничего на самом деле не оценивает ни к чему - вы только манипулировать лентой. Но если вы сейчас добавите свое выражение
программа эквивалентна
(потому что все, кроме
<>+-[],.
комментария). Который ничего не делает, но увеличивает значение там, где мы сейчас находимся. Лента инициализируется со всеми нулями, поэтому мы заканчиваем с 1 на позиции курсора, что означает «истина»: если бы мы сейчас начали условную секцию с[]
, она бы вошла в / loop.источник
x
?x
поэтому здесьx
определяется какx
.need
ничего, кроме+
F #
источник
=
?==
даже не определен по умолчанию.С
Примечание: может не работать, если
FLT_EVAL_METHOD != 0
(см. Комментарии ниже).источник
INF + 2 == INF
, что в моем ответе используется одиночная точность с плавающей точкой, достаточно большая, чтобы 2 было меньше, чем один ULP.∞ + 2 = ∞
это то, что любой может понять, и он не зависит от конкретного компьютера, в то время как добавление 2 к конкретному числу и безрезультатное немного более удивительно и специфично для ограниченной точности. компьютеров и еще интереснее ИМХОFLT_EVAL_METHOD == 1
математика сделана какdouble
. Порекомендуйте большее значение FP, которое должно превышать дажеlong double
точность, как1.0e37f
C #
Не коротышка, но несколько элегантно.
http://ideone.com/x56Ul
источник
Scala:
{ val x = Set(2); (x == x + 2) }
Haskell: Определите ℤ / 2ℤ на eans
Bool
:тогда по любому
x :: Bool
у нас будетx == x + 2
.Обновление: спасибо за идеи в комментарии, я обновил экземпляр соответственно.
источник
fromInteger = odd
(+)
можно определить, как(/=)
я считаю.()
.питон
источник
__cmp__
какclass X(int):__cmp__=lambda*x:0
(или__eq__
хотя немного дольшеclass X(int):__eq__=lambda*x:True
class X:__add__=lambda s,o:s
__add__
обычно предоставляется несколько аргументов (lambda x,y:
), я сохраняю некоторые символы, используя *, чтобы упаковать все аргументы в кортеж (lambda *y:
). Смотрите документы для получения дополнительной информации.GNU C поддерживает структуры без членов и размера 0:
источник
PHP:
Или же:
Выход:
источник
Это распространенное заблуждение, что в Си пробел не имеет значения. Я не могу представить, что кто-то еще не придумал это в GNU C:
Печать
1
.источник
x == x+2
все еще ложный). Но как только вы поднимете идею, я думаю, что#define x -2*__LINE__
это более элегантно._CAT
зарезервированный идентификатор. Все, что начинается с подчеркивания и заглавной буквы, зарезервировано в C.С
Это интереснее без использования макросов и без злоупотребления бесконечностью.
Попробуйте, если не верите!
источник
0
, Нет, все еще не верю этому.??\
??\
должен быть преобразован в единый\
, поэтому нет??\
. Однако некоторые современные компиляторы по умолчанию выдают предупреждения как к триграфам, так и к конкатенациям строк, даже если они включены.Mathematica:
Я думаю, что это решение является новым, поскольку оно использует концепцию Mathematica Up Values.
РЕДАКТИРОВАТЬ:
Я расширяю свой ответ, чтобы объяснить, что означают Up Values в Mathematica .
Первая строка по существу переопределяет сложение для символа
x
. Я мог бы напрямую сохранить такое определение в глобальной функции, связанной с+
символом, но такое переопределение было бы опасным, потому что переопределение может распространяться непредсказуемо через встроенные алгоритмы Mathematica .Вместо этого, используя тег
x/:
, я связал определение с символомx
. Теперь, когда Mathematica видит символx
, он проверяет, работает ли с ним оператор сложения+
в шаблоне формы,x + 2 + ___
где символ___
означает возможную нулевую последовательность других символов.Это переопределение очень специфично и использует широкие возможности Mathematica по сопоставлению с образцом. Например, выражение
x+y+2
возвращаетx+y
, но выражениеx+3
возвращаетx+3
; потому что в первом случае шаблон может быть сопоставлен, но во втором случае шаблон не может быть сопоставлен без дополнительного упрощения.источник
Javascript:
Тестовая скрипка
источник
Infinity
, или-Infinity
, и из-за этого вы можете использовать ярлыкx = 1/0
.(99999999999999999 == 99999999999999999+2)
потому что я думаю, что это немного интереснее, чем(Infinity == Infinity+2)
, хотя, как говорит ОП, «это субъективно» :)-1
числах с плавающей запятой) проверяла свои входные данные на предмет их слишком большого значения для обратного отсчета и повторения , Сам язык был Python, но это не имеет большого значения в этом случае.false
; где бы вы ни получали эту информацию о JS, это неверно и ей нельзя доверять.схема
источник
(x == x + 2)
выглядит так же, как C, но означает совершенно другое.(= x 2)
.(define (x a b c d) #t)
:)Очевидный ответ:
Когда это заканчивается:
источник
while(!(x == x+2)) {}
было бы больше по духуВот решение для JavaScript, которое не использует
Infinity
и-Infinity
крайние случаи сложения с плавающей точкой. Это не работает ни в Internet Explorer 8 и ниже, ни в строгом режиме opt-in ES5. Я бы не назвал этоwith
утверждение и получателей особенно «продвинутыми» функциями.Отредактировано, чтобы добавить: вышеупомянутый трюк также возможен без использования
with
иget
, как отметил Энди E в Советы по игре в гольф на JavaScript, а также jncraton на этой странице:источник
x
вызов функции, хотя она выглядит как переменная read. Я предполагаю порядок оценки слева направо, но все в порядке, поскольку он указан в JS (в отличие от C).Следующее не соответствует стандартам C , но должно работать практически на любой 64-битной платформе:
источник
x
будет увеличиваться с шагом 2 ^ 61, поэтомуx + 8
будет равноx
.int
.int
, а неchar
.Sage:
возвращает True
Вообще для GF (2 ** n) всегда верно, что x = x + 2 для любого x
Это не ошибка или проблема с переполнением или бесконечностью, это на самом деле правильно
источник
Обыкновенный Лисп
Это довольно легко, когда
x
не должно быть реальной стоимости.источник
APL (Дьялог)
У APL даже нет бесконечности, просто поплавки недостаточно точны, чтобы определить разницу между
1.000.000.000.000.000
и1.000.000.000.000.002
. Насколько я знаю, это единственный способ сделать это в APL.источник
Perl 6
Я удивлен, что не видел это решение раньше. В любом случае, решение - что, если
x
есть0
и2
сразу?my \x
в этом примере объявляется переменная без сигил - этот вопрос задаетсяx
не в стиле Perl$x
.?? !!
Является тройным оператором.Но...
x
это несколько значений одновременно.x
равно0
и2
сразу.x + 2
равно2
и4
сразу. Итак, по логике они равны.источник
Python 2.X (с использованием переопределения (кэшированных) целых чисел)
Я заметил, что во всех ответах на python определены классы, которые переопределяют
+
оператор. Я отвечу еще более низкоуровневой демонстрацией гибкости python. (Это специфический для Python2 фрагмент)В Python целые числа хранятся более или менее таким образом в C:
То есть, структура с
size_t
,void *
иlong
объектом, в таком порядке.Как только мы используем и, следовательно, кешируем целое число, мы можем использовать
ctypes
модуль python для переопределения этого целого числа, так что он не только делаетx == x+2
, но и2 == 0
Печать
источник
Perl
использование подпрограммы с побочными эффектами для переменной пакета:
Выход:
true!
источник
sub x{}
"работает" также .. (по крайней мере, в моем 5.10.1), но я не могу понять, почему ..sub x{}
возвращает либо undef, либо пустой список, оба из которых являются числовым нулем. И х + 2 анализируется как х (+2).perl -MO=Deparse
показываетprint "true\n" if x() == x(2);
питон
Использование точности с плавающей точкой делает это очень простым.
Чтобы сделать его менее специфичным для системы, требуется дополнительный импорт
Это должно работать и на других языках. Это работает, потому что репрезентация 100000000000000000.0 и 100000000000000002.0 одинаковы для машины, потому что плавающие точки представлены внутри машины. см. http://en.wikipedia.org/wiki/IEEE_floating_point для получения дополнительной информации.
Так что это в основном будет работать на любом языке, который позволяет вам добавлять целые числа к числам с плавающей точкой, и в результате получается число с плавающей точкой.
источник
Вот решение для C ++, основанное на перегрузке операторов. Он основан на неявном преобразовании из a
enum
вint
.источник
std::boolalpha
вместо?:
.Я знаю, что это проблема кода ... но я играл в гольф. Сожалею.
Ruby - 13 символов - решение Infinity
возвращает истину
Ruby - 41 персонаж - решения для перегрузки Op
или же
источник
Если все в порядке, чтобы использовать этот вопрос немного, то я добавлю немного новой Java. Уловка, конечно, не нова, но, возможно, интересно, что это возможно в Java.
И результаты:
источник
Это решение VBScript работает аналогично моему решению JavaScript. Я не использовал препроцессор, но решение кажется тривиальным.
источник