首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8应该成为无限

8应该成为无限
EN

Code Golf用户
提问于 2016-11-21 20:59:42
回答 19查看 2K关注 0票数 20

让我们来看看一个典型的循环,它通常执行8次迭代:

代码语言:javascript
复制
for (int x=0; x<8; ++x);

你得让它无限!

它是一个人气-竞赛,适用于所有支持这种形式的for循环的语言。因此,得分最高的解决方案(升票减去下票数)获胜。

如果您的语言有另一种形式的for循环,但您确定,您可以做一些酷,随时张贴答案,并将其标记为非竞争性。我保留扩大可用结构和语言的范围的权利,但是它永远不会缩小,所以不要害怕放弃以前正确的解决方案。

什么是解决方案?

解决方案由两个程序组成。

第一个程序是一个干净的程序。这是您的语言中典型的程序,使用for循环进行8次迭代。这应该是正常的程序,任何开发人员都可以编写。没有任何特殊的黑客为准备目的。例如:

代码语言:javascript
复制
int main() 
{
  for (int x=0; x<8; ++x);
  return 0;
}

第二个程序是增强的。这个程序应该包含清洁程序的所有代码和一些额外的代码。扩展点的数量有限,有关详细信息,请参阅完整的规则部分。上面清洁的扩展程序可以是

代码语言:javascript
复制
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 (自动签名x=0;x<8;++x);// C,C++ (注册int x=0;C++;);// C,
  • 不允许用户定义的类型。
  • 不允许使用属性(全局变量除外)代替循环变量。
  • 变量的声明可以在循环的内部或外部。以下代码是ok的: int;for(x=0;x<8;++x);
  • 可以使用前缀或后缀增量。
  • 循环限制8应该编写为常量文本,而不保存到指定的常量或变量。它的目的是防止基于声明变量或常数等于8的解决方案,然后重分配、重写或用其他值隐藏它: const double n= 8;int main() { const double n= 9007199254740992;for (double x=0;x

增广程序:

  • 必须包含干净代码中的所有代码。
  • 应该在有限的扩展点上扩展干净的程序。
  • 必须执行与无限循环相同的for循环,itself.将循环放置到另一个无限构造中是不行的。
  • 只要代码的文本表示形式不变,就允许对代码进行运行时或编译时修补。
  • 不允许将构造放入字符串并传递给eval

扩展点:

  • 具有干净代码的片段以外的任何地方,包括其他文件或其他程序集。
  • for语句(作为单件- for构造及其正文)必须保持不变。
  • 变量声明必须保持不变。
  • 简单语句之间的任何位置都可以用作扩展点。
  • 当且仅当变量在循环之外声明,并且没有立即赋值,则可以添加此赋值。
代码语言:javascript
复制
/* 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 */
代码语言:javascript
复制
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的链接。

EN

回答 19

Code Golf用户

发布于 2016-11-21 22:07:36

Python3

清洁计划:

这只是一个标准的倒计时循环。

代码语言:javascript
复制
n = 8
while n != 0:
  n -= 1
print("done")

增广程序:

代码语言:javascript
复制
import ctypes

ctypes.cast(id(8), ctypes.POINTER(ctypes.c_int))[6] = 9

n = 8
while n != 0:
  n -= 1
print("done")

它使用int缓存将8重新定义为9,这实际上使n -= 1成为无操作,因为9-1 = 8只会再次将n设置为9,从而导致无限循环。

您可以在联机这里中看到int缓存(虽然显然没有无限循环,因为它是在线的)。

票数 32
EN

Code Golf用户

发布于 2016-11-21 21:56:55

Python 3

清洁计划:

在python中执行8次的标准方法是:

代码语言:javascript
复制
for i in range(8): 
    # Do something
    pass

增广程序:

但是,如果我们将范围生成器函数覆盖为无限产生1,它就变成了一个无限循环.

代码语言:javascript
复制
def range(x):
    while 1: yield 1

for i in range(8):
    # Infinite loop
    pass

我们可以更进一步,创建一个生成器函数,它不是无限地产生1,而是永远计算在内:

代码语言:javascript
复制
def range(x):
    i = 0
    while 1: yield i; i+=1

for i in range(8):
    # Counting from 0 to infinity
    pass

repl.it测试

票数 22
EN

Code Golf用户

发布于 2016-11-21 21:18:15

ES5+ (Javascript)

编辑:删除显式变量声明,否则它将被吊起并创建一个不可配置的window.x属性(除非在REPL控制台中逐行运行)。

解释:

利用以下事实:任何全局作用域变量也是window对象的属性,并将"window.x“属性重新定义为常值为1。

清洁

代码语言:javascript
复制
for(x=0; x<8; x+=1) console.log(x);

增广

代码语言:javascript
复制
Object.defineProperty(window,'x',{value:1});
for(x=0; x<8; x+=1) console.log(x);

注意:要在Node.js中完成这项工作,只需将“窗口”替换为“全局”(在Node.js 6.8.0中测试)

票数 10
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/100663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档