C#、174 172 147バイト
raznagulのC#の回答からいくつかのアイデアを「借りて」、最初のn個の数字の合計とそれらをマージすることで25バイトを節約しました。
最初のn個の数字の合計を使用して、185ミリ秒の精度を失うことで2バイトを節約しました。
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ミリ秒であり、人間には感知されません。このコードにより、メイン(そして唯一の)スレッドが最大730ミリ秒、2ミリ秒などでスリープするようになり、合計スリープ期間は約267秒になります。
更新:
プログラムのロジックはさらに簡素化できます。基本的に、メッセージを継続的に表示し、2番目のメッセージに切り替わるまで指定された時間待機する必要があります。
メッセージは、指定された時間(約267秒)の経過をチェックする三項演算子を使用して変更できます。
タイミングの側面は、増加するカウンターを使用して実行スレッドを一時停止することにより制御されます。
ただし、カウンタ変数はその値をチェックする条件がなくても無限に増加し続けるため、メッセージが次の状態に戻ると、ある時点で整数オーバーフローが予想されます。 Not ready yet
。
ループi=i<1?731:i
内のように、オーバーフローが発生したときに730より大きい正の値を割り当てることにより、問題を検出および軽減するための条件を追加できfor
ます。悲しいことに、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
1回だけ表示し、指定した時間が経過するまで待機してから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");
}
}
}