Коли відбудеться Brexit?


27

Що ж, стався Brexit . А 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.03.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: Я думаю, що у мене є все, але я не публікував це в пісочниці, інакше терміни могли бути вимкнені. Не соромтеся публікувати будь-які пропозиції щодо вдосконалень, оскільки це не ідеально.


Чи можу я запускати її кожну мілісекунду, але все ж давати вигляд оновлення щосекунди? Це лише для того, щоб скоротити мій код.
Девід Арчібальд

@DavidArchibald говорить лише про те, що дисплей повинен змінюватися щосекунди. Просто більшість відповідей буде легше бігати щосекунди.
caird coinheringaahing

ах. Ну, я повинен поставити, 1000якщо я хочу, щоб він мінявся раз на секунду. Спасибі
Девід Арчібальд

Чи потрібні провідні нулі?
Shaggy

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*), що з правильним форматом.

це відобразить негативний час після brexit.


Це також чутливе до локального формату дати. Хоча формат Великобританії dd / m / yy відповідний, imo, він не працюватиме так, як є на машинах США. Мені цікаво, як T*працює. Я з цим не знайомий.
Joel Coehoorn

@JoelCoehoorn Це приємний трюк: %foreach насправді підбирає ToString об’єкт і прийме наступний рядок як його аргумент. стосовно формату дати, чому він не працює на машинах США? Я думав, що ddі т. Д. Були нечутливими до культури.
colsw

Він намагається знайти місяць №31 на моїй машині. Добре працює, якщо я його зміню 3/31/19. Також буде працювати 2019-03-31де завгодно, але це коштує вам декількох байт.
Joel Coehoorn

@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, він завмирає приблизно через 5-6 секунд ...
CactusCake

1
@JoeMalpass Дякую, це хороший момент. Він також шукає через кілька секунд для мене, тому що це обчислюється набагато швидше, ніж 1 / секунда. Додавання затримок, однак, додає байтів, і ОП не говорить про те, що відтепер до Brexit потрібно безперервно рахувати, не підпалюючи нічого.
Інженер Тост

Мабуть, 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}  ");
    }
}

Можна зробити (TimeSpan)0? На телефоні зараз не можна перевірити. Ви все ще можете скинути прозоре, оскільки повернення каретки піклується про це: він повертає курсор назад на початку рядка.
Боб

2
Думка: покладатися на CR може не вдається, якщо тривалість зміниться (менше 100 днів). Виправлення: додайте два додаткових пробіли в кінці.
Боб

@Bob я забув видалити Clear! Дурний мене. І ніхто не може перетворитись intна те, що TimeSpanя вже спробував це.
TheLethalCoder

Ви можете зберегти 6 байт (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus

@ 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

Без гольфу

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

});


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 () -> (), щоб вивести скільки часу залишилось. Після того, як 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.
}

Нове тут, і ось-ось, щоб розмістити власну відповідь. Кілька речей: 1. Чи дозволено нам опустити <?тег тут? 2. Я думаю, що ваші круглі дужки неправильні, зараз ви викликаєте ->diffехо, а не об’єкт DateTime. 3. Ехо працює без дужок в будь-якому випадку. 4. Навіть після того, як виправити це, це не працює для мене, але я новачок у гольфі, щоб я міг бути ідіот.
Sworrub Wehttam

1
Просто запустіть його і подивіться, він працює добре, відповідно до вимог. Під час запуску PHP з командного рядка не потрібно змивати. На початку рядка є \ r, щоб перемістити курсор до початку рядка, він продовжує перезаписувати раніше виведений час. Це той самий метод, який використовують тут багато інших відповідей.
chocochaos

1
Вибачте, я пропустив ваш перший коментар. Так, нам дозволяється опускати теги, що відкриваються, якщо тільки немає вимоги надати повну програму. Дужки просто добре, як вони є. Так, ехо працює без нього, але виклик різниці на об'єкті 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 Так, вони обоє працюють. Спасибі
Ділова кішка

О, і {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])

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

1
new DateTime(2019,3,31)коротше.
Мартін Сміт

1
Ви також можете видалити Console.Clearта замість цього додати "\r"рядок, наприклад"\r"+(x-a)...
Bob

1
Більше вдосконалень: (x-a).ToString(@"d\:hh\:mm\:ss")еквівалентно `String.Format (" \ r {0: d \\: hh \\: mm \\: 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.

Для переміщення курсору використовує послідовність вхідних терміналів bash ( <esc>[1Aпереміщує курсор на 1 рядок). Було б приємніше просто користуватися \r, але printfне буде розмиватися, поки не побачить новий рядок, а його промивання вручну займе набагато більше.

Напевно, найбільш інтенсивний відлік процесора, який я коли-небудь бачив. Працює в гарячій петлі, щоб переконатися, що це завжди настільки точно, наскільки це можливо. Якщо запустити після закінчення терміну, це створить деякі досить дивні речі (негативи скрізь!)


@TobySpeight впевнений, виправлено. Я вважаю їх як баш, тому що я завжди користуюся цією довідковою сторінкою: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Дейв

Чи є правила щодо форми головного в С? У C90: опускання повернення з основних причин UB у випадку, якщо абонент (ОС) буде використовувати значення повернення. У стандарті C: main(x)невірна форма основної, неявний int був видалений з мови. Я вважаю, що мінімальна, безпечна версія int main(){}.
Лундін

@Lundin у коді гольфу, мови визначаються їх реалізацією (тобто, якщо ви можете знайти загальнодоступний компілятор, який компілює код, як хочете, ви можете це зробити, але якщо він потребує нестандартного налаштування прапорів, ці прапори зараховуються до вашого побічний рахунок). Ви правильні, що це майже ніколи не відповідає стандартам (як і те, що ви помітили, є неявно визначені функції через відсутність імпорту та залежність від часу, який повертається протягом декількох секунд з 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}");}}

Невикористаний код:

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

Добре зіграний, я намагався знайти спосіб (справжній) цикл в найкоротшій мірі коду! Я згадаю цю хитрість. Можливо, вам потрібно буде додати пару пробілів, як я зробив, хоча до вашого запису в іншому випадку, коли дні переходять від 3-х до 2-х цифр, це не перезаписує останній символ вашого часового рядка, і ви отримаєте дивний вихід
NibblyPig

Ви можете зберегти байт, використовуючи інтерпольований рядок, як у моїй відповіді. Ваш формат dddколодок нулів, виглядає краще, ніж метод з двох пробілів.
TheLethalCoder

Оновлено для інтерпольованого рядка.
Joel Coehoorn

3

Ruby (83 байти)

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

Безумовно

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 на цю константу, але насправді вона не закінчується, зберігаючи будь-які байти. :(

Edit 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щоб зберегти точність.
Стівен Тузет

Ласкаво просимо. Цей годинник може все-таки бути раннім, хоча навіть .to_rзамість цього.to_f
Ерік Дюмініл

@StephenTouset Ви можете переміститися +"\r"праворуч від масиву. Це дозволяє вам використовувати ['%02d']*4*?:замість того, '%02d:'*4+"\b "щоб ви могли втратити дужки, що з’єднує вас один байт. Збережіть ще один байт, написавши +?\rзамість +"\r".
Synoli

Відмінне відкриття!
Стівен Тузет


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

Це не зупинить друк, коли він потрапляє на Brexit, не впевнений, чи це проблема
TheLethalCoder

@TheLethalCoder Це законно. В інструкції конкретно зазначено, що код повинен працювати лише до 31.03.2019, і що буде після цього не має значення. Якщо ви можете зберегти байти, маючи дивні результати або навіть винятки після цієї дати, тоді вам більше сили.
Joel Coehoorn

Також: Я підозрюю, що можна буде отримати це рівномірне скорочення, пропустивши ToString()байти і замість цього побудуйте форматування в метод Write (), а може бути інтерпольована рядок
Joel Coehoorn

Гаразд ... це, безумовно, можливо. У мене це до 127 байт. Я додаю його нижче вашого оригіналу, тому ви все одно отримаєте кредит за основну gotoідею.
Joel Coehoorn

Мою редакцію вимкнено :( Зрозуміло, мені доведеться розмістити власну відповідь.
Joel Coehoorn

2

Дата Bash + GNU, 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

Безумовно

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помилку. Простір обов'язковий, здається :-(
steve

2
Призначити 3600змінну, щоб зберегти 2 байти? Ви також можете перейти B=3600;A=86400на B=3600;A=24*Bінший байт?
caird coinheringaahing

3600 змінних зараз виконано, THX. 24 * B там знадобиться A=$[24*B]так, що це не можливо
steve

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 байти більше, трохи більш зручна CPU версія, яка 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

1

PHP, 64 байти

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

Це буде рахуватися рівно до, 0:00:00:00а потім розірвати / вийти. Бігайте з -r.

-2 байти, якби мені не потрібно було надрукувати 0.


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, яка б інакше козирувала це, я вважаю, що це недоліки з причин, які я пояснив у своїх коментарях, але, оскільки я тут новий, я можу помилитися. Або я просто новачок :)


Можливо, вам знадобиться закриваючий тег? (Не впевнений у цьому). Ви використовуєте лише $aодин раз, а також можете використовувати номер на своєму місці. Я не надто знайомий з php, але схоже, що
можливі

Що ви маєте на увазі під flawed because of reasons stated in the comments? Якщо ви маєте на увазі коментарі до їхньої відповіді, ви єдиний, хто прокоментував це.
caird coinheringaahing

@TheLethalCoder Не потрібно закривати тег. І приємний!
Sworrub Wehttam

1
Ви можете зберегти ~ 7 байт, скориставшись <?=тегом відкриття та скинувши відлуння, призначаючи $bмісце, де ви вперше його використовуєте. Крім того, ви можете зберегти 3 байти за допомогою, ^0а не floor. Це порозрядне або включає в себе амплуа до int, це найкоротший шлях для передачі до int, який я бачив.
користувач59178

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

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

Було довше, перш ніж я зрозумів, що можу заздалегідь підрахувати час закінчення. Іноді варто трохи запізнюватися на гру та отримувати ідеї від інших.

FYI, посилання 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

Я виріс в Ірландії приблизно за півкілометра від кордону. Окрім знаку «Ласкаво просимо до Фермана» та зміни дорожньої розмітки, ви не знали б, що увійшли до іншої країни. Використовується для того, щоб двічі перетинати його по дорозі до школи.


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();
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.