C #, 174 172 147 bajtów
Zaoszczędzono 25 bajtów, „pożyczając” niektóre pomysły z odpowiedzi C # raznagul i łącząc je z sumą pierwszych n liczb!
Zaoszczędzono 2 bajty, wykorzystując sumę pierwszych n liczb lewy dla utraty precyzji 185 milisekund.
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);}}}
Program bez golfa:
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);
}
}
}
Wyjaśnienie:
Ponieważ całkowity czas oczekiwania jest ustalony na 267 sekund, można uznać tę liczbę za teleskopową sumę pierwszych n liczb naturalnych n * (n + 1) / 2
, która musi wynosić 267000 milisekund.
Jest to równoważne z n^2 + n - 534000 = 0
.
Rozwiązując to równanie drugiego zamówienia, n1 = 730.2532073142067
, n2 = -n1
. Oczywiście tylko pozytywne rozwiązanie jest akceptowane i może być przybliżone jako 730 .
Całkowity czas można obliczyć jako 730 * (730 + 1) / 2 = 266815 milliseconds
. Niedokładność wynosi 185 milisekund , niezauważalna dla ludzi. Kod sprawi teraz, że główny (i tylko) wątek śpi przez 1 milisekundę, 2 milisekundy i tak dalej do 730, więc całkowity okres uśpienia wynosi ~ 267 sekund.
Aktualizacja:
Logikę programu można jeszcze bardziej uprościć - w zasadzie musi on stale wyświetlać komunikat i czekać określony czas, aż przełączy się na drugą wiadomość.
Komunikat można zmienić za pomocą operatora trójskładnikowego, aby sprawdzić upływ określonego czasu (~ 267 sekund).
Aspekt czasowy jest kontrolowany przez użycie rosnącego licznika i wstrzymanie wątku wykonania.
Ponieważ jednak zmienna licznika nadal rośnie w nieskończoność, bez żadnych warunków sprawdzania jej wartości, można spodziewać się przepełnienia liczb całkowitych w pewnym momencie, gdy komunikat powróci do Not ready yet
.
Można dodać warunek w celu wykrycia i złagodzenia problemu poprzez przypisanie wartości dodatniej większej niż 730, gdy nastąpi przepełnienie - jak i=i<1?731:i
w for
pętli. Niestety kosztuje to 11 dodatkowych bajtów:
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);}}}
Kluczem jest tutaj użycie wartości licznika w milisekundach, aby znacznie opóźnić moment przepełnienia.
Czas do przepełnienia można obliczyć zgodnie ze sum(1..n)
wzorem, w którym n = maksymalna 32-bitowa liczba całkowita ze znakiem w języku C # (i .NET Framework) lub 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
Po 73 milionach lat może nie mieć znaczenia, czy pojawi się usterka w systemie - hot dog, głodny PO i może sama rasa ludzka już dawno minęła.
Poprzednia wersja (172 bajty):
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");}}}
Program bez golfa:
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");
}
}
}
Poprzednia wersja (174 bajtów):
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");}}}
Program bez golfa:
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");
}
}
}
Alternatywnie, program może wyświetlić Not ready yet
tylko raz, poczekać, aż upłynie określony czas, a następnie wyrejestrować Eat your hot dog
, zastępując poprzednią wiadomość, będąc krótszym o kilka bajtów:
C #, 145 bajtów
namespace System{class P{static void Main(){Console.Write("Not ready yet");Threading.Thread.Sleep(267000);Console.Write("\rEat your hot dog");}}}
Program bez golfa:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}