Тікає Квіне-бомба!


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!(тому що програми виводу-виводу мають час початку, що перевищує цю першу програму виводу) .

Правила виклику:

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

Загальні правила:

  • Це є , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу return. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Що означає "вивести програму"? вихідний вихідний код як рядок? або повернення функції?
tsh

@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)}

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


Схоже, це не працює, як очікувалося.
Maarten Bicknese

Ви можете видалити публікацію та скасувати її повторне виправлення, щоб уникнути будь-яких голосів.
tsh

Ви можете відіграти місця в гольфі return()=>. І хоча я майже ніколи не програмую на JavaScript, я перевірив ваш тестовий скрипт і навіть змінив його, додавши тест на функцію виведення функції: протестуйте його тут із четвертим тестом функціональної функції. Здається, все працює, і я можу додати, що це дивно коротко, тому +1 від мене. PS: У зазначених правилах він повинен виводити рядок замість функції. Але я трохи зміню правила, щоб дозволити обидва. Чи можете ви змінити сценарій, щоб він також виводив функції для реєстрації під час тесту?
Кевін Круїссен

1
f=(t,o=setTimeout(_=>o=0,t*1e3))=>_=>o?f(t):'BOOM!'повинен працювати
tsh

Ти чарівник ?! Ніколи не думав використовувати логіку як значення за замовчуванням параметра 🤩
Maarten Bicknese

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);}"

Вибачте, що опублікувавте власний виклик одразу. В основному це розуміється як подальше уточнення виклику, і я сумнівався, чи додати його до самого запитання, чи опублікувати як відповідь (і вирішив опублікувати його як відповідь, щоб не захаращувати пост виклику).
І хоча я хотів би сказати, що це теж щось (спробувати і) перемогти, це навіть не варто згадувати, бо, ну .. Ява (майже) завжди б'ється. ; стор

Спробуйте в Інтернеті.

Приклад виводу:

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

Пояснення:

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

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

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.



0

05AB1E , 50 байт

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

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

Спробуйте в Інтернеті або спробуйте 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) через ’...’.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.