Леген ... подожди ...

68

Дарий!

В событиях, совершенно не связанных с тем, что, я надеюсь, произойдет со мной в ближайшие пару дней, я поручу вам написать код, который выполняет следующие действия:

  1. Распечатать

    Legen... wait for it...
    

    немедленно, с завершающим переводом строки.

  2. Подождите до следующего полного часа (когда запустится задание cron для награждения значком).

  3. Распечатать

    dary!
    

    с дополнительным завершающим переводом строки.

Дополнительные правила

  • Вы можете написать программу или функцию, но вывод должен быть распечатан в STDOUT (или его ближайшую альтернативу вашему языку).

  • Вы должны ждать до следующего полного часа, а не только в течение 60 минут. Если код выполняется в 6:58, он должен напечатать вторую строку в 7:00.

  • Последняя строка должна быть напечатана не позднее, чем через одну секунду после следующего полного часа.

  • Если программа запускается в первую секунду целого часа, она должна ждать следующего полного часа.

  • Вы можете запросить местное или UTC время.

  • Применяются стандартные правила .

Деннис
источник
1
Я не понимаю, как третье дополнительное правило отличается от базового «подожди следующего часа»
Fatalize
2
@Fatalize Это просто пояснение, что вам нужно подождать, пока часы не изменится, а не до тех пор, пока минуты и секунды не будут в 00 .
Деннис
25
Счастливый Легендарный Знак, @Dennis!
Kritixi Lithos
36
@ ΚριτικσιΛίθος Спасибо! (Слава Богу за завершение табов.)
Деннис
2
«В час» будет более стандартным (и я полагаю, гораздо более ясным) способом описания того, что вы называете «следующий полный час» (по крайней мере, в американском английском).
jpmc26

Ответы:

12

Пиф, 42 41

J.d6." wâ«­hÖ`Ùá©h´^"WqJ.d6;"dary!

Ниже приведен шестнадцатеричный код:

00000000  4a 2e 64 36 2e 22 20 77  0c 10 89 e2 ab 1b ad 68  |J.d6." w.......h|
00000010  0f 8c d6 60 d9 e1 a9 68  82 b4 5e 22 57 71 4a 2e  |...`...h..^"WqJ.|
00000020  64 36 3b 22 64 61 72 79  21                       |d6;"dary!|

Сохранено 1 байт благодаря @isaacg

Использует .dфункцию для получения значений местного времени. .d6возвращает текущий час. Это печатает первую строку, затем ждет, пока час не будет отличаться от часа и начала программы, а затем печатает вторую строку.

Вы можете попробовать это онлайн с .d7или .d8за минуты / секунды, но онлайн-компилятор печатает только что-нибудь, когда программа завершается.

Поздравляю, Деннис! :)

FryAmTheEggman
источник
Строка может быть сжата на 1 байт с помощью pack-str. Hexdump:0000000: 2e22 2077 0c10 89e2 ab1b ad68 0f8c d660 ." w.......h...` 0000010: d9e1 a968 82b4 5e22 0a ...h..^".
Исаак
@isaacg Ой, я проверил это, но я, должно быть, испортил счет. Я думал, что он сжал только 1 байт, поэтому дополнительный .будет иметь такую ​​же длину. Глупые ошибки: 1
FryAmTheEggman
Просто попытка выяснить, что это могло бы сделать (без опыта работы с питом) заставило меня смеяться. Я вижу dary, но нет legen! И Pyth утверждает, что его легче понять тем, кто привык к традиционному программированию ...
Cyoce
@Cyoce Если вы посмотрите историю изменений, то сможете найти более легкую для чтения версию. ."Указывает , что строка должна иметь какие - то операции , выполняемые на нем , чтобы получить реальную строку. Это просто компрессионный трюк для игры в гольф. Если вы решили попробовать изучать Pyth, удачи! Не забывайте, что для этого тоже есть чат :)
FryAmTheEggman
26

JavaScript (ES6), 74 байта

Возможно, вы захотите изменить системные часы перед тестированием, примите наши поздравления, если вы попали сюда на 59 минут раньше.

setTimeout(a=alert,36e5-new Date%36e5,"dary!");a`Legen... wait for it...
`

Джордж Райт
источник
11
Будет 36e5работать на месте 3.6e6?
ETHproductions
8
@ETHproductions Вы красавица!
Джордж Райт
3
@ETHproductions Это плохая научная запись. Я понятия не имел, что это работает на Javascript. Узнал что-то сегодня !!!
Исмаэль Мигель
2
@ Оптимизатор Ах, не знал setTimeoutбы evalдля меня. Верно ... Я изначально пытался использовать, console.logно это даже не работает, когда хранится в переменной из-за контекста. Вы тоже красивы!
Джордж Райт
1
Вы могли бы setTimeoutправильно использовать и даже сохранить один байт:alert`Legen…`;setTimeout(alert,36e5-new Date%36e5,"dary!")
Берги
9

CJam, 49 48 байтов

et3="Legen... wait for it...
"o{_et3==}g;"dary!"

Использует местное время. Для целей тестирования, вы можете заменить два экземпляра 3с 4или 5сделать его напечатать в начале следующей минуты / секунды.

Проверьте это здесь. Но обратите внимание, что онлайн-переводчик не показывает никакого вывода, пока программа не завершится. Кроме того, вы можете запустить его в режиме онлайн , где вывод отображается почти сразу, а не в буфере (но при тестировании с секундами, а не часами задержка будет заметна). В любом случае, если вы запускаете его локально с помощью интерпретатора Java, он работает как шарм.

объяснение

Это использует CJam, etкоторый дает вам массив

[year month day hour minute second ms weekday utc_offset]

Вот разбивка кода:

et3=       e# Get the current hour.
"Legen..." e# Push the first string including the linefeed.
o          e# Print it.
{          e# While the top of stack is truthy (which is popped)...
  _        e#   Copy the original hour.
  et3=     e#   Get the current hour.
  =        e#   Check for equality.
}g
;          e# Discard the original hour.
"dary!"    e# Push the second string which is printed automatically.

бонус

Это также работает для того же количества байтов:

et4<"Legen... wait for it...
"o{et1$#!}g;"dary!"

Вместо того, чтобы выбирать час, мы выбираем префикс с датой и часом, и продолжаем цикл, пока массив даты и времени все еще имеет этот префикс.

Мартин Эндер
источник
9

AppleScript, 157 149 байт

Да. Удивительно спорят.

установите d в число 1 во временной строке (текущая дата)
журнал "Леген ... подожди ..."
повторить, пока d = число 1 во временной строке (текущая дата)
конец
журнал "Dary!"

Поскольку logвыполняется печать на панели сообщений редактора сценариев, я считаю, что это самый близкий вывод к STDOUT. По сути, если вы получите строку времени текущей даты, она сделает что-то вроде этого:

Код:

временная строка (текущая дата)

Выход:

17:02:03

Он будет захватывать первое число ( 5) перед двоеточием.

Я думал, что это будет намного дольше, чем это, на самом деле. XD

Аддисон Крамп
источник
Так что произойдет, если вы запустите его в 03:03:00?
Blacklight Shining
@BlightlightShining Получит номер 3 спереди и подождет до четырех. Он знает только число перед двоеточием.
Аддисон Крамп
О, я пропустил это. Хорошо. Как ни странно, я на самом деле получаю только "1"от number 1 in time string of(current date)
Blacklight Shining
@ BlacklightShining Вы, вероятно, используете более старую версию - в El Capitan это эквивалентно first number in time string of (current date).
Эддисон Крамп
Я на Йосемити, да. first numberтакже дает мне только первую цифру времени ( "0"прямо сейчас, в 04:38).
Blacklight Shining
8

Снеговик 1.0.2 , 70 69 байт

~"Legen... wait for it...
"sP3600000*vt#nDnC!*:vt+#nD!#nL;bD"dary!"sP

Объяснение:

~              Make all variables active.
"..."sP        Print the first string.
3600000*vt#nD  Get the number of hours since the Unix epoch.
nC             Ceiling (round up), giving the time (divided by 36000) at which to
                 print the second string.
!*             Save that in a permavar.
:...;bD        Do the stuff in the block while its "return value" is truthy.
  vt+#nD       Again, get the number of hours since epoch.
  !#             Store the permavar that we saved earlier.
  nL             Is the current time less than the target time? (if so,
                   keep looping)
"..."sP        Print the second string.
Дверная ручка
источник
7

PHP, 76, 70, 65, 62 и 51 байт

Legen... wait for it...
<?while(+date(is));?>dary!

Предыдущая логика (63b):

Legen... wait for it...
<?for($h=date(G);date(G)==$h;)?>dary!

Этот вид кодирования заставляет вас потерять работу, но это повторяется до тех пор, пока время не станет на 1 час больше, чем init.

-1 байты, заменяя {}АВЭС на некоторое время , чтобы ;(спасибо manatwork)
-5 байт путем замены echo'dary!';в ?>dary!(спасибо manatwork)
-4 байта, заменив <?phpна короткую версию <?(благодаря приме)
-1 байт путем замены в whileтечение for
-3 байт путем замены date(G)!=$h+1в date(G)==$h(спасибо, прим)

Мартейн
источник
Хороший, но {};и echo?>уменьшит его немного. Хотя я бы предпочелLegen... wait for it...↵<?php while(+date('is'));?>dary!
manatwork
1
Несколько советов: вы можете использовать короткие открытые теги (просто <?вместо <?php). Использование for(;;)имеет ту же длину, что и while(), но позволяет перемещать $hназначение, не используя точку с запятой ( for($h=date(h);...). В этом {}не было необходимости, но и в ;предыдущем нет ?>. У вас может быть проблема с $h12, хотя ( date(h)никогда не будет 13).
Примо
Спасибо вам обоим, соответственно обновил мой ответ. Я не очень хорошо себя чувствую, наверное, я не должен сегодня выполнять важную работу, потому что это ясно показывает, ха-ха
Мартейн
2
Изменить date(G)!=$h+1на date(G)==$h. Короче, и решает проблему с часом;) Кроме того, удалите точку с запятой перед ?>.
Примо
1
@manatwork не будет ждать, если код будет запущен HH:00:00, то есть в течение первой секунды целого часа.
Примо
7

Perl 6 , 60 байт

sleep 60²-now%60²+say 'Legen... wait for it..';say 'dary!'
Брэд Гилберт b2gills
источник
4
Я хотел бы отметить, что это 60²было добавлено несколько дней назад
Брэд Гилберт b2gills
Вау, так близко к тому, что ты не можешь участвовать в этом соревновании!
кот
Поздравляю на 10к!
MD XF
5

Javascript 94 90 87 байт

Не так много в гольфе ...

alert`Legen... wait for it...`,l=l=>~~(Date.now()/36e5);for(z=l();z==l(););alert`dary!`

Версия Downgoat:

(a=alert)`Legen... wait for it...`,z=(b=new Date().getHours)();for(;z==b(););a`dary!`

Он хранит текущий час и зацикливается до тех пор, пока «старый» час равен текущему. Как только час поменяется, он напечатает все остальное! : D

Отказ от ответственности: если ваш браузер не любит его, вы были предупреждены.

Stefnotch
источник
2
87 байт:(a=alert)`Legen... wait for it...`,l=new Date,z=(b=l.getHours)();for(;z==b(););a`dary!`
Downgoat
@ Downgoat Спасибо! (Я пытаюсь
играть
1
Еще короче (85 байт):(a=alert)`Legen... wait for it...`,z=(b=new Date().getHours)();for(;z==b(););a`dary!`
Downgoat
2
@ Downgoat На один байт короче:for((a=alert)`Legen... wait for it...`,z=(b=new Date().getHours)();z==b(););a`dary!`
Исмаэль Мигель
4

MATLAB - 89 байт

a=@()hour(now);disp('Legen... wait for it...');while(mod(a()+1,24)~=a())end;disp('dary!')

Довольно понятно. Сначала создайте дескриптор функции, чтобы получить текущий час системных часов. Затем отображение Legen... wait for it...с возвратом каретки, и затем мы заходим в whileцикл, где мы продолжаем проверять, не равен ли текущий час, добавленный с 1, текущему часу. Если это так, продолжайте цикл. Только до того момента, когда наступит следующий час, мы покажем, dary!и после этого произойдет возврат каретки.

Час MATLAB основан на 24-часовом индексировании, поэтому modработа с базой 24 необходима для обработки перетока с 23:00 (23:00) до полуночи (00:00).

Незначительная нота

Для этой hourфункции требуется набор инструментов Финансовый временной ряд. nowФункция не подлежит ограничению этого, но она извлекает текущую дату и время как серийный номер , который , hourтаким образом , использует для вычисления текущего часа.

Хотите запустить это в Октаве?

Конечно! Поскольку у Octave нет этого набора инструментов, нам просто нужно изменить hourфункцию так, чтобы она вызывала, datevecкоторый возвращает вектор из 6 элементов - по одному для каждого из года, месяца, дня, часа, минут и секунд. Вам просто нужно извлечь четвертый элемент вывода:

a=@()datevec(now)(4);disp('Legen... wait for it...');while(mod(a()+1,24)~=a())end;disp('dary!')

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

Нет инструментов для финансовых временных рядов?

Если вы хотите запустить это в MATLAB без набора инструментов Financial Time Series, поскольку вы не можете сразу индексировать переменные без временной переменной, это займет немного больше байтов для записи:

disp('Legen... wait for it...');h=datevec(now);ans=h;while(mod(h(4)+1,24)~=ans(4)),datevec(now);end;disp('dary!');

Сначала он получает текущее время и дату и сохраняет их в переменной, hа также сохраняет их в вызываемой автоматической переменной ans. После этого мы продолжаем цикл и проверяем, не равен ли текущий час следующему. На каждой итерации мы постоянно обновляем автоматическую переменную с указанием текущего времени и даты. Как только следующий час совпадает с текущим временем и датой, мы отображаем последнюю часть строки и завершаем работу. Это увеличивает количество байтов до 114.


Также обратите внимание, что вы не можете попробовать это онлайн. Онлайн-переводчики Octave будут иметь ограничение по времени выполнения кода, и, поскольку это whileцикл, ожидающий следующего часа, вы получите тайм-аут при ожидании выполнения кода. Лучшее, что вы можете сделать, это запустить его на своем компьютере и убедиться, что он работает.

rayryeng - Восстановить Монику
источник
В вашем первом вы могли бы сэкономить 3 байта путем вместо проверки nowв то время цикла: a=@()disp('Legen... wait for it...');while floor(mod(now*86400,3600))end;disp('dary!'). Вы также можете сэкономить еще 5 байтов, удалив a=@()бит, потому что код «как есть» представляет собой полную программу. Прикрепленный код также не требует набора инструментов FTS.
Том Карпентер
Как же вы узнали о hourфункции Financial Toolbox ? :-)
Луис Мендо
Теперь я понимаю, что вы имели в виду под своим комментарием о необходимости промежуточных переменных для индексации ...
Луис Мендо
4

Mathematica, 85 84 81 байт

c=Print;c@"Legen... wait for it...";a:=DateValue@"Hour";b=a;While[a==b];c@"dary!"
LegionMammal978
источник
Я думаю, что вы можете сэкономить 2 байта, сделав "Dary!" выражение выражения.
CalculatorFeline
@CatsAreFluffy Тогда это будет просто фрагмент, а не полная программа.
LegionMammal978
Так? Разве выражение Mathematica неприемлемо или я что-то упустил?
CalculatorFeline
Сценарии @CatsAreFluffy Mathematica существуют, поэтому предполагается, что любая данная полная программа будет выполняться в одной.
LegionMammal978
4

C 163 байта

#include<time.h>
f(){puts("Legen... wait for it...");time_t t=time(0);struct tm l=*localtime(&t);while(l.tm_min+l.tm_sec)t=time(0),l=*localtime(&t);puts("dary!");}
Zaglo
источник
3
Добро пожаловать в PPCG!
Эрик Outgolfer
155 байт (не пытайтесь запустить его на TIO, он не закончится, время истекает через одну минуту)
MD XF
3

Microscript II, 45 байт

"Legen... wait for it..."P[36s5E*sD%_]"dary!"

Наконец, использование для Dинструкции.

Печатает первую строку, многократно занимает время UTC в миллисекундах по модулю 3 600 000, пока не получится 0, а затем создает вторую строку, которая печатается неявно. 3 600 000 представлены в коде как 36x10 5 .

SuperJedi224
источник
Можете ли вы добавить объяснение? c:
Эддисон Крамп
@VoteToClose Готово
SuperJedi224
3

TI-BASIC, 70 64 байта

getTime
Disp "Legen... wait for it...
Repeat sum(getTime-Ans,1,1
End
"dary

Прокляните эти двухбайтовые строчные буквы!

getTimeвозвращает список из трех элементов {hours minutes seconds}, поэтому сумма от 1-го элемента до 1-го равна часам. Когда есть разница между часами в начале и текущими часами, цикл заканчивается. Спасибо @FryAmTheEggman за это наблюдение.

lirtosiast
источник
3

R - 97 байт

cat('Legen... wait for it...\n')
Sys.sleep(1)
while(as.double(Sys.time())%%3600>0){}
cat('dary!')
jbaums
источник
3

Python 3 - 92 89 байт

from time import*;print("Legen... wait for it...");sleep(3600-time()%3600);print("dary!")
Александр Нигл
источник
3

Python 2, 82 81 байт

from time import*;print'Legen... wait for it...';sleep(-time()%3600);print'dary!'

Слишком низкая репутация, чтобы комментировать. Python 2 версия решения Александра Нигля. Сохраняет символы, потерянные в скобках. Также 3600 не требуется при расчете времени ожидания.

Всего сохранено 7 символов.

Редактировать: -1 байт благодаря @Kevin Cruijssen

Генри Т
источник
1
Один дополнительный байт можно сохранить, удалив завершающий символ ;в конце программы. Кажется, работает нормально без него. :) Хороший ответ, так что +1 от меня (теперь вы можете комментировать).
Кевин Круйссен
спасибо грузы @KevinCruijssen
Генри Т
2

Командный скрипт Windows, 87 байт

@set.=%time:~,2%&echo.Legen... wait for it...
:.
@if %.%==%time:~,2% goto:.
@echo.dary!

Это постоянно сравнивает переменную часа, сохраненную при запуске, с текущим часом и успешно, если отличается.

Роберт Сёрли
источник
2

Perl, 62 байта

sleep -++$^T%3600+print'Legen... wait for it...
';print'dary!'

Специальная переменная $^T(aka $BASETIME) записывает количество секунд с момента начала работы скрипта. К счастью, високосные секунды не учитываются в сумме, поэтому следующие значения эквивалентны:

print$^T%3600;
@T=gmtime;print$T[1]*60+$T[0];

Удивительно, но эта переменная не только для чтения.

Примо
источник
-EКажется, обычным делом не является подсчет , поэтому вы можете сэкономить 5 байт, используя say.
Деннис
Из описания задачи: «Вы можете написать программу или функцию». Код запускается из командной строки.
Примо
Я понимаю вашу точку зрения. Однако ограничение для программ или функций по умолчанию применяется ко всем задачам, однако мы по-прежнему допускаем perl -Eпредставления и языки, на которых есть только онлайн-переводчики.
Деннис
Я не согласен, что -Eдолжно быть разрешено по умолчанию. В большинстве случаев, улучшение в любом случае тривиально и неинтересно.
Примо
2

Japt , 72 61 байт

`{?tT?e?t(Ã?t,36e5-?w D?e%36e5,'ÜÝ!'),'Leg?... Ø2 f? ?...\n'}

Каждый ?представляет Unicode непечатаемый символ. Вот как получить полный текст:

  1. Откройте онлайн переводчик .
  2. Вставьте этот код в поле Код:
Oc"`\{setTimeout(alert,36e5-new Date%36e5,'dary!'),'Legen... wait for it...\\n'}
  1. Запустите код, затем удалите его из поля «Код».
  2. Выберите содержимое поля «Вывод» и перетащите в поле «Код». Копирование-вставка не будет работать .
  3. Замените первый пробел неразрывным пробелом.
  4. (необязательно) Установите часы вашего компьютера на xx: 59.
  5. Запустите код.

В качестве альтернативы вот (надеюсь, обратимый) hexdump:

00000000: 607b a074 548b 658c 7428 c300 742c 3336 65    `{ tT?e?t(Ã?t,36e
00000011: 352d 9a77 2044 8565 2533 3665 352c 27dc dd    5-?w D?e%36e5,'ÜÝ
00000022: 2127 293b 274c 6567 812e 2e2e 20d8 3220 66    !'),'Leg?... Ø2 f
00000033: 8e20 8a2e 2e2e 5c6e 277d                      ? ?...\n'}

Этот код основан на JavaScript-ответе Джорджа Рейта с некоторыми изменениями, специфичными для Джапта. На днях я обнаружил, что если вы сжимаете код и вставляете его в строку, обернутую обратным тэгом, он автоматически распаковывается. Вот как это обрабатывается при компиляции:

`{?tT?e?t(Ã?t,36e5-?w D?e%36e5,'ÜÝ!'),'Leg?... Ø2 f? ?...\n'}
"{setTimeout(alert,36e5-new Date%36e5,'dary!'),'Legen... wait for it...\n'}"
""+(setTimeout(alert,36e5-new Date%36e5,'dary!'),'Legen... wait for it...\n')+""

В JS пара скобок будет возвращать последнее значение внутри; таким образом, этот код устанавливает синхронизированное событие, а затем возвращает 'Legen...'строку, которая автоматически отправляется в STDOUT. Поскольку Japt в настоящее время не имеет возможности добавлять контент в STDOUT, кроме автоматического вывода при компиляции, я вместо этого использовал функцию vanilla JS alertдля синхронизированного вывода. Я надеюсь, что это разрешено.

ETHproductions
источник
Можете ли вы опубликовать hexdump этого?
спагетто
@ quartata Готово. Я считаю, что это правильно.
ETHproductions
2

Powershell, 52 51 байт

-1 байт спасибо @Veskah

'Legen... wait for it...'
for(;Date|% M*e){}'dary!'

Это выражение Date|% M*eполучает значение из Minuteсвойства из значения Current DateTime. Цикл заканчивается, когда Minuteравен 0.

Mazzy
источник
1
Вы должны быть в состоянии поставить 'dary' непосредственно после фигурных скобок, или, по крайней мере, вы можете это сделать в PSv5.
Веска
1

Python, 112 байт

import time as t;print "Legen... wait for it...";n=t.ctime();t.sleep((60-n.tm_min)*60+60-n.tm_sec);print "dary!"

Довольно понятно.

agtoever
источник
Можно сохранить 2, избавившись от пробелов между операторами печати и следующими строками. :)
Генри Т
1

Python - 159 байт

from datetime import*;from threading import*;p=print;n=datetime.now();p('Legen... wait for it...');Timer(3600-(n.minute*60+n.second),lambda:p('dary!')).start()
elzell
источник
1

Мышь-2002 , 62 байта

Требует от пользователя нажать клавишу ввода. Думаю.

"Legen... wait for it..."?&HOUR 1+x:(&HOUR x.=["dary"33!'0^])

Хорошо, хорошо, пока мы берем много байтов и ничего не выигрываем, давайте немного повеселимся.

"Legen... wait for it... "?     ~ print & require keypress

&HOUR 1+ x:                     ~ get hr, add 1 and assign
(                               ~ while(1)
  &HOUR x. =                    ~ cmp current hr, stored hr
  [                             ~ if same
    #B;                           ~ backspace
    "dary"36!'                    ~ print this string and a !
    0^                            ~ exit cleanly
  ]                             ~ fi
  &MIN 59 - &ABS !              ~ get min, subtract from 59, abs & print
  ":"                           ~ record sep
  &SEC 59 - &ABS !              ~ same for second
  #B;                           ~ backspace
)
$B 8!' 8 !' 8 !' 8 !' 8 !'@     ~ backspace 5*
$                               ~ \bye

Образец:

$ mouse legend.m02
Legen... wait for it... 20:32

Видите, это таймер обратного отсчета до следующего часа! Он хорошо использует цикл while, который, даже ничего не делая, будет занимать ядро.

кошка
источник
1

Бейсик, 90 байт

Print"Legen... wait for it...":x$=Left(Time,2):Do:Loop Until x$<>Left(Time,2):Print"dary!"

Прямо, игра в гольф с использованием префиксов типа и неявного Endутверждения. Стоимость в том, что он работает только на диалекте FreeBasicfblite .

user48538
источник
1

Befunge 98 - 69 63 байта

 v
v>a"...ti rof tiaw ...negeL<ETB>"k,
>"EMIT"4(MS+_"!yrad"5k,@

Код содержит один непечатаемый символ (представленный <ETB>как непечатные, кажется, не отображаются в блоках кода). Его код символа - 23 ( символ конца передачи ).

Предупреждение: предыдущий код будет выполняться в цикле занятости, при этом стек увеличивается с каждым повторением и, следовательно, может занимать большие объемы памяти.

pppery
источник
1

Желе , 48 47 байтов , неконкурентный

-1 байт благодаря Эрику Гольфисту (используйте слово "Leg" в качестве слова в сжатии)

“ÇỴġƒḃhlḂṀ⁷*Ḣ¡w*Jḷv»Ṅø3ŒTṣ”:V_@59ḅ60‘œS@“dary!”

TryItOnline! или запустите тестовую версию с жестко закодированной строкой в ​​формате времени“59:57”("mm: ss").

Первый коммит Jelly был сделан Деннисом всего через несколько дней после того, как он создал этот вызов, я не уверен, в какой день этот код сначала сработал бы, но в любом случае он не конкурирует.
На момент написания статьи существует только один способ получить доступ ко времени, используя форматированную строку ŒT.

Этот код вычисляет, как долго ждать, а затем спит. Если вызывается, hh:00:00он ждет 3600несколько секунд: он преобразует "00:00"в, [0,0]затем вычитает это из, 59чтобы уступить [59,59], преобразует это из базового шестидесяти, чтобы дать 3599, затем добавляет один для общего периода ожидания в 3600секундах.

Может быть, петля могла быть сделана; или сжатую строку, использующую целое слово «Легендарный», можно использовать как-нибудь?

“ÇỴġƒḃhlḂṀ⁷*Ḣ¡w*Jḷv»Ṅø3ŒTṣ”:V_@59ḅ60‘œS@“dary!” - Main link: no arguments
“ÇỴġƒḃhlḂṀ⁷*Ḣ¡w*Jḷv»                            - compressed "Legen... wait for it..."
                    Ṅ                           - print z + '\n', return z
                     ø                          - niladic chain separation
                      3ŒT                       - '011' (3) time formatted string = "mm:ss"
                         ṣ”:                    - split on ':' -> ["mm","ss"]
                            V                   - eval -> [m,s]
                             _@59               - subtract from 59 - > [59-m, 59-s]
                                 ḅ60            - convert from base 60 -> 60*(59-m)+(59-s)
                                    ‘           - increment -> 60*(59-m)+(59-s) = y
                                        “dary!” - "dary!" = x
                                     œS@        - sleep y seconds then return x
                                                - implicit print
Джонатан Аллан
источник
1
Используйте “ÇỴġƒḃhlḂṀ⁷*Ḣ¡w*Jḷv»вместо “¤ßƇṪOƭ!½ȯƤxEẹ<Ȯ¹z7⁷». LegLegen) тоже слово :) Кроме того, этот ответ недействителен, потому что он зависит от минут и секунд 00. 4ŒTВместо этого вы должны сделать что-то , так как есть правило, утверждающее это,In the event that the program is started in the first second of a full hour, it should it wait for the next full hour.
Эрик Outgolfer
Круто, "Нога" экономит байт, спасибо. Тем не менее, ссылка работает при вызове, так 00:00как она не проверяет это условие - она ​​рассчитывает сколько секунд до следующего, "00:00"а затем ожидает. Таким образом, он будет конвертироваться "00:00"в [0,0]вычитание из, 59чтобы привести к [59,59]конвертированию, что из базового шестидесяти, чтобы получить, 3599а затем добавить один, чтобы получить 3600(протестируйте его, используя "00:00"вместо него тестовую версию "59:57")
Джонатан Аллан
1
Ой. Кажется, я не могу читать длинный код Jelly, и что я не могу знать, как все используют и чего ожидать :) Хотя, в объяснении, я думаю, что это 60*(59-m)+(59-s)должно быть 60*(59-m)+(59-s)+1вместо этого, во второй раз, когда это появляется?
Эрик Outgolfer
Нет проблем - комментарии не самые ясные, которые я когда-либо писал.
Джонатан Аллан
Ну, если вы не можете взять на себя хлопоты, я могу отредактировать его. Кроме того, я бы порекомендовал сделать x / y как влево / вправо, и просто сказать sleep x seconds then return y- потому что <dyad>@может быть определен как другая диада с помененными местами аргументами.
Эрик Outgolfer
1

MathGolf , 39 байт

"Legen... wait for it..."pÆt♪/╚÷▼"dary!

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

Почти бьют пита ...

объяснение

Æ     ▼  Repeat the next 5 characters while false
 t       push unix time in milliseconds
  ♪/     divide by 1000
    ╚÷   check if divisible by 3600 (tio solution has 3 in its place)
maxb
источник
"Почти"? Похоже, ты сделал.
Патрик Робертс
@PatrickRoberts есть еще одно решение Pyth, которое имеет размер 36 байт и не может получить его даже со сжатыми строками и другими хитростями.
максимум
О, этот. Это неправильно, посмотрите на комментарий.
Патрик Робертс
@PatrickRoberts Я мог бы не выполнить критерий «должен подождать один час, если выполняется в 00:00», но я мог бы изменить его, чтобы проверять Unixtime в миллисекундах, кратных 3600000 с тем же числом байтов. Поскольку первая печать должна занимать более миллисекунда, это всегда должно работать
макс
0

Pyth - 36 байт

Ожидание, пока минуты равняется 0 с циклом while.

"Legen... wait for it..."W.d7)"dary!
Maltysen
источник
11
Вам нужно подождать, пока минуты и секунды не станут :00:00
равными
0

Java, 136 байт

class a{void A(){System.out.println("Legen... wait for it...");while(System.currentTimeMillis()%3600000!=0);System.out.print("dary!");}}

Сколько миллисекунд прошло с последнего часа - результат System.currentTimeMillis()мода 3600000.

Эквивалентная монолитная программа имеет длину 159 байт:

interface a{static void main(String[]A){System.out.println("Legen... wait for it...");while(System.currentTimeMillis()%3600000!=0);System.out.print("dary!");}}
dorukayhan
источник
0

QBIC , 58 байт

?@Legen... wait for it...|#Dary!|{~mid$$|(_d,4,2)=@00||_XB

объяснение

?@Legen... wait for it...|     Define string literal "Leg[..]it..." and print it
#Dary!|                        Define string B as "Dary!", but don't use it yet
{                              Opens an indefinite DO loop
~mid$$|(...)=@00|              Translates to IF MID$(...) = C$, where C$ is "00"
    The MID$ takes two characters, starting from pos 4, from the system's time (_d)
    So, if the string "11:00" has "00" starting at pos 4,
_XB                            Terminate the program and print string B
(The DO loop and the IF are closed implicitly)
steenbergh
источник