Увидимся в другой жизни, братан!

12

Большинство из нас, фанатов LOST, помнят компьютер, на котором Десмонду приходилось печатать символы «4 8 15 16 23 42» каждые 108 минут, иначе мир закончится (или так?).

Задача здесь состоит в том, чтобы создать программу, которая будет делать то же самое, требуя, чтобы каждые 108 секунд вводился ввод 4 8 15 16 23 42или он отображал сообщение

Sorry, the world has ended with status code -1

Он должен предупредить пользователя за 100 секунд, что ему нужно ввести номер с сообщением

Enter, Quick!

Программа должна быть в состоянии прочитать входные данные в любое время, и если это правильный вход, она сбросит таймер. Если введен неправильный ввод, ничего не происходит.

Программа должна работать бесконечно. Таким образом, график после последнего действительного ввода выглядит так

От 0 до 99 секунд: нет выходных
В 100 секунд: Enter, Quick!
На 108 секунд: Sorry, the world has ended with status code -1.

Это кодовый гольф, поэтому выигрывает самый короткий ответ (в байтах), который выполняет эту задачу! Удачи!

Яков Мисирян
источник
Я немного отредактировал вопрос. Не стесняйтесь отменить любые изменения, которые вы не хотите.
Мартин Эндер
2
Должны быть бонусные баллы за вывод правильных иероглифов.
curiousdannii
Перечитав вызов, я больше не уверен, правильно ли я его интерпретировал. Что должно произойти после того, как «мир закончился»?
Деннис
1
Как потерянный ботаник, я чувствую себя обязанным указать, что Десмонд будет предупрежден о вводе чисел за 4 минуты (240 секунд) до того, как истечет таймер.
Джеймс

Ответы:

10

Баш, 160 байт

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

В настоящее время я не уверен, каково ожидаемое поведение после того, как «мир закончился».

Запустите так:

bash lost.sh 2>&-

2>&-требуется игнорировать STDERR, что разрешено по умолчанию .

Деннис
источник
2

Modern-браузер JavaScript, 252 247 242 байта

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)

Инструкции: запустите это в консоли пустой вкладки, нажмите на ее документ, чтобы получить фокус и начать многократно вводить строку. Пока у вас все хорошо, вы не получите никакой обратной связи. Обновите и измените 1e5 на 1e4, чтобы сделать вещи более интересными.

bopjesvla
источник
1

Groovy, 244 или 228 байт

Я ошибочно вспомнил, что в Java был метод nextLine, который принимал аргумент того, как долго ждать, поэтому я подумал, что это будет легко. Я не смог найти метод, который это сделал, поэтому я реализовал это с помощью двух потоков. Это немного громоздко. Ну что ж.

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()

Предполагается, что правильное поведение окончания мира - процесс завершается с кодом состояния -1. Если предполагаемое поведение состоит в том, чтобы продолжать цикл и ожидать, что внешняя сила покончит с миром (и, соответственно, с программой), эта ;System.exit(-1)часть может быть опущена, чтобы сохранить 16 байтов. Ура.

Первоначально я написал это, чтобы использовать хэш-код строки, но это оказалось длиннее, чем точное сравнение, встраивающее строку, потому что hashCodeоно длинное.

Una
источник
1

APL (Dyalog Unicode) , 144 байта SBCS

Как оказалось, обе стороны работают 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

Попробуйте онлайн!

:For t:in 100 8 цикл в два раза, один раз t(timput) быть , 100а затем , tкак 8:

:For s:In⍳t для s(econds) 1через и все ɩ ndices , покаt

  ⎕RTL←1 установите R esponse T ime L imit в 1 (второй)

  {} Применить к этому следующую анонимную лямбду (хотя этот аргумент не используется)

   1E3:: в следующем случае, если произойдет какое-либо исключение:

     возвращение []

    пытаться:

    ⍕4 8 15 16 23 42 зафиксируйте нужные числа

    ⍞≡ запросить ввод и сравнить с ним (дает 0 или 1)

     первое, что многие друзья ( []или [1] `

   перейти к этой строке (1, если [1], продолжить на следующей строке, если [])

:End конец внутренней петли; перейти к следующей секунде текущего тайм-аута

t=3 это второй тайм-аут (0 или 1)?

 ... ⌽⍨ поверните следующее, что много шагов:

  'Enter, Quick!' 'Sorry, the world has ended with status code -1' неявно печатать соответствующий текст

 раскрыть (распечатать без начального и конечного пробела)

:End конец внешнего цикла: после предупреждения цикл; после печати «Извините…» продолжите работу программы

Адам
источник
0

C ++ (gcc) , 395 байт

Компиляция в Linux требует -pthreadпереключения. МинГВ обходится без.

#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();}

Попробуйте онлайн!

gastropner
источник