C #, 174 172 147 ไบต์
บันทึก 25 ไบต์โดย "ยืม" แนวคิดบางอย่างจากคำตอบ C # ของ raznagulและผสานเข้ากับผลรวมของเคล็ดลับ n ตัวเลขแรก!
บันทึก 2 ไบต์โดยใช้ผลรวมของตัวเลข n ตัวแรกเพื่อหลอกให้สูญเสียความแม่นยำ 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);}}}
โปรแกรม 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);
}
}
}
คำอธิบาย:
เนื่องจากเวลาทั้งหมดที่รอรอคือ hardcoded ที่ 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
เป็น
สามารถเพิ่มเงื่อนไขเพื่อตรวจจับและบรรเทาปัญหาโดยการกำหนดค่าบวกมากกว่า 730 เมื่อเกิดการล้น - เหมือนi=i<1?731:i
ภายใน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 = ค่าจำนวนเต็มที่ลงนาม 32- บิตสูงสุดใน C # (และ. NET Framework) หรือ 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 ล้านปีมาแล้วมันอาจไม่สำคัญว่าจะมีข้อผิดพลาดเกิดขึ้นในระบบอย่างไร - ฮอทด็อกผู้หิวโหย 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");}}}
โปรแกรม 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");
}
}
}
รุ่นก่อนหน้า (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");}}}
โปรแกรม 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");
}
}
}
อีกทางหนึ่งโปรแกรมอาจแสดง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");}}}
โปรแกรม Ungolfed:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}