Do zobaczenia w innym życiu, bracie!

12

Większość z nas, zagubionych fanów, pamięta komputer, na którym Desmond musiał pisać znaki „4 8 15 16 23 42” co 108 minut, inaczej świat się skończy (a może tak?).

Wyzwaniem jest tutaj stworzenie programu, który zrobiłby to samo, wymagając, aby co 108 sekund wprowadzano dane wejściowe 4 8 15 16 23 42lub wyświetlał komunikat

Sorry, the world has ended with status code -1

Powinien ostrzec użytkownika po 100 sekundach, że musi wprowadzić numer wraz z wiadomością

Enter, Quick!

Program musi być w stanie odczytać dane wejściowe w dowolnym momencie i jeśli jest to prawidłowe dane wejściowe, zresetuje licznik czasu. Jeśli podano nieprawidłowe dane, nic się nie dzieje.

Program powinien działać bez końca. Tak wygląda oś czasu po ostatnim prawidłowym wejściu

Od 0 do 99 sekund: brak wyjścia
Na 100 sekund: Enter, Quick!
Na 108 sekund: Sorry, the world has ended with status code -1.

To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach), która zrealizuje to zadanie! Powodzenia!

Jacob Misirian
źródło
Trochę zredagowałem pytanie. Możesz wycofać wszelkie zmiany, których nie chcesz.
Martin Ender
2
Powinny istnieć punkty bonusowe za wydanie prawidłowych hieroglifów.
curiousdannii,
Po ponownym przeczytaniu wyzwania nie jestem pewien, czy poprawnie go zinterpretowałem. Co powinno się stać po „świecie się skończył”?
Dennis
1
Jako zagubiony nerd czuję się zobowiązany do wskazania, że ​​Desmond zostanie ostrzeżony o wprowadzeniu liczb na 4 minuty (240 sekund) przed upływem czasu.
James

Odpowiedzi:

10

bash, 160 bajtów

I()($s 100&&echo Enter, Quick!&$s 108&&echo Sorry, the world has ended with status code -1&)
i()(read r;[[ $r = '4 8 15 16 23 42' ]]&&pkill $s&&I;i)
s=sleep;I;i

Obecnie nie jestem pewien, jakie jest oczekiwane zachowanie po „skończeniu świata”.

Uruchom tak:

bash lost.sh 2>&-

2>&-jest wymagane do zignorowania STDERR, co jest domyślnie dozwolone .

Dennis
źródło
2

JavaScript nowoczesnej przeglądarki, 252 247 242 bajtów

n=t=>Date.now()+(t?0:1e5)
d=n(i=f=0)
onkeyup=e=>{if("4 8 15 16 23 42".charCodeAt(i%15)==e.keyCode&&++i%15<1)d=n(f=0)}
setInterval('if(n(1)>d&&f<2)d=n(1)+8e3,console.log(f++?"Sorry, the world has ended with status code -1":"Enter, Quick!")',9)

Instrukcje: uruchom to w konsoli pustej karty, kliknij dokument, aby uzyskać fokus i zacznij wielokrotnie pisać ciąg. Tak długo, jak dobrze sobie radzisz, nie otrzymasz żadnych informacji zwrotnych. Odśwież i zmień 1e5 na 1e4, aby uczynić rzeczy bardziej interesującymi.

bopjesvla
źródło
1

Groovy, 244 lub 228 bajtów

Źle pamiętałem, że Java ma metodę nextLine, która wymagała argumentu, jak długo trzeba czekać, więc pomyślałem, że będzie to łatwe. Nie mogłem znaleźć metody, która to zrobiłaby, więc zaimplementowałem to z dwoma wątkami. To trochę nieporęczne. No cóż.

t=Thread.start{while(1)try{Thread.sleep(1e5);println "Enter, Quick!";Thread.sleep(8e3);println "Sorry, the world has ended with status code -1";System.exit(-1)}catch(e){}};while(1)if(System.console().readLine()=="4 8 15 16 23 42")t.interrupt()

Zakłada się, że właściwym zachowaniem dla zakończenia świata jest zakończenie procesu z kodem statusu -1. Jeśli zamierzonym zachowaniem jest ciągłe zapętlenie i oczekiwanie, że siła zewnętrzna zakończy świat (a przez to program), ;System.exit(-1)część można pominąć, aby zaoszczędzić 16 bajtów. Tak

Oryginalnie napisałem to, aby użyć hashCode ciągu, ale to skończyło się dłużej niż dokładne porównanie z osadzeniem ciągu, ponieważ hashCodejest długie.

Una
źródło
1

APL (Dyalog Unicode) , 144 bajty SBCS

Jak się okazuje, obie strony korzystają z APL…

:For t:In 100 8
:For s:Int
→{1E3::⍬⋄⍳⍞≡⍕4 8 15 16 23 42}⎕RTL1
:End
'Enter, Quick!' 'Sorry, the world has ended with status code -1'⌽⍨t=8
:End

Wypróbuj online!

:For t:in 100 8 pętli dwukrotnie, raz z t(timput) jest 100a następnie tjako 8:

:For s:In⍳t dla s(econds) 1poprzez i wszystkich ɩ ndices ażt

  ⎕RTL←1 ustaw R esponse T ime L imit na 1 (sekundę)

  {} Zastosuj do tego następującą anonimową lambdę (chociaż ten argument nie jest używany)

   1E3:: poniżej, jeśli wystąpi jakiś wyjątek:

     powrót []

    próbować:

    ⍕4 8 15 16 23 42 skreślić wymagane liczby

    ⍞≡ monituj o wprowadzenie i porównaj z tym (daje 0 lub 1)

     Pierwsze że wiele ɩ ndices ( []lub [1] `

   przejdź do tej linii (1 jeśli [1], kontynuuj w następnej linii jeśli [])

:End koniec wewnętrznej pętli; przejdź do następnej sekundy bieżącego limitu czasu

t=3 czy to jest drugi limit czasu (0 lub 1)?

 … ⌽⍨ Obróć o tyle kroków:

  'Enter, Quick!' 'Sorry, the world has ended with status code -1' niejawnie wydrukuj odpowiedni tekst

 ujawniać (drukować bez spacji początkowych i końcowych)

:End koniec zewnętrznej pętli: po ostrzeżeniu pętla; po wydrukowaniu „Przepraszamy…”, kontynuuj program

Adám
źródło
0

C ++ (gcc) , 395 bajtów

Kompilacja w systemie Linux wymaga -pthreadprzełącznika. MinGW robi to bez.

#import<iostream>
#import<thread>
using namespace std;auto N=chrono::steady_clock::now;auto L=N();int w;int main(){thread A([]{for(;;){auto t=chrono::duration_cast<chrono::seconds>(N()-L).count();t>99&&!w?puts("Enter, Quick!"),w=1:t>107?exit(puts("Sorry, the world has ended with status code -1")),0:0;}}),B([]{for(string s;;s=="4 8 15 16 23 42"?L=N(),w=0:0)getline(cin,s);});A.join();B.join();}

Wypróbuj online!

gastropner
źródło