C #을 174 172 147 바이트
raznagul의 C # 답변 에서 일부 아이디어를 "빌리기" 하여 첫 n 개의 숫자 를 합하여 25 바이트를 절약 했습니다!
185 밀리 초의 정밀도 손실을 위해 처음 n 개의 숫자를 합하여 2 바이트를 절약했습니다.
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 + 1) / 2
되므로이 숫자를 첫 번째 n 개의 자연수의 텔레스코픽 합계로 간주 할 수 있으며 이는 267000 밀리 초와 같아야합니다.
이는에 해당합니다 n^2 + n - 534000 = 0
.
이 2 차 방정식을 풀어서 n1 = 730.2532073142067
, n2 = -n1
. 물론, 긍정적 인 해결책 만이 받아 들여지고 대략 730 으로 추정 될 수 있습니다 .
총 시간은로 계산할 수 있습니다 730 * (730 + 1) / 2 = 266815 milliseconds
. 부정확도는 185 밀리 초 이며 인간에게는 인식 할 수 없습니다. 코드는 이제 메인 (및 유일한) 스레드를 1 밀리 초, 2 밀리 초 등 최대 730 분 동안 슬립 상태로 만들므로 총 슬립 시간은 ~ 267 초입니다.
최신 정보:
프로그램의 논리는 더 단순화 될 수 있습니다. 기본적으로 메시지를 지속적으로 표시하고 두 번째 메시지로 전환 할 때까지 지정된 시간 동안 기다려야합니다.
삼항 연산자를 사용하여 지정된 시간 (~ 267 초)의 통과를 확인하여 메시지를 변경할 수 있습니다.
타이밍 측면은 증가 카운터를 사용하고 실행 스레드를 일시 중지하여 제어됩니다.
그러나 카운터 변수의 값을 확인하기위한 조건없이 카운터 변수가 계속 증가하므로 메시지가로 되돌아 갈 때 어느 시점에서 정수 오버플로가 발생할 수 있습니다 Not ready yet
.
루프 i=i<1?731:i
내부 와 같이 오버플로가 발생할 때 730보다 큰 양수 값을 할당하여 문제를 감지하고 완화하기위한 조건을 추가 할 수 있습니다 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 = C # (및 .NET 프레임 워크)의 최대 32 비트 부호있는 정수 값 또는 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");}}}
언 골프 프로그램 :
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");
}
}
}