Давайте рассмотрим типичный цикл, который обычно выполняет 8 итераций:
for (int x=0; x<8; ++x);
Вы должны сделать это бесконечным!
Это конкурс популярности для всех языков, которые поддерживают такую форму for
цикла. Таким образом, решение с наивысшим баллом (положительные отзывы минус отрицательные) побеждает.
Если у вашего языка есть другая форма for
цикла, но вы уверены, что вы можете сделать что-то классное с ним, не стесняйтесь опубликовать ответ и пометить его как неконкурентный. Я оставляю за собой право увеличивать объем доступных конструкций и языков, но он никогда не будет сокращен, так что не бойтесь отбрасывать ранее правильные решения.
Что такое решение?
Решение состоит из двух программ.
Первая программа - это чистая программа. Это типичная программа на вашем языке с for
циклом из 8 итераций. Это должна быть нормальная программа, написать любой разработчик. Никаких специальных взломов для целей подготовки. Например:
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Вторая программа дополнена. Эта программа должна содержать весь код из чистой программы и некоторый дополнительный код. Количество точек расширения ограничено , подробности см. В полном разделе правил. Дополненная программа для чистой выше может быть
inline bool operator < (const int &a, const int &b)
{
return true;
}
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Это просто пример (не компилируемый в C ++), чтобы показать идею. Настоящая правильная дополненная программа должна быть компилируемой, работающей и имеющей бесконечный цикл.
Полные правила
Обе программы:
- Любой язык с поддержкой таких
for
циклов в порядке. - Тело цикла должно быть пустым. Точнее, вы можете поместить некоторый вывод или другой код в цикл, но поведение цикла должно быть таким же в случае пустого цикла.
Чистая программа:
Цикл использует целочисленный или числовой счетчик и выполняет 8 итераций:
for (int x=0; x<8; ++x); // C, C++, C# for (var x=0; x<8; ++x); // C#, Javascript for (auto x=0; x<8; ++x); // C, C++ for (auto signed x=0; x<8; ++x); // C, C++ for (register int x=0; x<8; ++x); // C, C++
Пользовательские типы запрещены.
- Использование свойства (кроме глобальной переменной) вместо переменной цикла запрещено.
Объявление переменной может быть внутри или снаружи цикла. Следующий код в порядке:
int x; for(x=0; x<8; ++x);
Можно использовать префикс или постфиксный инкремент.
Предел цикла
8
должен быть записан как константный литерал без сохранения в именованную константу или переменную. Это сделано для предотвращения решений, основанных на объявлении переменной или константы равной 8, а затем переназначении, переопределении или дублировании ее другим значением:const double n = 8; int main() { const double n = 9007199254740992; for (double x=0; x<n; ++x); return 0; }
Дополненная программа:
- Должен содержать весь код из чистого.
- Следует расширить чистую программу в ограниченном количестве точек расширения.
- Должен выполнять тот же
for
цикл, что и сам бесконечный цикл.
Размещение цикла в другой бесконечной конструкции не нормально. - Исправление кода во время выполнения или во время компиляции допускается, если его текстовое представление не изменяется.
- Размещение конструкции в виде строки и переход к ней
eval
запрещен.
Точки расширения:
- Везде за пределами фрагмента с чистым кодом, включая другие файлы или другие сборки.
for
Выписка (как единое целое -for
конструкция и ее тело) должны быть оставлены без изменений.- Объявление переменной должно быть одинаковым.
- Любое место между простыми утверждениями может быть использовано в качестве точки расширения.
- Если и только если переменная была объявлена вне цикла и без немедленного присвоения значения, такое присваивание может быть добавлено.
/* extension point here */
int main()
/* extension point here */
{
/* extension point here */
int x /* extension point for assignment here */;
/* extension point here */
for (x=0; x<8; ++x);
/* extension point here */
return 0;
/* extension point here */
}
/* extension point here */
int main()
{
/* BEGIN: No changes allowed */ int x = 0; /* END */
/* extension point here */
/* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
return 0;
}
PS: Если возможно, предоставьте ссылку на онлайн IDE.
java.lang.Integer
? 2. Это было бы лучше при правильном критерии выигрыша.Ответы:
python3
Чистая программа:
Это просто стандартный цикл обратного отсчета.
Дополненная программа:
Он использует кэш INT для переназначения
8
в9
которых эффективно не делаетn -= 1
пустую операцию, так как,9-1 = 8
который просто устанавливаетn
обратно9
снова, вызывая бесконечный цикл.Вы можете увидеть кэш ИНТ в действии онлайн здесь (хотя , очевидно , не бесконечный цикл ПОТОМУ его онлайн).
источник
8
для9
Python 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
Python 3
Чистая программа:
Стандартный способ сделать что-то 8 раз в Python:
Дополненная программа:
Однако, если мы переопределим функцию генератора диапазона, чтобы бесконечно выдавать 1, она станет бесконечным циклом ...
Мы можем пойти дальше и создать генераторную функцию, которая, вместо бесконечного результата 1, будет иметь значение вечно:
Тест на repl.it
источник
Perl
чистый
Дополненная
Ideone .
источник
$i
чтобы стать псевдонимом для специальной переменной, которая может содержать только логические значения, поэтому, когда он достигает 1, он становится невосприимчивым к приращению.ES5 + (Javascript)
РЕДАКТИРОВАТЬ : Удалено явное объявление переменной, так как в противном случае она была поднята, и было создано неконфигурируемое свойство window.x (если не запускается построчно в консоли REPL).
Объяснение:
Использует тот факт, что любая переменная в глобальном масштабе также является свойством объекта окна и переопределяет свойство «window.x», чтобы иметь постоянное значение 1.
чистый
Дополненная
ПРИМЕЧАНИЕ . Чтобы это работало в Node.js, просто замените «window» на «global» (протестировано в Node.js 6.8.0).
источник
var
в Crome. Но вы можете удалитьvar
из обеих программ - все будет хорошо.var
подъемах, поэтому на момент его использованияdefineProperty
уже выезд. Но если вы поместите эти 2 строки в разные сценарии (кстати, это разрешено), это сработает, так как сначала будет создано свойство, аvar
затем будет проигнорировано. Доказательство: i.stack.imgur.com/lSwbE.pngС
Чистая программа
Дополненная программа
источник
Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
Джава
Чистая программа:
Дополненная программа:
Устанавливает Integer в кеше Integer, который должен содержать от 1 до 0, фактически заставляя
i++
ничего не делать (он устанавливаетi
кешированное Integer, которое должно содержать 1, но поскольку это Integer фактически содержит 0, ничего не меняется).источник
int
а не относительно тяжелый весInteger
.C ++
bool
может быть только 0 или 1. Вдохновлен Perl-ответом primo .источник
Python 3 (3.5.0)
Чистая программа:
Дополненная
Это решение отличается от других написанных на Python тем, что фактически изменяет исходный код на лету. Все содержимое цикла for можно изменить на любой нужный код.
Код меняет второй или последний код операции, чтобы быть
113
или более читабельным -JUMP_ABSOLUTE
. Он изменяет операнд на160
- инструкцию, с которой начинается цикл for, фактически создавая оператор GOTO в конце программы.Расширенная программа печатает числа
0..7
бесконечно много раз без переполнения стека или чего-либо подобного.источник
PHP
Я думаю, что это следует правилам точки расширения; Я не совсем ясен в пункте 4. Это очень похоже на perl-ответ @ primo, поэтому я думаю, что он имеет значение.
чистый
Дополненная
PHP позволяет увеличивать определенные строки, например, так:
Все эти строки оцениваются в 0, так что это будет зацикливаться практически вечно (за исключением того, что не хватает памяти).
источник
Perl
Чистый код
Дополненный код
Большинство переменных Perl являются просто переменными. Тем не менее, язык также имеет
tie
функцию, которая позволяет эффективно задавать переменные геттеры и сеттеры. В этой программе я превращаю основной пакет (имя которого является пустой строкой) в эквивалент класса из объектно-ориентированного языка, в то же время имея программу. Это позволяет мне привязатьfor
счетчик цикла к самой программе. РеализацияTIESCALAR
позволяетtie
добиться успеха; Возвращаемое значениеTIESCALAR
предназначено для ссылки на любое внутреннее состояние, которое нам нужно хранить, связанное с переменной, но, поскольку оно нам не нужно, мы возвращаем пустую ссылку на массив в качестве заполнителя. Затем мы даем простейшие возможные реализации методов получения и установки; ни один из них ничего не делает, поэтому пытается назначить$x
не имеют никакого эффекта, и попытки прочитать его всегда возвращаютсяundef
, что численно меньше 8.источник
WinDbg
чистый
Дополненная
Этот подход создает псевдоним для
<
as|
, поэтому, когда<
он встречается в коде, псевдоним расширяется до|
и побитового или делается вместо меньше чем. В WinDbg все ненулевые значения верны, поэтомуanything | 8
всегда верны.Примечание.
.block
Фактически не нужно, еслиaS
и.for
фактически введены в виде двух разных строк, как показано здесь, это требуется только тогда, когдаaS
и.for
находятся в одной строке.источник
Mathematica
чистый
Дополненная
источник
Обыкновенный Лисп
Чистый код
Дополненная
Макрос с именем
keyword:dotimes
aka:dotimes
(см. 11.1.2.3 Пакет KEYWORD ), который расширяется как бесконечный цикл. Вdefmacro
макрокоманда возвращает имя макроса определяется, который может быть поданshadowing-import
. Таким образом, эти новыеdotimes
символы затеняют стандартный (который не должен быть переопределен или лексически связан с другим макросом в переносимых программах).Дополненная (2)
Когда мы читаем символ 8, мы заменяем его на
(loop)
. Это означает, что вышеизложенное читается как(dotimes (i (loop)))
и поэтому код никогда не завершает вычисление верхней границы. Это влияет на все 8 случаев, а не только на один в цикле. Другими словами, 8 действительно означает бесконечность. Если вам интересно, когда читаемая таблица изменяется, как описано выше, то символ 8 становится «завершающим» и отсоединяется от других читаемых в данный момент чисел / символов:... читается как:
Вы можете запустить тесты на Ideone: https://ideone.com/sR3AiU .
источник
Рубин
чистый
Такого рода цикл for не очень часто используется в Ruby, но типичное руководство покажет вам, как это сделать:
Дополненная
Цикл for просто вызывает
(1..8).each
данный блок кода, поэтому мы изменим этот метод:источник
Haskell
Чистая версия:
Дополненная версия:
Это довольно простой, на самом деле: мы просто определить наш собственный тип
T
такой , что егоenumFromTo
экземпляр является бесконечная последовательность, то использовать тип по умолчанию это так , что значения ип-типа аннотированный0
и8
принимаются в качестве типаT
.источник
///
В
for
/// нет явных циклов, но их можно смоделировать (в конце концов, они завершаются).Чистота:
Дополненная:
В чем дело?
В то время как первая программа ведет отсчет от 8 до 0,
/0/0/
правило последней будет заменено0
на0
вечность.источник
/0/1//1/2/.../7/8//8/8/8
подсчета.Javascript ES6
Хорошо, вот версия, которая работает с использованием ES6 для ... конструкции цикла. Я даже дам вам чистый массив, чтобы мы были уверены, что нет ничего смешного:
чистый
Конечно, это не мешает кому-то возиться с прототипом Array ...
Дополненная
Это работает путем перезаписи итератора по умолчанию, чтобы он никогда не завершался, поэтому все блокируется в бесконечный цикл. Код даже не имеет возможности запустить материал внутри цикла.
источник
var
в цикле.C ++
Использует 2 точки расширения:
Чистая программа такая же, как в описании.
источник
Brainfuck
Я печатаю «0» на каждой итерации, чтобы было проще считать итерации. Но любой код может быть вставлен туда без изменения работы цикла.
чистый
Попробуйте онлайн
Дополненная версия опирается на общую реализацию Brainfuck с 8-битными ячейками. В этих реализациях «приращение» фактически является «приращением (мод 256)». Таким образом, чтобы найти цикл, который будет повторяться ровно 8 раз в чистой версии и бесконечно в расширенной версии, мы можем просто найти решение для следующей системы неравенств.
В этом случае мы допустим a = 128, b = 16 и c = 1. Очевидно, что 128 + 16 * 8 = 256 (и 256 (mod 256) = 0) и 128> 0, а поскольку b четно, c + a + b * n нечетно для любого нечетного a + c, и, таким образом, никогда не будет четным кратным 256 в таких случаях. Мы выбираем c = 1 для простоты. Таким образом, единственное изменение, которое нам нужно, это одиночное
+
начало программы.Дополненная
Попробуйте онлайн
Я оставляю это на OP, чтобы определить, конкурирует ли эта запись. У Brainfuck нет явного цикла for, но форма цикла, которую я использовал, настолько близка, насколько это возможно.
++++++++
также максимально приближен к литералу8
; Я включил довольно много из них.Чистая версия почти наверняка представляет собой типичную программу, написанную на этом языке, так как даже самый короткий известный Brainfuck Hello World зависит от модульного рекуррентного отношения к работе.
источник
Haskell
чистый
Дополненная
Заменяет обычный оператор приложения функции оператором,
$
который повторяет цикл снова каждый раз, когда завершается. Запуск чистой версии печатает от 0 до 8, а затем останавливается; расширенная версия печатает от 0 до 8, затем снова от 0 до 8 и так далее.Я немного обманываю, так как
forM_ [0..8] $ \i -> print i
это не обязательно самый «чистый» способ написать этот цикл в Haskell; многие Haskellers будут сокращать тело цикла, чтобы получить,forM_ [0..8] print
и тогда нет$
необходимости переопределять. В свою защиту я скопировал чистый код из ответа Кактуса , который не нуждался в этом свойстве, поэтому, по крайней мере, один программист на Haskell написал этот код без какой-либо мотивации без необходимости добавлять$
!источник
C ++
Давайте
x
оценим до 7. Не работает в C, потому что требует lvalue при присваивании и приращении.источник
Nim
Идиоматическая версия, использующая
countup
:чистый
Дополненная
Простой и очень похож на ответ Python, который переопределяет
range
. Мы переопределяемcountup
, идиоматический способ Nim итерации от одного int (включительно) к другому, чтобы дать 8s бесконечно.Более интересная версия, используя оператор диапазона
..
:чистый
Дополненная
Очень похоже на предыдущее решение, за исключением того, что мы переопределяем оператор диапазона
..
, который обычно дает массив[1, 2, 3, 4, 5, 6, 7, 8]
, для итератора ранее.источник
GolfScript
чистый
Дополненная
Назначает функцию, возвращающую n + 1 переменной 8
источник
TCL
Обычный:
Дополненная:
Идея состоит в том, чтобы переопределить
incr
команду, которая используется для увеличения переменнойi
, чтобы фактически не увеличивать!Можно проверить на: http://rextester.com/live/QSKZPQ49822
источник
Сборка x86_64
Чистая программа:
Тип цикла, который будет использовать любой программист на ассемблере, с последующим системным вызовом exit, чтобы не допустить последующего добавления
jmp loop_start
инструкции.Дополненная программа:
Кроме того, извините, если это плохо, что чистая программа не имеет точки входа или
section .text
источник
JavaScript
Чистота:
Дополненная:
источник
C ++
Чистая программа
Хороший, нормальный цикл, повторяющийся от чисел от 0 до 7.
Дополненная программа
Препроцессор C ++ - довольно опасная особенность ...
Единственная строка, которую мы должны были добавить, была
#define short bool
. Это делаетi
логическое значение вместо короткого целого числа, и поэтому оператор приращения (i++
) ничего не делает после того, какi
достигнет 1. Выходные данные выглядят так:источник