C # 174 172 147 bayt
Raznagul'un C # cevabından bazı fikirler "ödünç alarak" 25 bayt kaydedildi ve ilk n numaralarının toplamı ile birleştirildi!
185 milisaniye hassasiyet kaybı için ilk n sayı numarasının toplamı kullanılarak 2 bayt kaydedildi.
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);}}}
Ungolfed programı:
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);
}
}
}
Açıklama:
Toplam bekleme süresi 267 saniyede sabit olarak n * (n + 1) / 2kodlandığından, bu sayı 267000 milisaniyeye eşit olması gereken ilk n doğal sayının teleskopik bir toplamı olarak düşünülebilir .
Bu eşdeğerdir n^2 + n - 534000 = 0.
Bu ikinci dereceden denklemi çözerek, n1 = 730.2532073142067, n2 = -n1. Tabii ki, sadece pozitif çözelti kabul edilir ve 730 olarak yaklaştırılabilir .
Toplam süre olarak hesaplanabilir 730 * (730 + 1) / 2 = 266815 milliseconds. Kesinlik 185 milisaniyedir , insanlar tarafından algılanamaz. Kod şimdi ana (ve sadece) dişi 1 milisaniye, 2 milisaniye vb. Kadar 730'a kadar uyutur, böylece toplam uyku süresi ~ 267 saniyedir.
Güncelleme:
Programın mantığı daha da basitleştirilebilir - temel olarak bir mesajı sürekli olarak göstermeli ve ikinci mesaja geçene kadar belirli bir süre beklemelidir.
Mesaj, belirtilen sürenin (~ 267 saniye) geçişini kontrol etmek için üçlü bir operatör kullanılarak değiştirilebilir.
Zamanlama yönü, artan bir sayaç kullanılarak ve yürütme iş parçacığının duraklatılmasıyla kontrol edilir.
Bununla birlikte, sayaç değişkeni değerini kontrol etmek için herhangi bir koşul olmadan süresiz olarak artmaya devam ettiğinden, mesaj geri döndüğünde bir noktada tamsayı taşması beklenebilir Not ready yet.
Döngü i=i<1?731:iiçinde olduğu gibi taşma meydana geldiğinde 730'dan daha büyük bir pozitif değer atayarak sorunu tespit etmek ve azaltmak için bir koşul eklenebilir for. Ne yazık ki, 11 ek bayt maliyetiyle geliyor:
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);}}}
Buradaki anahtar , taşma anını büyük ölçüde geciktirmek için sayaç değerini milisaniye cinsinden kullanmaktır.
Taşmaya kadar geçen süre sum(1..n)aşağıdaki formüle göre hesaplanabilir , burada n = C # (ve .NET çerçevesindeki) maksimum 32-bit işaretli tam sayı değeri veya 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
73 milyon yıl sonra , sistemde bir aksaklığın ortaya çıkması önemli olmayabilir - sosisli sandviç, aç OP ve belki de insan ırkının kendisi çoktan gitti.
Önceki sürüm (172 bayt):
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");}}}
Ungolfed programı:
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");
}
}
}
Önceki sürüm (174 bayt):
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");}}}
Ungolfed programı:
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");
}
}
}
Alternatif olarak, program Not ready yetyalnızca bir kez görüntülenebilir , belirtilen süre bitene kadar bekleyebilir ve daha sonra Eat your hot dogbirkaç bayt daha kısa olurken önceki iletinin üzerine yazarak çıktı alabilir :
C #, 145 bayt
namespace System{class P{static void Main(){Console.Write("Not ready yet");Threading.Thread.Sleep(267000);Console.Write("\rEat your hot dog");}}}
Ungolfed programı:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}