Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

И станет 3 бесконечностью

Посмотрим на классический цикл (с пустым телом), который обычно выполняет 3 итерации:
for (int x=0; x<3; ++x);
Задача заключается в том, чтобы сделать его бесконечным.

Соревнование завершено, но ответы публиковать можно
Длительность соревнования 2 недели, начало отсчёта после окончания Код-гольф - Реализация алгоритма выборки комбинаций
Опубликовал это соревнование на codegolf'е.
При оформлении ответа рекомендуется язык делать заголовком (# в начале строки).
Оценка
Побеждает ответ с наибольшим рейтингом. Один участник может публиковать любое число ответов, если их идея или язык различаются.
Голосующих просьба учесть, что система SO откатит 3 и более минуса, поставленные одному участнику (но не 3 плюса). Больше 3 плюсов одному участнику за день ставить тоже не стоит. Лучше вернитесь завтра и доставьте :)
Решения, нарушающие условия помечаются внеконкурсными с описанием, какое требование они нарушают. Они могут быть по-своему интересны, поэтому удалять их не обязательно.
Подробные условия
Можно использовать любой язык в котором поддерживается подобная форма циклов. В чистой программе на этом языке тип данных должен раскрываться в целочисленный или числовой (если в языке поддерживается типизация), а цикл выполняться 3 раза. Использование пользовательских типов недопустимо.
for (int x=0; x<3; ++x); // C, C++, C# for (var x=0; x<3; ++x); // C#, Javascript for (auto x=0; x<3; ++x); // C, C++ for (auto signed x=0; x<3; ++x); // C, C++ for (register int x=0; x<3; ++x); // C, C++ В дополненной программе цикл должен быть бесконечным, а все ограничения кроме сохранения этого фрагмента кода снимаются. Участок с циклом должен быть одинаковым в чистой и дополненных программах. for должен остаться циклом. Более того, он должен сам стать бесконечным. Просто обернуть его во внешний бесконечный цикл нельзя. Тело цикла не должно менять значение переменной. Программа должна работать аналогичным образом с пустым телом цикла.

Кстати, есть 3 мои решения (на C#, C++ и Javascript), использующие совершенно разные подходы. Если никто не предложит такие варианты в течение недели с момента начала отсчёта, я их опубликую. А пока только это:
oCrfu6vbxewj8k8eMw9TDog83T
Первое (на Си++) нашёл @pavel: https://ru.stackoverflow.com/a/587588/178988 Моя версия: http://ideone.com/xgTeCr
Второе (на C#) нашёл @VladD: https://ru.stackoverflow.com/a/587673/178988 Моя версия: http://ideone.com/8bkwoD
Третье (на JS) не написали, публикую: https://ru.stackoverflow.com/a/593174/178988 Фиддл: https://jsfiddle.net/893f6vw8/ Но есть 3 решения с похожей идеей. Подробнее в ответе.

Результаты
Первое место с 24 голосами занимает решение пользователя @soon на Си/Си++:
#define x x,y Второе место с отставанием всего в 1 голос занимает решение пользователя @pavel на Си++. Интересно, что это решение было одним из трёх анонсированных.
#define int bool Третье место с 20 голосами получает решение пользователя @Mike на Перле
в котором константа 3 переопределяется значением бесконечнось

PS: Напоминаю про чат


Ответ

По аналогии с @Qwertiy, но работает еще и в Си
#define x x,y
int main() { for (int x=0; x<3; ++x); return 0; }
Развернется в
int main(void) { for (int x,y=0; x,y<3; ++x,y); return 0; }
y инициализируется нулем и не меняется в теле цикла, поэтому всегда <3

Комментариев нет:

Отправить комментарий