Тиканье Куайн-Бомба!

9

Вызов:

Создайте программу или функцию, которая принимает целочисленный ввод, который выводит новую программу / функцию, как указано ниже.

Входные данные:

Целое число n: время в секундах до взрыва бомбы замедленного действия.

Вывод:

Исходная программа, у которой на nвходе было время в секундах , выведет новую программу / функцию, которая выполняет следующие действия:

  • Был nприняты секунды , так как предыдущая программа была запущена? РаспечататьBOOM!
  • Иначе: Распечатайте программу / функцию, которая при запуске сама сбрасывает таймер обратно в nсекунды (и действует так же, как первая выведенная программа / функция).

ПРИМЕЧАНИЕ. Это не совсем то же самое, что первая выведенная программа / функция (по крайней мере, в большинстве языков), потому что время запуска изменилось (см. Поясняющий пример ниже).

Пример псевдокода:

Скажем, оригинальная программа ABCи ввод в 60секундах:

ABCи 60выходы DEF(60).

  • Если DEF(60)запустить в течение 60 секунд, он выдаст DEF_G(60), что действует точно так же, как DEF(60)и с новым временем запуска.
  • Если DEF(60)запустить через 60 секунд, будет выведено BOOM!.

Уточняющий пример, что я имею в виду под «временем начала»:

  1. Базовая программа с входными 60секундами запускается при 12:00:00. Он выводит первую программу вывода с начальным временем 12:00:00.
  2. Эта первая программа вывода со временем 12:00:00запуска выполняется в 12:00:45. Он выводит вторую программу вывода с начальным временем 12:00:45.
  3. Эта третья программа вывода со временем 12:00:45запуска выполняется в 12:01:25. Он выводит четвертую программу вывода со временем запуска 12:01:25.
  4. Эта четвертая программа вывода с начальным временем 12:01:25запуска 12:05:00. Это будет выводить BOOM!.

Обратите внимание, как первый вывод будет печататься BOOM!после 12:01:00, но программа вывода продвинулась, поэтому, несмотря на то, что она находится 12:01:25на шаге 3, она все равно будет выводить следующую программу вместо BOOM!(поскольку программы вывода на выход имеют время запуска выше этой первой программы вывода) ,

Правила соревнований:

  • Применяются правила Quine по умолчанию.
  • По крайней мере, nсекунды должны были пройти. Таким образом, если ввод 60и время запуска было 12:00:00, то 12:01:00он все равно выведет программу v2, но на 12:01:01него выведет BOOM!.
  • Выходные программы не будут принимать никаких входных данных ( за исключением пустого неиспользуемого параметра, если он короче ). Время запуска должно быть задано следующим программам в виде «жестко запрограммированного» значения (именно поэтому выходные данные выходной программы не совпадают с предыдущими (в большинстве языков).
  • Только размер вашей основной программы / функции считается в байтах.
  • Вы можете вывести программу / функцию либо в виде строки (или в сопоставимом разумном формате, таком как байт / массив / список символов), либо в качестве функции, если ваш язык поддерживает это, или в других разумных форматах (пожалуйста, спросите, если не уверены).

Основные правила:

  • Это , так что кратчайший ответ в байтах выигрывает.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.
Кевин Круйссен
источник
Что значит «вывести программу»? выводить исходный код в виде строки? или возвращая функцию?
ч. В 9:06
@tsh Добавлено правило, разрешающее как строку, так и функцию.
Кевин Круйссен,

Ответы:

2

JavaScript, 51 байт

f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'

Тест в браузере

старая версия

f=(t,o=0)=>{setTimeout(()=>o=1,t*1000);return ()=>o?'BOOM!':f(t)}

Тест в браузере

Мартен Бикнес
источник
Похоже, это не работает, как ожидалось.
Мартен Бикнес
Вы можете удалить сообщение и восстановить его после исправления, чтобы избежать лишних голосов.
tsh
Вы можете поиграть в гольф в return()=>. И хотя я почти никогда не программировал на JavaScript, я проверил ваш тест-скрипт и даже изменил его, добавив тест для функции вывода функции: протестируйте его здесь с помощью четвертого теста функции-функции. Кажется, все работает, и это удивительно мало, я мог бы добавить, поэтому +1 от меня. PS: в правилах сказано, что она должна выводить строку вместо функции. Но я немного изменю правила, чтобы разрешить и то, и другое. Не могли бы вы изменить скрипт, чтобы он также выводил функции для регистрации во время теста?
Кевин Круйссен,
1
f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'должен работать
Tsh
Ты волшебник?! Никогда не думал об использовании логики в качестве значения параметра по умолчанию Ma
Мартен Бикнес,
4

JavaScript, 53 байта

f=(d,t=1/0,n=Date.now()/1e3)=>n>t?'BOOM!':_=>f(d,d+n)


Старый ответ (возвращение должно быть строкой)

JavaScript, 78 байт

(f=(o,t,d)=>(x=d,n=Date.now()/1e3)=>o&&n>t?'BOOM!':`(f=${f})(${[1,n+x,x]})`)()

ТТГ
источник
Хороший ответ и на удивление читабельный. Я провел некоторое тестирование, и все, кажется, работает просто отлично. +1 от меня.
Кевин Круйссен,
1

Java 8, 234 байта

n->"v->{long t=System.nanoTime();t/=1e9;String s=\"v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>"+n+"?%1$cBOOM!%1$c:s.format(s,34,s,t);}\";return t-"+(System.nanoTime()/1e9)+">"+n+"?\"BOOM!\":s.format(s,34,s,t);}"

Извините, что опубликовал свой собственный вызов прямо сейчас. В основном это означало дальнейшее разъяснение вопроса, и я сомневался, добавлять ли его в вопрос сам или публиковать как ответ (и решил опубликовать его как ответ, чтобы не загромождать сообщение для вызова).
И хотя я хотел бы сказать, что это тоже что-то, что можно (пытаться) победить, об этом даже не стоит упоминать, потому что, ну ... Java (почти) всегда побеждена. ;п

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

Пример вывода:

v->{long t=System.nanoTime();t/=1e9;String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";return t-70492.687613232>60?"BOOM!":s.format(s,34,s,t);}

Попробуйте выведенную лямбда-функцию здесь.

Пример вывода:

v->{long t=System.nanoTime();t/=1e9;String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";return t-70548>60?"BOOM!":s.format(s,34,s,t);}

Объяснение:

Основная функция принимает целочисленный ввод и возвращает строку. Он в основном возвращает функцию, которая является квинной, с целочисленным вводом и временем запуска (в секундах как метка времени) в виде жестко закодированных значений.

Основная функция:

n->        // Method with integer parameter and String return-type
  "v->{long t=System.nanoTime();t/=1e9;String s=\"v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>"
          //  First part of the output-function
  +n      //  With the integer input placed as hard-coded value
  +"?%1$cBOOM!%1$c:s.format(s,34,s,t);}\";return t-"
          //  The second part of the output-function
  +(System.nanoTime()/1e9)
          //  With the current time in seconds as hard-coded starting time
  +">"+n  //  And the integer input again (for the output of the output function)
  +"?\"BOOM!\":s.format(s,34,s,t);}"
          //  The final part of the output-function

n=60 был использован в примерах ниже:

Первая программа вывода:

v->{                   // Method with empty unused parameter and String return-type
  long t=System.nanoTime();t/=1e9;
                       //  New starting time in seconds
  String s="v->{long t=System.nanoTime();t/=1e9;String s=%c%s%1$c;return t-%d>60?%1$cBOOM!%1$c:s.format(s,34,s,t);}";
                       //  Unformatted (quine) result-function
  return t-            //  If the difference between the new starting time
    70492.687613232    //  and hard-coded starting time from the main function
    >60?               //  is larger than the hard-coded integer from the main function
     "BOOM!"           //   Return "BOOM!"
    :                  //  Else:
     s.format(s,34,s,  //   Return the formatted (quine) result-function,
              t);}     //   with this new starting time as new hardcoded value

Вторая программа вывода:

Так же, как первая программа вывода, за исключением того, что 70492.687613232заменяется на 70548.

Кевин Круйссен
источник
1

Perl 5+ -p, 88 байт

$_="\$s=$_;\$t=$^T;".'$_=q{say$^T-$t<$s?qq{\$t=$^T;\$s=$s;\$_=q{$_};eval}:"BOOM!"};eval'

Выходные программы должны работать с -M5.010для say, но не -p.

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

Дом Гастингс
источник
0

05AB1E , 50 байтов

"‘ÒÞ!""žažb‚žcª60β"D.VsI’"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ’D«

Определенно можно играть в гольф немного больше, но довольно сложно вывести полукухину, которая выводит программу квин с измененными значениями.

Попробуйте онлайн или попробуйте 20-секундный пример запуска .

Объяснение:

"‘ÒÞ!"                     # Push the string "‘ÒÞ!"
"žažb‚žcª60β"              # Push the string "žažb‚žcª60β"
 D                         # Duplicate it
  .V                       # Execute it as 05AB1E code:
                           #  ža          : Push the current hours
                           #    žb        : Push the current minutes
                           #      ‚       : Pair them together
                           #       žcª    : Append the current seconds
                           #          60β : Convert from this integer list to base-60
s                          # Swap the seconds-integer and duplicated "žažb‚žcª60β"-string
I                          # Push the input
"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ’  "# Push the string '"34ç ìD«ÿÿ©ÿDU-›iX®:ëÿ',
                           # where the `ÿ` are automatically replaced with the stack-values
 D«                        # Duplicate it, and append them together
                           # (after which the string is output implicitly as result)

Пример результирующей программы:

"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!

Который основан на Куайна по умолчанию: "34çìD«"34çìD«.

"34ç ìD«30žažb‚žcª60β©35555DU-›iX®:ë‘ÒÞ!"
                           # Push this string
 34ç                       # Push 34, converted to a character: '"'
    ì                      # Prepend it in front of the string
     D«                    # Duplicate this string, and append them together
                           # (we now have the quine-string at the top of the stack)
  žažb‚žcª60β              # Get the current time in seconds similar as above
             ©             # Store it in variable `®` (without popping)
              35555        # Push the time this program was generated
                   DU      # Store a copy in variable `X`
                     -     # Subtract the two times
30                    i   # If the original input-integer is larger than this:
  X®:                      #  Replace integer `X` with `®` in the generated quine-string
                       ë   # Else:
  ‘ÒÞ!                     #  Push dictionary string "BOOM!"
                           # (and output the top of the stack implicitly as result)

Посмотрите эту подсказку 05AB1E (раздел Как пользоваться словарем? ), Чтобы понять, почему ‘ÒÞ!это так "BOOM!".
ПРИМЕЧАНИЕ: причина пробела в çìтом, что в противном случае он интерпретируется как словарь-строка ( triumph) из-за ’...’.

Кевин Круйссен
источник