C #, 174 172 147 Bytes
25 Bytes gespart durch "Ausleihen" einiger Ideen aus Raznaguls C # -Antwort und mit der Summe der ersten n Zahlen zusammengeführt wurden!
2 Bytes mit der Summe der ersten n Tricks für einen Genauigkeitsverlust von 185 Millisekunden gespart.
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-Programm:
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);
}
}
}
Erläuterung:
Da die Gesamtwartezeit mit 267 Sekunden fest codiert ist, kann man diese Zahl als teleskopische Summe der ersten n natürlichen Zahlen betrachten. n * (n + 1) / 2
, die 267000 Millisekunden entsprechen müssen.
Dies ist äquivalent zu n^2 + n - 534000 = 0
.
Durch diese Gleichung zweiter Ordnung zu lösen, n1 = 730.2532073142067
, n2 = -n1
. Natürlich wird nur die positive Lösung akzeptiert und kann als 730 angenähert werden .
Die Gesamtzeit kann wie folgt berechnet werden 730 * (730 + 1) / 2 = 266815 milliseconds
. Die Ungenauigkeit beträgt 185 Millisekunden und ist für den Menschen nicht wahrnehmbar. Der Code bewirkt nun, dass der Haupt-Thread (und nur dieser) für 1 Millisekunde, 2 Millisekunden usw. bis zu 730 Sekunden in den Ruhezustand wechselt, sodass die gesamte Ruhezeit ~ 267 Sekunden beträgt.
Aktualisieren:
Die Programmlogik kann weiter vereinfacht werden - im Grunde muss eine Nachricht kontinuierlich angezeigt und eine bestimmte Zeit gewartet werden, bis zur zweiten Nachricht gewechselt wird.
Die Nachricht kann mithilfe eines ternären Operators geändert werden, um das Verstreichen der angegebenen Zeit (~ 267 Sekunden) zu überprüfen.
Der Timing-Aspekt wird gesteuert, indem ein zunehmender Zähler verwendet und der Ausführungsthread angehalten wird.
Da die Zählervariable jedoch unbegrenzt weiter ansteigt, ohne dass Bedingungen zur Überprüfung ihres Werts erfüllt sind, kann irgendwann ein ganzzahliger Überlauf erwartet werden, wenn die Nachricht auf zurückgesetzt wird Not ready yet
.
Eine Bedingung kann hinzugefügt werden, um das Problem zu erkennen und zu mindern, indem ein positiver Wert größer als 730 zugewiesen wird, wenn der Überlauf auftritt - wie i=i<1?731:i
in der for
Schleife. Leider kostet es 11 zusätzliche Bytes:
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);}}}
Der Schlüssel hier ist die Verwendung des Zählerwerts in Millisekunden zu verwenden, um den Moment des Überlaufs stark zu verzögern.
Die Zeit bis zum Überlauf kann gemäß der sum(1..n)
Formel berechnet werden, wobei n = der maximale vorzeichenbehaftete 32-Bit-Integer-Wert in C # (und .NET Framework) oder 2 ^ 31 - 1 = 2147483647 ist:
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
Nach 73 Millionen Jahren ist es vielleicht egal, ob ein Fehler im System auftritt - der Hot Dog, der hungrige OP und vielleicht die Menschheit selbst sind längst verschwunden.
Vorherige Version (172 Bytes):
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-Programm:
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");
}
}
}
Vorherige Version (174 Bytes):
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-Programm:
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");
}
}
}
Alternativ kann das Programm auch Not ready yet
nur einmal angezeigt werden. Warten Sie, bis die angegebene Zeit abgelaufen ist, und geben Sie es dann aus, Eat your hot dog
indem Sie die vorherige Nachricht überschreiben, während Sie einige Bytes kürzer sind:
145 Bytes
namespace System{class P{static void Main(){Console.Write("Not ready yet");Threading.Thread.Sleep(267000);Console.Write("\rEat your hot dog");}}}
Ungolfed-Programm:
namespace System
{
class P
{
static void Main()
{
Console.Write("Not ready yet");
Threading.Thread.Sleep(267000);
Console.Write("\rEat your hot dog");
}
}
}