C #, 174 172 147 byte
Đã lưu 25 byte bằng cách "mượn" một số ý tưởng từ câu trả lời C # của raznagul và hợp nhất chúng với tổng số n số đầu tiên lừa!
Đã lưu 2 byte bằng cách sử dụng tổng số n số đầu tiên để mất độ chính xác 185 mili giây.
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);}}}
Chương trình Ungolfed:
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);
}
}
}
Giải trình:
Vì tổng thời gian chờ đợi được mã hóa cứng ở mức 267 giây, nên người ta có thể coi con số này là tổng của kính thiên văn của n số tự nhiên đầu tiên n * (n + 1) / 2
, phải bằng 267000 mili giây.
Điều này tương đương với n^2 + n - 534000 = 0
.
Bằng cách giải phương trình bậc hai này n1 = 730.2532073142067
, n2 = -n1
. Tất nhiên, chỉ có giải pháp tích cực được chấp nhận và có thể xấp xỉ là 730 .
Tổng thời gian có thể được tính là 730 * (730 + 1) / 2 = 266815 milliseconds
. Sự không chính xác là 185 mili giây , không thể chấp nhận được đối với con người. Mã bây giờ sẽ làm cho luồng chính (và duy nhất) ngủ trong 1 mili giây, 2 mili giây và cứ như vậy lên đến 730, vì vậy tổng thời gian ngủ là ~ 267 giây.
Cập nhật:
Logic của chương trình có thể được đơn giản hóa hơn nữa - về cơ bản, nó cần liên tục hiển thị một tin nhắn và đợi một thời gian xác định cho đến khi chuyển sang tin nhắn thứ hai.
Tin nhắn có thể được thay đổi bằng cách sử dụng toán tử ternary để kiểm tra thời gian đã chỉ định (~ 267 giây).
Khía cạnh thời gian được kiểm soát bằng cách sử dụng bộ đếm tăng dần và tạm dừng luồng thực thi.
Tuy nhiên, do biến đếm tiếp tục tăng vô thời hạn mà không có bất kỳ điều kiện nào để kiểm tra giá trị của nó, nên người ta có thể mong đợi một số nguyên tràn vào một thời điểm nào đó, khi thông báo trở lại Not ready yet
.
Một điều kiện có thể được thêm vào để phát hiện và giảm thiểu vấn đề bằng cách gán giá trị dương lớn hơn 730 khi xảy ra tràn - như i=i<1?731:i
bên trong for
vòng lặp. Đáng buồn thay, nó có giá 11 byte bổ sung:
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);}}}
Chìa khóa ở đây là sử dụng giá trị truy cập bằng mili giây để trì hoãn rất nhiều thời điểm tràn.
Thời gian cho đến khi tràn có thể được tính theo sum(1..n)
công thức, trong đó n = giá trị nguyên được ký tối đa 32 bit trong C # (và khung .NET) hoặc 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
Sau 73 triệu năm , có thể không có vấn đề gì nếu một trục trặc trong hệ thống xuất hiện - hot dog, OP đói và có thể chính loài người đã biến mất từ lâu.
Phiên bản trước (172 byte):
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");}}}
Chương trình Ungolfed:
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");
}
}
}
Phiên bản trước (174 byte):
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");}}}
Chương trình Ungolfed:
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");
}
}
}
Ngoài ra, chương trình chỉ có thể hiển thị Not ready yet
một lần, đợi cho đến khi hết thời gian quy định rồi xuất ra Eat your hot dog
bằng cách ghi đè thông báo trước đó trong khi ngắn hơn một vài byte:
C #, 145 byte
namespace System{class P{static void Main(){Console.Write("Not ready yet");Threading.Thread.Sleep(267000);Console.Write("\rEat your hot dog");}}}
Chương trình Ungolfed:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}