让我们看一个经典的循环(主体为空),它通常执行 3 次迭代:
for (int x=0; x<3; ++x);
挑战在于使其无限。
比赛已经结束,但您可以发布答案
比赛时间为2周,
Code Golf结束后开始倒计时-选择组合算法的实现
在 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
第一个(在 C++ 中)由@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 Fiddle:https
://jsfiddle.net/893f6vw8/
但是有 3 个类似的解决方案主意。答案中有更多详细信息。
结果
以 24 票获得第一名的是@soon的C /C++ 解决方案:
#define x x,y
第二名,仅落后 1 票,是@pavel的C ++ 解决方案。有趣的是,这个决定是宣布的三个决定之一。
#define int bool
-
其中常量 3 被重新定义为无穷大
PS:我提醒你聊天
类似于@Qwertiy,但也适用于 C
展开
y
初始化为零并且在循环体中不会改变,所以总是<3
C++
http://ideone.com/VwMh2z
bool 当始终为 1 或 0 时,与 3 相比时始终为真),true++ == true。
Java
Итак, чистейшее, дистиллированное зло, хуже не бывает. Хотите насолить тимлиду и вылететь с работы при следующем code review — спросите меня как! Interning + reflection = <3!
Проверка: http://ideone.com/3Q0Kzc
Что здесь происходит? Дело в том, что в Java небольшие целые константы интернируются: их значения записываются в общий кэш. При помощи рефлексии можно добраться до этого самого закешированного значения, и подменить его!
В примере кода константа 0 подменяется на -2. Не понимаю, почему, но при этом значения в цикле осциллируют между -2 и -1, цикл становится бесконечным.
Вариант
тоже загоняет программу в бесконечный цикл (http://ideone.com/WD3qw7), значения меняются как 0, 1, 2, -1, 0, 1, 2, -1, ...
Наверное, самое чистое решение (если вообще можно назвать этот код хоть в каком-то смысле чистым) — подменить 3 на
Integer.MIN_VALUE
Тогда при сравнении нужное неравенство не сможет выполниться никогда: http://ideone.com/VxIVT7
Perl,如果 3 应该是无穷大,那就这样吧!
让我们以常量“3”被认为是无穷大的方式重载定义常量的方法。让任何其他常量代表它们自己。
测试ideone(循环内人为引入限制,使网站不会挂)
C89及以上
意念
C99及以上
意念
第一个解决方案 (C89) 几乎在任何地方都可以通过任务的循环工作,第二个 (C99) 可以在稍微少一些的实现上工作,但绝对可以实现无限。
C#
替换数据结构使用
default
:检查:http: //ideone.com/2evCtl
这个想法是改变数据结构。用名称创建自己的结构是不可能的
int
,它int
只是 的别名,但可以在嵌套名称空间System.Int32
中创建具有名称的结构。Int32
System
如果在内部命名空间中定义了这样的数据结构,则将使用它而不是全局的
System.Int32
。旧版:
验证:干净的代码,增强的代码。
这个想法被移植到 C++,尽管实现是不可移植的,因为标准不允许
#define
关键字:int
在 MSVC 2015 下工作,可能不适用于其他编译器。
电源外壳:
或者
C++ 但不是 C
http://ideone.com/2m4FCy
PS:本答案是在比赛创建后创建的,所以发布时间不晚。它与上面公布的专业人士的答案完全不同。
C#
Ещё одна идея состоит в том, что ключевое слово
var
— контекстное, а значит, его можно переопределить. Поехали!Проверка: http://ideone.com/L6H7b7
脚本:
让我们借此机会重写setter: