Когда случится Брексит?

27

Ну, Брексит случился . И Sky News, будучи гениями, решили создать обратный отсчет на автобусе.

введите описание изображения здесь

Ваша задача сделать что-то подобное. Великобритания покидает ЕС 31 марта 2019 года, и вы должны создать для этого цифровой обратный отсчет, который меняется каждую секунду (с допустимым отклонением 0,05 секунды).

вход

Ваша программа не должна принимать абсолютно никаких данных. Это запрещено!

Выход

Следует вывести время до Brexit в формате ddd:hh:mm:ss. Разрешены начальные и конечные переводы строк, но каждый раз дисплей должен оставаться на одном и том же месте. Это должно выглядеть так, как будто оно на самом деле уменьшается на месте. Как отмечает @AnthonyPham, это не означает, что нужно печатать достаточно новых строк, чтобы «очистить» экран, это означает, что вы действительно должны очистить экран.

Такой вывод не разрешен:

100:20:10:05
100:20:10:04

Это тоже не

100:20:10:05
*A thousand newlines*
100:20:10:04

так как они на более чем одной строке.

Вам не нужно беспокоиться после Brexit. Ваша программа должна работать только до 31/3/2019

правила

  • Стандартные лазейки запрещены
  • Это поэтому выигрывает самый короткий код в байтах .
  • Сообщения об ошибках (хотя я не могу думать как) запрещены
  • Код должен быть в состоянии запускаться через 2 года (когда Великобритания покидает ЕС) и должен отображать фактическое время, а не начинать с 730 (см. Ниже)

Правило обратного отсчета

Обратный отсчет не должен быть жестко запрограммирован и должен быть в состоянии запускаться в любое время до окончания Brexit и при этом давать правильный результат. Когда начинается новый день, час должен соответствовать следующему формату

712:00:00:01
712:00:00:00
711:23:59:59

Позвольте мне еще раз сказать, что дата окончания Brexit - 31/3/2019 в полночь для удобства (31: 3: 19 00:00:00 или 31: 3: 2019 00:00:00 или любой другой формат, который вы хотите)

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

Caird Coneheringaahing
источник
Могу ли я запускать его каждую миллисекунду, но при этом обновляться каждую секунду? Это просто, чтобы сделать мой код короче.
Дэвид Арчибальд
@DavidArchibald говорит только о том, что дисплей должен меняться каждую секунду. Просто большинство ответов будет легче запускать каждую секунду.
caird coinheringaahing
ааа. Ну, я должен поставить, 1000если я хочу, чтобы он менялся раз в секунду. Спасибо
Дэвид Арчибальд
Требуются ли ведущие нули?
Лохматый
1
Полночь какой часовой пояс: UCT или GMT? Должны ли мы это учитывать?
Тит

Ответы:

12

JavaScript, 134 129 113 байтов

setInterval("d=-new Date;document.body.innerHTML=`<pre>${d/864e5+17986|0}:`+new Date(d).toJSON().slice(11,19)",1)

Редактировать: 2 байта сохранены благодаря @Shaggy. Сохранено 11 байтов благодаря @ l4m2.

Нил
источник
Успел победить тебя @Neil ... на несколько байтов.
Дэвид Арчибальд
Почему бы не использовать <a id=0>? Или что-то типа того?
Соломон Уко
3
Или даже document.body.innerHTMLвместоo.innerHTML
cloudfeet
1
Я хотел, чтобы он был моноширинным, чтобы дисплей оставался на том же месте, но я думаю, что смогу сохранить байт и использовать его <tt>.
Нил
3
Вы можете сэкономить 2 байта, выполняя код каждую миллисекунду (или 2, или 3 ...).
Лохматый
11

PowerShell, 70 63 55 53 байта

Исключенные двойные кавычки, легко -2 благодаря @Joey

for(){cls;(date 31Mar19)-(date)|% T* ddd\:hh\:mm\:ss}

Выполнение этого со сном добавляет 8 байтов, но ввод в большинстве случаев невидим, если он выполняется без них, версия (63 байта) со сном:

for(){cls;(date 31/3/19)-(date)|% T* ddd\:hh\:mm\:ss;sleep 1}

for() это бесконечный цикл, и внутри этого цикла ..

cls очистить экран,

получить 31/3/19как DateTimeобъект и -текущую дату от него, дать оставшееся время, затем .ToString()( |% T*) это с правильным форматом.

это будет отображать отрицательное время после брексита.

colsw
источник
Это также зависит от локального формата даты. Хотя британский формат dd / m / yy подходит, imo, он не будет работать как есть на машинах в США. Мне любопытно, как T*работает. Я не знаком с этим.
Джоэл Кохорн
@JoelCoehoorn Это хороший трюк, %foreach фактически выбирает Tобъект oString и принимает следующую строку в качестве аргумента. Что касается формата даты и времени, почему он не работает на машинах в США? Я думал, что и ddт.д. были нечувствительны к культуре.
colsw
Он пытается найти месяц # 31 на моей машине. Работает нормально, если я изменю его на 3/31/19. Также будет работать 2019-03-31где угодно, но это стоит вам несколько байтов.
Джоэл Коухорн
@JoelCoehoorn ну правильно - извините, я думал о выводе, обновлен до, 31Mar19вместо 31/3/19которого следует надеяться исправить это?
colsw
1
Вы можете потерять кавычки вокруг строки формата, так как применяется разбор аргументов команды.
Джои
7

Excel VBA, 91 84 82 байта

Сохранено 7 байтов благодаря тому, что JoeMalpass указал, что Excel видит даты в виде чисел.
Сохранено 2 байта благодаря JoeMalpass

Sub b()
Do
t=CDec(43555-Now)
Cells(1,1)=Int(t) &Format(t,":hh:mm:ss")
Loop
End Sub

Вывод в ячейку A1в активном листе Excel.

Инженер Тост
источник
-6 байт путем замены ("2019-3-31")с (43555). Однако, когда я пытаюсь запустить это в Excel, он
останавливается
1
@JoeMalpass Спасибо, это хороший момент. Он выглядит и через несколько секунд для меня, потому что он вычисляет намного быстрее, чем 1 в секунду. Добавление задержек, тем не менее, добавляет байты, и ОП не говорит, что должен иметь возможность непрерывного обратного отсчета с настоящего момента до момента выхода на рынок Брексита, не поджигая ничего.
Инженер Тост
Видимо Nowработает без ()слишком ...
CactusCake
6

Python 3.6, 146 байт

from datetime import*
x=datetime
while 1:d=x(2019,3,31)-x.now();s=d.seconds;a=s%3600;print(end=f"\r{d.days:03}:{s//3600:02}:{a//60:02}:{s%60:02}")
овс
источник
5

C #, 173 172 156 150 127 байтов

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:d\\:hh\\:mm\\:ss}  ");}}

Сохранено 16 байтов благодаря @Bob. Сохранено 6 байтов благодаря @ Søren D. Ptæus

Отформатированная версия:

using System;

class P
{
    static void Main()
    {
        for (;;)
            Console.Write($"\r{new DateTime(2019, 3, 31) - DateTime.Now:d\\:hh\\:mm\\:ss}  ");
    }
}
TheLethalCoder
источник
Вы можете сделать (TimeSpan)0? На телефоне не могу проверить прямо сейчас. Вы все еще можете сбросить клир, так как возврат каретки позаботится об этом: он вернет курсор в начало строки.
Боб
2
Мысль: полагаться на CR может не получиться, если длина изменится (менее 100 дней). Исправлено: добавить два лишних пробела подряд.
Боб
@Bob Я забыл удалить Clear! Я такой глупый. И никто не может перейти intк тому, TimeSpanчто я уже пробовал.
TheLethalCoder
Вы можете сохранить 6 байтов записи (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Сёрен Д. Птюс,
@ SørenD.Ptæus Хорошая идея даже не подумала об этом
TheLethalCoder
4

JavaScript ES5, 320 319 316 305 295 284 байта

setInterval(function(){a=Math,b=a.floor,c=console,d=Date,e="00",f=new d(2019,2,31),g=a.abs(f-new d)/1e3,h=b(g/86400);g-=86400*h;var i=b(g/3600)%24;g-=3600*i;var j=b(g/60)%60;g-=60*j,c.clear(),c.log((e+h).slice(-3)+":"+(e+i).slice(-2)+":"+(e+j).slice(-2)+":"+(e+a.ceil(g)).slice(-2))})

Спасибо @Fels за ссылки Math, @dgrcode за ссылкиconsole

Un-golfed

setInterval(function() {

  var math = Math, floor = math.floor, c = console, d = Date;

  var leadings = "00";

  // set our brexit date
  var brexit = new d(2019, 2, 31);

  // get total seconds between brexit and now
  var diff = math.abs(brexit - new d()) / 1000;

  // calculate (and subtract) whole days
  var days = floor(diff / 86400);
  diff -= days * 86400;

  // calculate (and subtract) whole hours
  var hours = floor(diff / 3600) % 24;
  diff -= hours * 3600;

  // calculate (and subtract) whole minutes
  var minutes = floor(diff / 60) % 60;
  diff -= minutes * 60;

  // what's left is seconds

  // clear the console (because OP said it must print in the same place)
  c.clear();

  // log the countdown, add the leadings and slice to get the correct leadings 0's
  c.log((leadings + days).slice(-3) + ":" + (leadings + hours).slice(-2) + ":" + (leadings + minutes).slice(-2) + ":" + (leadings + math.ceil(diff)).slice(-2));

});

cnorthfield
источник
2
Вы можете немного сэкономить мое переименование Math какg=Math;
Fels
Похоже, псевдоним Mathможет все еще сохранить 2 байта, верно?
Мари
Вы можете сэкономить немного больше, используя функции стрелок и избавляясь от var. Кроме того, выбирайте более короткие имена для переменных, например hвместо hoursили mвместо minutes. Вероятно, выполнение c=consoleсэкономит еще пару байтов. Также 1e3вместо1000
Даниэль Рейна
4

PHP, 84 байта

for(;$c=DateTime;)echo(new$c('@1553990400'))->diff(new$c)->format("\r%a:%H:%I:%S ");

Довольно просто. 1553990400 является меткой времени для 31-3-2019 00:00:00 в UTC. Он зацикливается бесконечно, используя DateTime-> diff () -> format () для вывода количества оставшегося времени. После того, как произошел Brexit, он начнет отсчитывать от 0.

Комментируемая / более читаемая версия:

// Infinite loop, assign DateTime (as a string) to $class
for (; $class = DateTime;) {
    echo (new $class('@1553990400')) // Create a new DateTime object for the brexit date/time.
            ->diff(new $class) // Caulculate the difference to the current date/time.
            ->format("\r%a:%H:%I:%S "); // Format it according to the specification, starting with a \r character to move to the start of the line and overwrite the previous output.
}
chocochaos
источник
Новый здесь, и собираюсь опубликовать свой собственный ответ. Несколько вещей: 1. Разрешено ли нам опускать <?тег здесь? 2. Я думаю, что ваши круглые скобки неверны, сейчас вы вызываете ->diffэхо, а не объект DateTime. 3. эхо работает без скобок в любом случае. 4. Даже после исправления, это не работает для меня, но я новичок в гольфе, так что я могу быть идиотом.
Sworrub Wehttam
1
Просто запустите его и посмотрите, он работает нормально, в соответствии с требованиями. Нет необходимости сбрасывать при запуске PHP из командной строки. В начале строки есть символ \ r для перемещения курсора в начало строки, он продолжает перезаписывать ранее выведенное время. Это тот же метод, который используют многие другие ответы здесь.
chocochaos
1
Извините, я пропустил ваш первый комментарий. Да, нам разрешено опускать открывающие теги, если нет необходимости предоставлять полную программу. Скобки просто так, как они есть. Да, эхо работает без него, но вызов diff для объекта DateTime не работает без них. Здесь все работает нормально, какую версию PHP вы используете и как запускаете программу? :)
chocochaos
1
Вы можете проверить некоторые сообщения здесь: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos
1
Это почти все, спасибо за понимание :)
Sworrub Wehttam
4

CJam, 69 62 59 57 байт

Сохранено 7 байт путем преобразования в формат времени по-другому

Сохранено 3 байта благодаря предложениям Мартина Эндера

Сохранено 2 байта с использованием возврата каретки вместо пробелов

{15539904e5esm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco1}g

Не может быть запущен на TIO по понятным причинам.

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

Эта 70-байтовая версия печатается только один раз в секунду:

{15539904e5es:Xm1e3/{60md\}2*24md\]W%{sYTe[}%':*CTe[oDco{esXm1e3<}g1}g

объяснение

{                           e# Begin a while loop
  15539904e5                e#  The timestamp on which Brexit will occur
  es                        e#  The current timestamp
  m                         e#  Subtract
  1e3/                      e#  Integer divide by 1000, converting to seconds from ms
  {                         e#  Run this block twice
   60md                     e#   Divmod by 60
   \                        e#   Swap top elements
  }2*                       e#  (end of block) 
                            e#    This block divmods the timestamp by 60, resulting in 
                            e#    the remaining minutes and seconds. Then the minutes get 
                            e#    divmod-ed by 60, to get hours and minutes remaining
  24md\                     e#  Divmod hours remaining by 24 and swap top elements, to get
                            e#    the hours left and days left.
  ]                         e#  Wrap the entire stack in an array
  W%                        e#  Reverse it since it's currently in the wrong order
  {                         e#  Apply this block to each element of the array
   s                        e#   Cast to string (array of digit characters)
   YTe[                     e#   Pad to length 2 by adding 0s to the left
  }%                        e#  (end of map block)
  ':*                       e#  Join with colons
  CTe[                      e#  Pad to length 12 by adding 0s to the left, dealing with the
                            e#    special case of the day being 3 digits. 
  o                         e#  Pop and print the resulting string, which is the time
  Dco                       e#  Print a carriage return, moving the cursor back to the start
  1                         e#  Push 1
}g                          e# Pop 1, if it's true, repeat (infinite loop)
Бизнес Кот
источник
Не удается проверить прямо сейчас, но вы , вероятно , можно заменить Abс s, и сохранить байт, делая 1e3/первый , а затем разделить в порядке обратном 60md\60md\24md\]W%.
Мартин Эндер
@MartinEnder Да, они оба работают. Спасибо
Business Cat
Ох и {60md\}2*спасает другого.
Мартин Эндер
3

Python 3.5 (118 байт)

import datetime as d,os
d=d.datetime
while 1:os.system("cls");e=str(d(2019,3,31)-d.today());print(e[:3]+':'+e[-15:-7])
officialaimm
источник
3

C # 6, 149 байт

Спасибо Бобу за сохранение 57 байтов!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");}}

Нежелтая программа:

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write($"\r{x-a:ddd\\:hh\\:mm\\:ss}");
    }
}

C #, 210 206 159 байт

Спасибо Бобу за сохранение еще 47 байтов!

Спасибо Мартину Смиту за сохранение 4 байта!

using System;class P{static void Main(){DateTime a,x=new DateTime(2019,3,31);while((a=DateTime.Now)<x)Console.Write("\r"+(x-a).ToString(@"ddd\:hh\:mm\:ss"));}}

Нежелтая программа:

using System;

class P
{
    static void Main()
    {
        DateTime a,
                x = new DateTime(2019, 3, 31);
        while ( (a = DateTime.Now) < x)
            Console.Write("\r" + (x - a).ToString(@"ddd\:hh\:mm\:ss"));
    }
}
adrianmp
источник
1
new DateTime(2019,3,31)короче
Мартин Смит
1
Кроме того, можно удалить Console.Clearи вместо того, чтобы предварять "\r"в строку, например"\r"+(x-a)...
Боб
1
Дополнительные улучшения: (x-a).ToString(@"d\:hh\:mm\:ss")эквивалентно `String.Format (" \ r {0: d \\: чч \\: мм \\: ss} ", xa)` эквивалентно $@"{x-a:d\:hh\:mm\:ss}"(более короткая интерполированная строка в C # 6.0). Если вы сделаете это, вы можете в дальнейшем сократить полный "\r"+$@"{x-a:d\:hh\:mm\:ss}"в $"\r{x-a:d\\:hh\\:mm\\:ss}".
Боб
1
@TheLethalCoder Я воспринял это как недопустимый «фальшивый» подход с несколькими символами новой строки. Возврат каретки все еще перезаписывает единственное на экране. По крайней мере, еще один ответ также использует этот подход. Также можно удалить сон , как это важно только , что дисплей меняется один раз в секунду, с не изменяющими обновлениями разрешенных (см комментариев вопроса). редактировать: на самом деле, комментарии к вопросу также явно разрешают CR ...
Боб
1
@Bob Извините, я прочитал ваше предложение как новую строку, моя ошибка. Но да, сон можно убрать
TheLethalCoder
3

C 104 байта

main(x){for(;x=1553990400-time(0);)printf("\n%03d:%02d:%02d:%02d\e[1A",x/86400,x/3600%24,x/60%60,x%60);}

Сломать

main(x){
    for(;x=1553990400-time(0);)             // Seconds remaining
        printf("\n%03d:%02d:%02d:%02d\e[1A",// Move cursor and print:
            x/86400,                        // Days
            x/3600%24,                      // Hours
            x/60%60,                        // Minutes
            x%60);                          // Seconds
    puts("Now we can stop talking about it forever."); // Wishful thinking
}

Полагается на timeвозвращаемое количество секунд с 01.01.1970, что имеет место для меня (с использованием Clang / GCC на macOS) и должно иметь место для большинства вещей UNIX.

Использует escape-последовательности терминала bash для перемещения курсора ( <esc>[1Aперемещает курсор на 1 строку вверх). Было бы лучше иметь возможность просто использовать \r, но printfне будет сбрасывать, пока не увидит новую строку, а очистка вручную требует намного больше.

Вероятно, самый интенсивный процессорный отсчет, который я когда-либо видел. Работает в горячем цикле, чтобы убедиться, что он всегда настолько точен, насколько это возможно. Если запустить после крайнего срока, он будет производить довольно странные вещи (негативы везде!)

Дейв
источник
@TobySpeight уверен, исправлено. Я думаю о них как о bash, потому что я всегда использую эту справочную страницу: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Дейв
Есть ли правила для формы main в C? В C90: исключение возврата из основных причин UB в случае, если вызывающая сторона (ОС) будет использовать возвращаемое значение. В стандарте C: main(x)недопустимая форма main, неявный int был удален из языка. Я считаю, что минимальная, безопасная версия int main(){}.
Лундин
@Lundin в коде гольф, языки определяются их реализацией (то есть, если вы можете найти общедоступный компилятор, который компилирует код так, как вы хотите, вы можете сделать это, но если ему нужна нестандартная установка флагов, эти флаги будут учитываться в вашем ByteCount). Вы правы в том, что это далеко не соответствует стандартам (а также то, что вы заметили, есть неявно определенные функции из-за отсутствия импорта и зависимости от времени, возвращающегося через несколько секунд с 01.01.1970 г.). Взгляните на мета для (скорее разошедшихся) правил, которым люди следуют здесь.
Дейв
Часть удовольствия от кода игры в гольф - это обнаружение странных языковых взломов и устаревших функций!
Дейв
3

AHK , 145 байт

Это не самый короткий ответ, но результат дает очень приятное чувство обреченности, я думаю. Первоначально я пытался отправить нажатия клавиш Ctrl+ A, DELа затем, в любое время, но частота обновления была слишком медленной, и это разрушило бы любую среду, в которой вы были. Вместо этого я перешел с графическим интерфейсом. Оказалось, что для полного разрушения окна и его воссоздания потребовалось меньше байтов, чем для обновления управления снова и снова, поэтому я пошел на это. Это хороший эффект.

Loop{
s=20190331000000
s-=A_Now,S
d:=t:=20000101000000
t+=s,S
d-=t,D
d*=-1
FormatTime f,%t%,:HH:mm:ss
GUI,Destroy
GUI,Add,Text,,%d%%f%
GUI,Show
}

Я спою песню обреченности!

Инженер Тост
источник
3

C #, 128 127 байт

using System;class P{static void Main(){for(;;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");}}

Ungolfed код:

using System;
class P
{
    static void Main()
    {
        for(;;)
            Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"); 
    }
}

Я бы не понял трюк без помощи других ответов C # здесь.

Для тех, кто ищет дальнейших улучшений, вы можете также поместить выражение Write () в цикл for. Похоже, я должен быть в состоянии каким-то образом сохранить байт здесь, потому что это спасает меня точкой с запятой для этого оператора, но это работает к тому же числу, потому что вы не можете иметь полностью пустое тело:

using System;class P{static void Main(){for(;;Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"));}}
Джоэл Коухорн
источник
Добро пожаловать в PPCG!
Мартин Эндер
Вы все еще можете сохранить один символ, используя интерполированную строку;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Боб
Хорошо сыграв, я попытался найти способ использовать цикл while (true) в самом коротком коде! Я запомню этот трюк. Возможно, вам придется добавить пару пробелов, как я сделал, хотя в вашей записи, в противном случае, когда дни переходят от 3 цифр к 2 цифрам, он не будет перезаписывать последний символ вашей строки времени, и вы получите странный вывод
NibblyPig
Вы можете сохранить байт, используя интерполированную строку, как в моем ответе. Ваш формат dddпрокладок с нулями выглядит лучше, чем метод двух пробелов.
TheLethalCoder
Обновлено для интерполированной строки.
Джоэл Коухорн
3

Рубин (83 байта)

loop{h=431664-Time.now.to_r/3600;$><<['%02d']*4*?:%[h/24,h%24,h%1*60,h*3600%60]+?\r}

Ungolfed

loop do
  seconds = 1553990400 - Time.now.to_r

  print (["%02d"] * 4).join(':') % [
    seconds / 24 / 60 / 60     ,
    seconds      / 60 / 60 % 24,
    seconds           / 60 % 60,
    seconds                % 60,
  ] + "\r"
end

В основном одно из представлений Python, с некоторыми улучшениями. Мы просто посылаем "\ r", чтобы перейти в начало строки перед повторным рендерингом. А что касается формата строки "%03d:%02d:%02d:%02d", нам действительно безразлична ширина первого спецификатора… поэтому мы можем просто сделать это "%02d"*4, и создать пробел и пробел, чтобы очистить лишние лишние двоеточия.

Кроме того , я нашел два-символа короче print: $><<. $>является сокращенным глобальным для $defout, который является выходным потоком для printи printfи по умолчанию STDOUT. IO#<<пишет правую часть этого потока. Как эти два символа короче? Ну, теперь я могу опустить пробел, который был перед скобкой, заключающей строку формата.

На данный момент я искренне считаю, что в Ruby нет возможности сократить эту программу дальше.

Редактировать: я был неправ. Вместо первых Time.new(2019,3,31), мы можем просто использовать сырое время UNIX: 1553990400.

Редактировать 2: я попытался поиграть с разложением минут и делением метки времени UNIX на эту константу, но на самом деле это не приводит к экономии байтов. :(

Редактировать 3: Оказывается, кэширование на h=3600самом деле больно мне два байта. Упс.

Редактировать 4: 3 байта сохранены благодаря @EricDuminill. Он использовал поплавки, но рациональные работали без потери точности!

Редактировать 5: Array#*как псевдоним для Array#join, с Ruby ?-синтаксисом для отдельных символов!

Стивен Таусет
источник
Работа с часами вместо секунд, кажется, экономит 3 байта: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}секунды могут быть отключены на 1, хотя, из-за округления.
Эрик
Благодарность! Связан с PHP сейчас. :) Я использовал to_rвместо того, to_fчтобы сохранить точность.
Стивен Таусет
Пожалуйста. Эти часы все еще могут быть на 1 секунду раньше, хотя даже .to_rвместо.to_f
Эрик
@StephenTouset Вы можете перейти +"\r"вправо от массива. Это позволяет вам использовать ['%02d']*4*?:вместо '%02d:'*4+"\b "так, чтобы вы могли потерять скобки, что дает вам один байт. Сохраните еще один байт, написав +?\rвместо +"\r".
Синоли,
Отличное открытие!
Стивен Таусет
2

JavaScript + HTML, 136 + 7 = 143 байта

setInterval("d=1553990400-new Date/1e3|0;w.innerText=[60,60,24,999].map(z=>(q='00'+d%z,d=d/z|0,q.slice(z<61?-2:-3))).reverse().join`:`")
<a id=w
user12864
источник
Счет делает это ... любовным байтом ?
Инженер Тост
2

C #, 142 байта

using System;class P{static void Main(){a:Console.Write($"\r{(new DateTime(2019,3,31)-DateTime.Now).ToString("d\\:h\\:mm\\:ss  ")}");goto a;}}

Нежелтая программа:

using System;
class P
{
    static void Main()
    {
        a: Console.Write($"\r{(new DateTime(2019, 3, 31) - DateTime.Now).ToString(@"d\:h\:mm\:ss  ")}"); goto a;
    }
}
NibblyPig
источник
Это не прекратит печать, когда попадет на брексит, не уверен, что это проблема
TheLethalCoder
@TheLethalCoder Это законно. В инструкциях специально указано, что код должен работать только до 31/3/2019, и что после этого не имеет значения. Если вы можете сэкономить байты, получая странные выходные данные или даже исключения после этой даты, тогда вам больше возможностей.
Джоэл Коухорн
Кроме того: я подозреваю, что можно будет добиться этого даже закорачивания, пропустив ToString()байты и вместо этого
встроив
Хорошо ... это определенно возможно. У меня это до 127 байтов. Я добавляю его ниже вашего оригинала, так что вы все еще получаете кредит на основную gotoидею.
Джоэл Коухорн
Моя редакция уничтожена :( Думаю, мне придется опубликовать свой собственный ответ.
Джоэл Кехорн
2

Bash + GNU date, 128 байт

2 байта были сброшены благодаря @muru, а 2 - раньше благодаря @This Guy.

C=:%02d;while sleep 1;do D=$[B=3600,A=24*B,1553990400-`date +%s`];printf "%03d$C$C$C\r" $[D/A] $[D%A/B] $[D%A%B/60] $[D%60];done

Ungolfed

DAY=86400
HOUR=3600
while sleep 1 ; do
 DIFF=$[1553990400-`date +%s`]
 printf "%03d:%02d:%02d:%02d\r" \
         $[DIFF/DAY] \
         $[DIFF%DAY/HOUR] \
         $[DIFF%DAY%HOUR/60] \
         $[DIFF%60]
done
Стив
источник
1
Никогда golfed в Bash и раньше , но вы можете удалить пробелы в то время как: while[1]?
caird coinheringaahing
Справедливо, теперь уже попробовали, но это приводит к line 1: [1]: command not foundошибке. Пробелы обязательны, кажется :-(
Стив
2
Назначить 3600переменную для сохранения 2 байта? Вы могли бы также быть в состоянии изменить , B=3600;A=86400чтобы B=3600;A=24*Bеще байт?
caird coinheringaahing
3600 переменных теперь сделано, спасибо. 24 * B, A=$[24*B]возможно, там было бы невозможно, хотя
Стив
1
C=:%02d;printf "%03d$C$C$C\r"сохранить байт? И переместите назначения в A и B в арифметическом контексте: D=$[B=3600,A=24*B,1553990400-`date +%s`]чтобы сохранить другое?
Муру
2

MATL, 45 байт

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDXxT

TIO, очевидно, не поддерживает очистку вывода, но, к счастью, MATL Online делает !

На 2 байта больше, немного более дружественная к процессору версия, которая делает pause(спит) каждую секунду:

737515`tZ'-tkwy-':HH:MM:SS'XOw'%03d'YDwYcDT&XxT

Попробуйте это на MATL Online

737515«31 марта 2019 года» соответствует стандартному формату эпохи MATLAB - количество дней с 0 января 0000, необязательно включая дробную часть для представления времени суток. (Я попытался сократить это, рассчитав его каким-то образом, но его единственными факторами являются 5 и еще одно шестизначное число (147503), и я не мог найти способ сделать это менее чем за 6 байтов.)

`    % start do-while loop
tZ`- % duplicate Brexit date, get current date (& time), subtract
tk   % duplicate the difference, get the floor of it (this gives number of days left)
w    % switch stack to bring unfloored difference to top
y    % duplicate the floored value on top of that
-    % subtract to get fractional part representing time
':HH:MM:SS'XO % get a datestr (date string) formatted this way
w    % switch to bring number of days back on top
'%03d'YD      % format that to take 3 places, with 0 padding if needed
wYc  % switch to bring time string back on top, concatenate date and time
D    % display the concatenated result!
T&Xx % clear screen after a 1 second pause (the pause is optional, without it the call is `Xx`)
T    % push True on stack to continue loop
sundar - Восстановить Монику
источник
1

PHP, 64 байта

while($d=1553990401-time())echo--$d/86400|0,date(":H:i:s\r",$d);

Это будет считаться точно до, 0:00:00:00а затем перерыв / выход. Беги с -r.

-2 байта, если бы мне не пришлось печатать 0.

Titus
источник
1

RPL, 83 78 байт

Предполагая, что ваш HP48 или аналогичный, настроен с правильным (Великобритания) временем и датой, форматом мм / дд и 24-часовым форматом:

WHILE 1REPEAT DATE 3.302019DDAYS":"1.1 24TIME HMS- TSTR 15 23SUB + + 1DISP END

Я был удивлен, что смог сэкономить 2 байта, удалив пробелы вокруг ":". 1.1 - самая короткая действительная дата, позже сброшенная SUB. Будьте осторожны с эмуляторами, время может идти быстрее или медленнее (или не работать вообще), чем ваши настенные часы. С настоящим HP вы можете остановить эту программу, нажав клавишу ON ... или дождаться разрядки батарей.

Перламутр
источник
0

PHP, 102 95 90 байт

Сохранено 7 байт благодаря @TheLethalCoder и без факторинга

Сохранено еще 5 байтов путем объединения

<? $b=1553990400-time();echo floor($b/$d=86400).date(':H:i:s', $b%$d);header('Refresh:1');

Это мой первый гольф, так что я, вероятно, пропускаю немало хитростей, но здесь вы все равно.

Что касается PHP-ответа @chocochaos, который иначе бы превзошел это, я считаю, что он ошибочен по причинам, которые я объяснил в своих комментариях, но, поскольку я здесь новичок, я могу ошибаться. Или я просто новичок :)

Sworrub Wehttam
источник
Вам может понадобиться закрывающий тег? (Не уверен в этом). Вы используете только $aодин раз, так что можно использовать номер на месте. Я не слишком знаком с php, но похоже, что может быть больше улучшений
TheLethalCoder
Что вы имеете в виду flawed because of reasons stated in the comments? Если вы имеете в виду комментарии к их ответу, вы единственный, кто прокомментировал.
caird coinheringaahing
@TheLethalCoder Закрывающий тег не требуется. И хороший!
Sworrub Wehttam
1
Вы можете сохранить ~ 7 байт, используя <?=открывающий тег и отбрасывая эхо, назначая $bместо, где вы впервые его используете. Кроме того, вы можете сохранить 3 байта, используя ^0вместо floor. Это побитовое или включает в себя приведение к int, это самый короткий способ приведения к int, который я видел.
user59178
1
Мой ответ работает отлично :) Кроме того, вы можете прочитать некоторые сообщения здесь: codegolf.meta.stackexchange.com/questions/tagged/php Также нет необходимости открывать теги. Я действительно рекомендовал бы написать ваше решение таким образом, чтобы оно запускалось из командной строки, тогда вам не пришлось бы возиться с заголовками для обновления. Это обновление также приведет к тому, что ваше решение время от времени «пропускает» секунду, поскольку оно не учитывает время, потерянное на сам запрос.
chocochaos
0

AWK , 78 байт

BEGIN{for(;v=1552953600-systime();printf"\r%d:%s",v/86400,strftime("%T",v)){}}

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

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

К вашему сведению, ссылка TIO работает не очень хорошо, поскольку она не реализована \rдолжным образом.

Роберт Бенсон
источник
0

F #, 142 байта

open System
let f=
 let t=DateTime(2019,3,31)
 while DateTime.Now<=t do Console.Clear();t-DateTime.Now|>printf"%O";Threading.Thread.Sleep 1000

Я вырос в Ирландии примерно в полукилометре от границы. Помимо знака «Добро пожаловать в Ферману» и смены дорожной разметки, вы не знали бы, что въехали в другую страну. Раньше пересекала его дважды по дороге в школу.

Ciaran_McCarthy
источник
0

c, gcc 114 байт

main(s){system("clear");if(s=1553900399-time(0)){printf("%d:%d:%d:%d\n",s/86400,s/3600%24,s/60%60,s%60);main(s);}}

Ничего не опущено, полная программа. Программа компилируется в gcc на Ubuntu. Обратный отсчет не покажет длинный след операторов печати из-за системного вызова очистки и остановится, когда обратный отсчет достигнет 0 секунд.

UnGolfed

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>


//Brexit countdown timer
int main(){
  int sec = 1553900400 - time(0);//seconds remaining until Brexit
  if(sec){
    sleep(1);
    system("clear");
    printf("Brexit Countdown\n");
    printf("days Hours Mins Secs\n");
    printf("%d:  %d:    %d:  %d\n",
            sec/86400, sec/3600%24,
            sec/60%60, sec%60);
    main();
  }
}
Geo
источник