C#,174个 172 147字节
通过从raznagul的C#答案中 “借用”一些想法并将其与前n个数字的和合并来节省25个字节!
通过使用前n个数字的总和节省了2个字节,从而损失了185毫秒的精度。
class P{static void Main(){for(int i=1;;){System.Console.WriteLine(i++<731?"Not ready yet":"Eat your hot dog");System.Threading.Thread.Sleep(i);}}}
非高尔夫节目:
class P
{
static void Main()
{
for (int i=1;;)
{
System.Console.WriteLine( i++ < 731 ? "Not ready yet" : "Eat your hot dog");
System.Threading.Thread.Sleep(i);
}
}
}
说明:
由于等待的总时间被硬编码为267秒,因此可以将此数字视为前n个自然数的伸缩总和,该自然数n * (n + 1) / 2
必须等于267000毫秒。
等同于n^2 + n - 534000 = 0
。
通过求解该二阶方程n1 = 730.2532073142067
,,n2 = -n1
。当然,仅接受正解并且可以近似为730。
总时间可以计算为730 * (730 + 1) / 2 = 266815 milliseconds
。不精确度为185毫秒,人类无法察觉。该代码现在将使主(唯一)线程睡眠1毫秒,2毫秒,依此类推,直到730,因此总睡眠时间约为267秒。
更新:
程序的逻辑可以进一步简化-基本上,它需要连续显示一条消息并等待指定的时间,直到切换到第二条消息为止。
可以通过使用三元运算符检查指定时间(〜267秒)的流逝来更改该消息。
通过使用递增计数器并暂停执行线程来控制计时方面。
但是,由于计数器变量无限制地继续无限增加,因此没有任何条件可以检查其值,因此,当消息恢复为时,可能会在某个时刻出现整数溢出Not ready yet
。
通过在溢出发生时(例如i=i<1?731:i
在for
循环内部)分配大于730的正值,可以添加条件来检测和缓解问题。可悲的是,它要付出11个额外字节的代价:
class P{static void Main(){for(int i=1;;i=i<1?731:i){System.Console.Write(i++<731?"\nNot ready yet":"\nEat your hot dog");System.Threading.Thread.Sleep(i);}}}
此处的关键是使用毫秒计数值来大大延迟溢出时间。
可以根据以下sum(1..n)
公式计算直到溢出为止的时间,其中n = C#(和.NET框架)中最大的32位有符号整数值或2 ^ 31-1 = 2147483647:
2 147 483 647 * 2 147 483 648 / 2 = 2,305843008 x 10^18 milliseconds = 2,305843008 x 10^15 seconds = 26 687 997 779 days = ~73 067 755 years
在7300万年之后,系统中是否出现小故障并不重要-热狗,饥饿的OP和人类本身早已消失。
先前版本(172字节):
namespace System{class P{static void Main(){for(int i=1;i<731;){Console.Write("\nNot ready yet");Threading.Thread.Sleep(i++);}for(;;)Console.Write("\nEat your hot dog");}}}
非高尔夫节目:
namespace System
{
class P
{
static void Main()
{
for (int i = 1; i < 731; )
{
Console.Write("\nNot ready yet");
Threading.Thread.Sleep(i++);
}
for ( ; ; )
Console.Write("\nEat your hot dog");
}
}
}
先前版本(174字节):
namespace System{class P{static void Main(){for(int i=0;i++<267e3;){Console.Write("\nNot ready yet");Threading.Thread.Sleep(1);}for(;;)Console.Write("\nEat your hot dog");}}}
非高尔夫节目:
namespace System
{
class P
{
static void Main()
{
for (int i=0; i++ < 267e3; )
{
Console.Write("\nNot ready yet");
Threading.Thread.Sleep(1);
}
for ( ; ; )
Console.Write("\nEat your hot dog");
}
}
}
或者,该程序可能Not ready yet
只显示一次,等到指定的时间结束,然后Eat your hot dog
通过覆盖前一条消息来输出,同时将其缩短几个字节:
C#,145个字节
namespace System{class P{static void Main(){Console.Write("Not ready yet");Threading.Thread.Sleep(267000);Console.Write("\rEat your hot dog");}}}
非高尔夫节目:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}