RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 587282
Accepted
Qwertiy
Qwertiy
Asked:2020-11-06 07:15:57 +0000 UTC2020-11-06 07:15:57 +0000 UTC 2020-11-06 07:15:57 +0000 UTC

并变成3个无穷大

  • 772

让我们看一个经典的循环(主体为空),它通常执行 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

  • 获得 20 票的第三名获得@Mike对Perl的决定

    其中常量 3 被重新定义为无穷大


PS:我提醒你聊天

любой-язык
  • 26 26 个回答
  • 10 Views

26 个回答

  • Voted
  1. Best Answer
    awesoon
    2020-11-07T00:34:58Z2020-11-07T00:34:58Z

    类似于@Qwertiy,但也适用于 C

    #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

    • 46
  2. pavel
    2020-11-07T02:14:14Z2020-11-07T02:14:14Z

    C++

    int main()
    {
        #define int bool
        for (int x=0; x<3; ++x);
    
        return 0;
    }
    

    http://ideone.com/VwMh2z

    bool 当始终为 1 或 0 时,与 3 相比时始终为真),true++ == true。

    • 34
  3. VladD
    2020-11-07T07:00:36Z2020-11-07T07:00:36Z

    Java

    Итак, чистейшее, дистиллированное зло, хуже не бывает. Хотите насолить тимлиду и вылететь с работы при следующем code review — спросите меня как! Interning + reflection = <3!

    import java.lang.reflect.*;
    
    class Golf
    {
        public static void main(String[] args) throws java.lang.Exception
        {
            Field value = Integer.class.getDeclaredField("value");      
            value.setAccessible(true);
            Integer victim = 0;
            value.setInt(victim, -2);
    
            for (Integer x = 0; x < 3; x++)
                System.out.println(x);
        }
    }
    

    Проверка: http://ideone.com/3Q0Kzc


    Что здесь происходит? Дело в том, что в Java небольшие целые константы интернируются: их значения записываются в общий кэш. При помощи рефлексии можно добраться до этого самого закешированного значения, и подменить его!

    В примере кода константа 0 подменяется на -2. Не понимаю, почему, но при этом значения в цикле осциллируют между -2 и -1, цикл становится бесконечным.


    Вариант

    Integer victim = 3;
    value.setInt(victim, -1);
    

    тоже загоняет программу в бесконечный цикл (http://ideone.com/WD3qw7), значения меняются как 0, 1, 2, -1, 0, 1, 2, -1, ...


    Наверное, самое чистое решение (если вообще можно назвать этот код хоть в каком-то смысле чистым) — подменить 3 на Integer.MIN_VALUE

    Integer victim = 3;
    value.setInt(victim, Integer.MIN_VALUE);
    

    Тогда при сравнении нужное неравенство не сможет выполниться никогда: http://ideone.com/VxIVT7

    • 33
  4. Mike
    2020-11-06T19:44:11Z2020-11-06T19:44:11Z

    Perl,如果 3 应该是无穷大,那就这样吧!

    让我们以常量“3”被认为是无穷大的方式重载定义常量的方法。让任何其他常量代表它们自己。

    use overload;
    BEGIN {
     overload::constant ( integer => sub {
      return inf if($_[1]==3);
      $_[1];
     } );
    }
    
    for ($x=0; $x<3; ++$x);
    

    测试ideone(循环内人为引入限制,使网站不会挂)

    • 28
  5. user182055
    2020-11-06T11:56:51Z2020-11-06T11:56:51Z

    C89及以上

    意念

    #define for(unused) for(;;)
    
    int main() {
      int x;
      for (x = 0; x < 3; ++x);
    }
    

    C99及以上

    意念

    #define for(...) for(;;)
    
    int main(void) {
        for (int x = 0; x < 3; ++x);
    }
    

    第一个解决方案 (C89) 几乎在任何地方都可以通过任务的循环工作,第二个 (C99) 可以在稍微少一些的实现上工作,但绝对可以实现无限。

    • 22
  6. VladD
    2020-11-06T07:38:12Z2020-11-06T07:38:12Z

    C#

    替换数据结构使用default:

    using System;
    
    // если убрать эту структуру, цикл станет конечным
    struct Int32
    {
        public static implicit operator Int32(int i) => new Int32();
        public static implicit operator int(Int32 x) => 0;
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            for (var x = default(Int32); x < 3; ++x)
                Console.WriteLine("iteration");
        }
    }
    

    检查:http: //ideone.com/2evCtl


    这个想法是改变数据结构。用名称创建自己的结构是不可能的int,它int只是 的别名,但可以在嵌套名称空间System.Int32中创建具有名称的结构。Int32System

    如果在内部命名空间中定义了这样的数据结构,则将使用它而不是全局的System.Int32。


    旧版:

    namespace Golf
    {
        // если убрать это пространство имён с содержимым, цикл станет конечным
        namespace System
        {
            struct Int32
            {
                static public bool operator < (Int32 x, int y) { return true; }
                static public bool operator > (Int32 x, int y) { return false; }
                static public Int32 operator ++ (Int32 z) { return z; }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                for (var x = default(System.Int32); x < 3; ++x)
                    global::System.Console.WriteLine("итерация");
            }
        }
    }
    

    验证:干净的代码,增强的代码。


    这个想法被移植到 C++,尽管实现是不可移植的,因为标准不允许#define关键字:int

    #include <iostream>
    
    struct INT
    {
        INT(int i) { }
        bool operator < (int i) { return true; }
        INT operator++(int dummy) { return *this; }
    };
    
    int main(int argc, char *argv[])
    {
    // если это убрать, цикл станет конечным
    #define int INT
        for (int i = 0; i < 3; i++)
            std::cout << "iteration" << std::endl;
    }
    

    在 MSVC 2015 下工作,可能不适用于其他编译器。

    • 19
  7. user181245
    2020-11-07T00:16:15Z2020-11-07T00:16:15Z

    电源外壳:

    class AlwaysZeroAttribute : System.Management.Automation.ArgumentTransformationAttribute {
        [object] Transform([System.Management.Automation.EngineIntrinsics] $engineIntrinsics, [object] $inputData) { return 0 }
    }
    [AlwaysZero()]$x=0
    
    for($x = 0; $x -lt 3; ++$x) { }
    

    或者

    Set-PSBreakpoint -Variable x -Mode Write -Action {([ref]$x).Value=0}
    
    for($x = 0; $x -lt 3; ++$x) { }
    
    • 18
  8. Qwertiy
    2020-11-06T18:12:01Z2020-11-06T18:12:01Z

    C++ 但不是 C

    http://ideone.com/2m4FCy

    int main()
    {
        int y;
        #define x x=y
    
        for (int x=0; x<3; ++x);
    
        return 0;
    }
    

    PS:本答案是在比赛创建后创建的,所以发布时间不晚。它与上面公布的专业人士的答案完全不同。

    • 16
  9. VladD
    2020-11-07T06:16:38Z2020-11-07T06:16:38Z

    C#

    Ещё одна идея состоит в том, что ключевое слово var — контекстное, а значит, его можно переопределить. Поехали!

    // если убрать эту структуру, цикл завершается
    struct var
    {
        public static implicit operator var(int i) => new var();
        public static implicit operator int(var x) => 0;
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            for (var x = 0; x < 3; ++x)
                Console.WriteLine("iteration");
        }
    }
    

    Проверка: http://ideone.com/L6H7b7

    • 16
  10. user207618
    2020-11-06T12:54:46Z2020-11-06T12:54:46Z

    脚本:

    让我们借此机会重写setter:

    (function() {
      "use strict";
      // Обычный тест
      Object.defineProperty(window, 'x', {
        get: _ => window._value,
        set: n => window._value = n
      }) && (window._value = 0);
    
      for (x = 0; x < 3; x++)
        console.info(x);
    }());

    // Бесконечность — не предел! © Базз Лайтер
    
    // ВНИМАНИЕ: Запуск этого сниппета убьёт эту вкладку или даже браузер
    // Запускать с диспетчером вкладок на руках
    Object.defineProperty(window, 'x', {
      get: _ => this._value,
      set: n => this._value = 0
    }) && (window._value = 0);
    
    for(x = 0; x < 3; x++)
      console.info(x);

    • 15

相关问题

  • 为什么库源中有这么多行代码?

  • 为什么在这么多示例中函数都称为 foo?

  • 为什么在许多语言中索引从 0 开始?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5