C #, 174 172 147 байт
Збережено 25 байтів, "запозичивши" деякі ідеї з відповіді C # рознагулу та об'єднавши їх із сумою трюку перших 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);}}}
Програма без вогню:
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
.
Може бути додана умова для виявлення та пом’якшення проблеми шляхом призначення позитивного значення, що перевищує 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 мільйони років це може не мати значення, якщо з’явиться збій у системі - хот-дог, голодний ОП та, можливо, сама раса людини вже давно пішла.
Попередня версія (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");
}
}
}