Kiedy nastąpi Brexit?


27

Cóż, nastąpił Brexit . A Sky News, będąc geniuszami, postanowiły stworzyć odliczanie na boku autobusu.

wprowadź opis zdjęcia tutaj

Twoim zadaniem jest zrobić coś podobnego. Wielka Brytania opuszcza UE w dniu 31 marca 2019 roku i musisz utworzyć cyfrowe odliczanie, które zmienia się co sekundę (z dopuszczalnym odchyleniem 0,05 sekundy).

Wkład

Twój program nie powinien przyjmować żadnych danych wejściowych. To jest zakazane!

Wydajność

Powinien on wyświetlać czas do Brexitu w formacie ddd:hh:mm:ss. Wiodące i końcowe znaki nowej linii są dozwolone, ale wyświetlacz powinien pozostać w tym samym miejscu za każdym razem. Powinno to wyglądać, jakby faktycznie maleje na swoim miejscu. Jak zauważył @AnthonyPham, nie oznacza to drukowania wystarczającej liczby znaków nowego wiersza, aby „wyczyścić” ekran, oznacza to, że należy go wyczyścić.

Takie dane wyjściowe nie są dozwolone:

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

To też nie jest

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

ponieważ znajdują się w więcej niż jednej linii.

Po Brexicie nie musisz się martwić. Twój program musi działać tylko do 31.03.2019

Zasady

  • Standardowe luki są niedozwolone
  • To jest więc wygrywa najkrótszy kod w bajtach .
  • Komunikaty o błędach (choć nie wiem, jak to zrobić) są niedozwolone
  • Kod powinien być uruchomiony za 2 lata (kiedy Wielka Brytania opuści UE) i powinien wyświetlać aktualny czas i nie zaczynać od 730 (patrz poniżej)

Reguła odliczania

Odliczanie nie powinno być zakodowane na stałe i powinno być możliwe uruchomienie w dowolnym momencie przed zakończeniem Brexitu i nadal dawanie prawidłowego wyniku. Po rozpoczęciu nowego dnia godzina powinna być zgodna z poniższym formatem

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

Powiem jeszcze raz: data zakończenia Brexitu to 31.03.2019 o północy dla wygody (31: 3: 19 00:00:00 lub 31: 3: 2019 00:00:00 lub w dowolnym innym formacie)

NB: Wydaje mi się, że mam wszystko, ale nie opublikowałem tego w piaskownicy, w przeciwnym razie czas mógłby się skończyć. Możesz dodawać sugestie dotyczące ulepszeń, ponieważ nie są one idealne.


Czy mogę uruchamiać go co milisekundę, ale nadal wyglądać na aktualizowany co sekundę? To tylko po to, aby mój kod był krótszy.
David Archibald

@DavidArchibald mówi tylko, że wyświetlacz musi się zmieniać co sekundę. Po prostu większość odpowiedzi będzie łatwiej uruchamiać co sekundę.
caird coinheringaahing

ach Cóż, muszę postawić, 1000jeśli chcę to zmienić raz na sekundę. Dzięki
David Archibald

Czy wymagane są zera na początku?
Kudłaty

1
Północ, która strefa czasowa: UCT lub GMT? Czy musimy to wziąć pod uwagę?
Tytus

Odpowiedzi:


12

JavaScript, 134 129 113 bajtów

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

Edycja: Zapisano 2 bajty dzięki @Shaggy. Zaoszczędzono 11 bajtów dzięki @ l4m2.


Udało ci się pokonać cię @Neil ... o kilka bajtów.
David Archibald

Dlaczego nie użyć <a id=0>? Czy jakoś tak?
Solomon Ucko

3
Lub nawet document.body.innerHTMLzamiasto.innerHTML
cloudfeet

1
Chciałem, aby był to monospace, aby zapewnić, że wyświetlacz pozostanie w tym samym miejscu, ale myślę, że mógłbym zapisać bajt i użyć <tt>.
Neil,

3
Możesz zapisać 2 bajty, uruchamiając kod co milisekundę (lub 2 lub 3 ...).
Kudłaty

11

PowerShell, 70 63 55 53 bajtów

Wyłączone podwójne cytaty, łatwe -2 dzięki @Joey

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

Uruchomienie tego ze snem dodaje 8 bajtów, ale dane wejściowe są w większości niewidoczne, jeśli są uruchamiane bez nich, wersja (63 bajty) ze snem:

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

for() jest nieskończoną pętlą i wewnątrz tej pętli ..

cls wyczyścić ekran,

pobierz 31/3/19jako DateTimeobiekt i -bieżącą datę z niego, aby podać pozostały czas, a następnie .ToString()( |% T*) ten w odpowiednim formacie.

wyświetli się czas ujemny po brexicie.


Jest to również zależne od lokalnego formatu daty. Chociaż brytyjski format dd / m / rr jest odpowiedni, imo, nie będzie działać tak, jak jest na komputerach w USA. Jestem ciekawy, jak to T*działa. Nie znam tego.
Joel Coehoorn,

@JoelCoehoorn To fajna sztuczka, %foreach rzeczywiście podnosi Tobiekt oString i przyjmuje jako argument kolejny ciąg znaków. jeśli chodzi o format daty i godziny, dlaczego nie będzie działać na komputerach w USA? Myślałem, że dditp. Są niewrażliwe na kulturę.
colsw

Próbuje znaleźć miesiąc nr 31 na mojej maszynie. Działa dobrze, jeśli zmienię to na 3/31/19. Działa również 2019-03-31wszędzie, ale kosztuje to kilka bajtów.
Joel Coehoorn,

@JoelCoehoorn ah racja - przepraszam, myślałem o wyjściu, zaktualizowane do 31Mar19zamiast 31/3/19którego mam nadzieję to naprawić?
colsw

1
Możesz stracić cudzysłowy wokół ciągu formatu, ponieważ ma zastosowanie analiza argumentów poleceń.
Joey,

7

Excel VBA, 91 84 82 bajtów

Oszczędność 7 bajtów dzięki JoeMalpass wskazując, że Excel widzi daty jako liczby.
Zaoszczędzono 2 bajty dzięki JoeMalpass

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

Dane wyjściowe są wysyłane do komórki A1w aktywnym arkuszu Excel.


-6 bajtów poprzez wymianę ("2019-3-31")z (43555). Gdy próbuję uruchomić to w programie Excel, jednak zawiesza się po około 5-6 sekundach ...
CactusCake

1
@JoeMalpass Dzięki, to dobra uwaga. Dla mnie też wygląda po kilku sekundach, ponieważ oblicza się znacznie szybciej niż 1 / sekundę. Dodanie opóźnień dodaje bajty, a OP nie mówi, że musi być w stanie ciągle odliczać do Brexitu, nie podpalając niczego.
Inżynier Toast

Najwyraźniej Nowdziała bez ()zbyt ...
CactusCake

6

Python 3.6, 146 bajtów

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 bajtów

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

Zaoszczędzono 16 bajtów dzięki @Bob Zaoszczędzono 6 bajtów dzięki @ Søren D. Ptæus

Wersja sformatowana:

using System;

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

Można to zrobić (TimeSpan)0? Na telefonie nie można teraz testować. Nadal możesz upuścić wolną przestrzeń, gdy zajmuje się nią powrót karetki: ustawia kursor z powrotem na początku linii.
Bob

2
Myśl: poleganie na CR może się nie powieść, jeśli zmieni się długość (mniej niż 100 dni). Poprawka: dodaj dwa dodatkowe spacje na końcu.
Bob

@ Bob Zapomniałem usunąć Clear! Głupi ja. I nie można przekonwertować intna TimeSpanjuż próbowałem tego.
TheLethalCoder

Możesz zapisać 6 bajtów zapisu (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus

@ SørenD.Ptæus Dobry pomysł nawet o tym nie
pomyślał

4

JavaScript ES5, 320 319 316 305 295 284 bajtów

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

Dzięki @Fels za referencje Math, @dgrcode za referencjeconsole

Nie grał w golfa

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
Możesz trochę zaoszczędzić, zmieniając nazwę Math nag=Math;
Fels

Wygląda na to, że aliasing Mathmoże nadal zaoszczędzić 2 bajty, prawda?
Marie,

Możesz zaoszczędzić nieco więcej, używając funkcji strzałek i się go pozbyć var. Wybierz też krótsze nazwy zmiennych, takie jak hzamiast hourslub mzamiast minutes. Prawdopodobnie robienie c=consolezaoszczędzi jeszcze kilka bajtów. Również 1e3zamiast1000
Daniel Reina

4

PHP, 84 bajty

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

Dość bezpośredni. 1553990400 to znacznik czasu 31-3-2019 00:00:00 w UTC. Pętla wykonuje się w nieskończoność, używając funkcji DateTime-> diff () -> format () w celu wyświetlenia pozostałego czasu. Po zdarzeniu Brexit zacznie liczyć od 0.

Skomentowana / bardziej czytelna wersja:

// 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.
}

Nowy tutaj i zamierzam opublikować własną odpowiedź. Kilka rzeczy: 1. Czy możemy <?tutaj pominąć tag? 2. Myślę, że twój nawias jest błędny, teraz wywołujesz ->diffecho, a nie obiekt DateTime. 3. echo i tak działa bez nawiasów. 4. Nawet po rozwiązaniu tego problemu to nie działa, ale jestem nowy w golfie, więc to może być ja, jestem idiotą.
Sworrub Wehttam

1
Wystarczy go uruchomić i przekonać się, że działa dobrze, zgodnie z wymaganiami. Nie ma potrzeby opróżniania podczas uruchamiania PHP z wiersza poleceń. Na początku ciągu znajduje się znak \ r, który przesuwa kursor na początek wiersza, co powoduje nadpisywanie wcześniej wyprowadzonego czasu. Jest to ta sama metoda, której używa wiele innych odpowiedzi tutaj.
chocochaos

1
Przepraszam, przegapiłem twój pierwszy komentarz. Tak, możemy pominąć otwierające tagi, chyba że istnieje wymóg dostarczenia pełnego programu. Nawiasy są w porządku, tak jak są. Tak, echo działa bez niego, ale wywołanie diff na obiekcie DateTime nie działa bez nich. Działa tutaj dobrze, jakiej wersji PHP używasz i jak uruchamiasz program? :)
chocochaos

1
Możesz sprawdzić niektóre posty tutaj: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos

1
To prawie wszystko, dzięki za wgląd :)
Sworrub Wehttam

4

CJam, 69 62 59 57 bajtów

Zaoszczędzono 7 bajtów, zmieniając format na inny czas

Zaoszczędzono 3 bajty dzięki sugestiom Martina Endera

Zaoszczędzono 2 bajty, używając znaku powrotu karetki zamiast spacji

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

Nie można uruchomić z TIO z oczywistych powodów.

Ciągle przepisuje wyświetlacz w nieskończonej pętli, więc tekst miga do przodu i do tyłu (przynajmniej w mojej konsoli), chociaż faktycznie aktualizuje czas tylko raz na sekundę.

Ta 70-bajtowa wersja drukuje tylko raz na sekundę:

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

Wyjaśnienie

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

Nie można przetestować teraz, ale prawdopodobnie można wymienić Abze si zapisać bajt wykonując 1e3/najpierw, a następnie podzielić w kolejności przeciwnej 60md\60md\24md\]W%.
Martin Ender

@MartinEnder Tak, oba działają. Dzięki
Business Cat

Och i {60md\}2*ratuje innego.
Martin Ender

3

Python 3.5 (118 bajtów)

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 bajtów

Dzięki Bobowi za oszczędność 57 bajtów!

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

Nieogrodzony program:

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 bajtów

Dziękujemy Bobowi za uratowanie kolejnych 47 bajtów!

Dzięki Martin Smith za zapisanie 4 bajtów!

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

Nieogrodzony program:

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)jest krótszy.
Martin Smith,

1
Możesz także usunąć ciąg „ Console.Cleari” zamiast "\r"niego, np."\r"+(x-a)...
Bob

1
Więcej ulepszeń: (x-a).ToString(@"d\:hh\:mm\:ss")jest równoważne z `String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa)` jest równoważne $@"{x-a:d\:hh\:mm\:ss}"(krótszy, interpolowany ciąg w C # 6.0). Jeśli to zrobisz, możesz dalej skrócić pełny "\r"+$@"{x-a:d\:hh\:mm\:ss}"do $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob

1
@TheLethalCoder Uznałem to za po prostu niedopuszczenie „fałszywego” podejścia z wieloma nowymi wierszami. Zwrot karetki wciąż zastępuje jedyną rzecz na ekranie. Co najmniej jedna inna odpowiedź również wykorzystuje to podejście. Może również usunąć stan uśpienia, ponieważ ważne jest, aby wyświetlacz zmieniał się co sekundę, z dozwolonymi zmianami bez zmian (patrz komentarze do pytania). edytuj: w rzeczywistości komentarze pytań również wyraźnie zezwalają na CR ...
Bob

1
@ Bob Przepraszam, przeczytałem twoją sugestię jako nowy wiersz, mój błąd. Ale tak, sen można usunąć
TheLethalCoder

3

C, 104 bajty

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

Awaria

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
}

Polega na timezwracaniu liczby sekund od 01.01.1970, co jest w moim przypadku (przy użyciu Clang / GCC na macOS) i powinno tak być w przypadku większości rzeczy w systemie UNIX.

Używa sekwencji ucieczki terminala bash do przesuwania kursora ( <esc>[1Aprzesuwa kursor w górę o 1 linię). Byłoby fajniej móc po prostu użyć \r, ale printfnie spłukuje się, dopóki nie zobaczy nowej linii, a ręczne opróżnienie zajmuje znacznie więcej.

Prawdopodobnie najbardziej intensywne odliczanie procesora, jakie kiedykolwiek widziałem. Działa w gorącej pętli, aby upewnić się, że zawsze jest tak dokładna, jak to tylko możliwe. Jeśli zostanie uruchomiony po terminie, przyniesie trochę dziwnych rzeczy (wszędzie negatywy!)


@TobySpeight na pewno poprawione. Uważam je za bash, ponieważ zawsze używam tej strony referencyjnej: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Dave

Czy są jakieś zasady dotyczące formy głównej w C? W C90: pominięcie powrotu z głównych przyczyn UB w przypadku, gdy dzwoniący (OS) użyje wartości zwracanej. W standardzie C: main(x)nie jest poprawną formą main, domyślna int została usunięta z języka. Uważam, że minimalna, bezpieczna wersja to int main(){}.
Lundin,

@Lundin w kodzie golfowym, języki są definiowane przez ich implementację (tzn. Jeśli znajdziesz publicznie dostępny kompilator, który kompiluje kod w dowolny sposób, możesz to zrobić, ale jeśli wymaga niestandardowego ustawienia flag, te flagi są liczone do twojego bytecount). Masz rację, że nie jest to zgodne ze standardami (a także to, co zauważyłeś, istnieją domyślnie zdefiniowane funkcje z powodu braku importu i polegania na czasie zwracającym kilka sekund od 01.01.1970). Spójrz na meta dla (raczej rozproszonych) zasad, które ludzie przestrzegają tutaj.
Dave

Częścią zabawy z golfowymi wyzwaniami jest odkrywanie dziwnych hacków językowych i przestarzałych funkcji!
Dave

3

AHK , 145 bajtów

To nie jest najkrótsza odpowiedź, ale wynik daje bardzo miłe poczucie zagłady. Początkowo próbowałem wysłać naciśnięcia klawiszy Ctrl+, Aa DELnastępnie, niezależnie od pory, ale częstotliwość odświeżania była zbyt wolna i zniszczyłoby to środowisko, w którym się znajdowałeś. Zamiast tego poszedłem z GUI. Okazało się, że potrzeba mniej bajtów, aby całkowicie zniszczyć okno i odtworzyć je, niż w kółko aktualizować kontrolę, więc poszedłem z tym. To fajny efekt.

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
}

Zaśpiewam piosenkę doom!


3

C #, 128 127 bajtów

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

Nieskluczony kod:

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

Nie wymyśliłbym tej sztuczki bez pomocy innych odpowiedzi C # tutaj.

Dla każdego, kto szuka dalszej poprawy, możesz również umieścić wyrażenie Write () wewnątrz pętli for. Wydaje się, że powinienem być w stanie tutaj zapisać bajt, ponieważ oszczędza mi to średnika dla tego wyrażenia, ale działa na ten sam numer, ponieważ nie możesz mieć całkowicie pustego ciała:

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

Witamy w PPCG!
Martin Ender

Nadal możesz zapisać pojedynczy znak, używając interpolowanego ciągu;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob

Dobrze zagrane, próbowałem znaleźć sposób na uzyskanie (prawdziwej) pętli w najkrótszym możliwym kodzie! Zapamiętam tę sztuczkę. Być może będziesz musiał dodać kilka spacji, tak jak ja, choć napisałem inaczej, gdy dni zaczynają się od 3 cyfr do 2 cyfr, nie zastąpi to ostatniego znaku ciągu czasu i otrzymasz dziwny wynik
NibblyPig

Możesz zapisać bajt, używając interpolowanego łańcucha, jak w mojej odpowiedzi. Twój format dddwypełnia zera, wygląda lepiej niż metoda dwóch spacji.
TheLethalCoder

Zaktualizowano dla interpolowanego ciągu.
Joel Coehoorn

3

Rubinowy (83 bajty)

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

Nie golfił

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

Zasadniczo jedno z zgłoszeń w języku Python, z pewnymi ulepszeniami. Po prostu emitujemy „\ r”, aby przejść do początku łańcucha przed ponownym renderowaniem. A w przypadku formatu ciągu "%03d:%02d:%02d:%02d"naprawdę nie dbamy o szerokość pierwszego specyfikatora… więc możemy to zrobić "%02d"*4i wyemitować backspace i spację, aby usunąć dodatkowe niepotrzebne dwukropki.

Również znalazłem dwóch znaków krótszy print: $><<. $>jest skrótem dla globalnego $defout, który jest strumień wyjściowy dla printa printfi domyślnie STDOUT. IO#<<zapisuje prawą stronę do strumienia. Jak te dwie postacie są krótsze? Cóż, mogę teraz pominąć przestrzeń, która prowadziła przed nawiasami owijającymi ciąg formatu.

W tym momencie naprawdę myślę, że nie ma możliwości dalszego skrócenia tego programu w Ruby.

Edycja: Myliłem się. Zamiast pierwsze Time.new(2019,3,31), możemy po prostu użyć czasu surowego UNIX: 1553990400.

Edycja 2: Próbowałem bawić się z wyliczaniem minut i dzieleniem znacznika czasu UNIX przez tę stałą, ale tak naprawdę nie kończy się to oszczędzaniem bajtów. :(

Edycja 3: Okazało się, że buforowanie h=3600faktycznie zraniło mnie o dwa bajty. Ups

Edycja 4: Zaoszczędź 3 bajty dzięki @EricDuminill. Używał pływaków, ale racjonalne działały bez utraty precyzji!

Edycja 5: Array#*jako alias dla Array#joinRuby ?-syntax dla poszczególnych postaci!


Praca z godzinami zamiast sekund wydaje się oszczędzać 3 bajty: loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}Sekundy mogą być wyłączone o 1, z powodu zaokrąglania.
Eric Duminil

Dzięki! Teraz związany z PHP. :) Użyłem to_rzamiast to_fzachować precyzję.
Stephen Touset

Nie ma za co. Ten zegar może być jeszcze o 1 .to_r.to_f
sekundę

@StephenTouset Możesz przejść +"\r"na prawo od tablicy. Umożliwia to użycie ['%02d']*4*?:zamiast tego '%02d:'*4+"\b ", abyś mógł stracić nawiasy, które dają ci jeden bajt. Zapisz kolejny bajt pisząc +?\rzamiast +"\r".
Synoli

Doskonałe odkrycie!
Stephen Touset

2

JavaScript + HTML, 136 + 7 = 143 bajty

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

Czy wynik sprawia, że ​​... bajt miłosny ?
Inżynier Toast

2

C #, 142 bajty

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

Nieogrodzony program:

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

To nie przestanie drukować, gdy dojdzie do brexitu, nie jestem pewien, czy to jest problem
TheLethalCoder

@TheLethalCoder To legalne. Instrukcje wyraźnie stwierdzają, że kod musi działać tylko do 31.03.2019, a to, co stanie się później, nie ma znaczenia. Jeśli możesz zaoszczędzić bajty, mając dziwne dane wyjściowe lub nawet wyjątki po tej dacie, to więcej mocy dla ciebie.
Joel Coehoorn,

Ponadto: podejrzewam, że możliwe będzie uzyskanie tego nawet zwarcia poprzez pominięcie ToString()bajtów i zamiast tego wbudowanie formatowania w metodę Write () lub może interpolowany ciąg znaków
Joel Coehoorn

Dobra ... to zdecydowanie możliwe. Mam go do 127 bajtów. Dołączam go poniżej twojego oryginału, więc wciąż zyskujesz uznanie za podstawowy gotopomysł.
Joel Coehoorn

Moja edycja została wyczyszczona :( Zgaduję, że będę musiał opublikować własną odpowiedź.
Joel Coehoorn

2

Data Bash + GNU, 128 bajtów

2 bajty wygolone dzięki @muru, a 2 wcześniejsze dzięki @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

Nie golfił

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
Nigdy nie grałem w Bash wcześniej, ale można usunąć spacje na chwilę: while[1]?
caird coinheringaahing

Słuszna uwaga, teraz dałem tę próbę, ale daje line 1: [1]: command not foundbłąd. Wydaje się, że spacje są obowiązkowe :-(
steve

2
Przypisać 3600do zmiennej, aby zapisać 2 bajty? Może również być w stanie zmienić B=3600;A=86400do B=3600;A=24*Binnego bajtu?
caird coinheringaahing

Zmieniono 3600 zmiennych, dzięki. 24 * B nie potrzebowałoby tam A=$[24*B]takiej możliwości
Steve

1
C=:%02d;printf "%03d$C$C$C\r"zapisać bajt? I przenieś zadania do A i B w kontekście arytmetycznym: D=$[B=3600,A=24*B,1553990400-`date +%s`]aby zapisać inny?
muru

2

MATL, 45 bajtów

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

TIO najwyraźniej nie obsługuje czyszczenia danych wyjściowych, ale na szczęście MATL Online tak !

Przy 2 bajtach więcej, nieco bardziej przyjazna dla procesora wersja, która wykonuje pause(uśpienie) co sekundę:

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

Wypróbuj to w MATL Online

737515„31 marca 2019 r.” reprezentuje domyślny format epoki MATLAB - liczbę dni od 0 stycznia 0000, opcjonalnie włączając część ułamkową reprezentującą porę dnia. (Próbowałem to skrócić, obliczając to w jakiś sposób, ale jego jedynymi czynnikami są 5 i kolejna sześciocyfrowa liczba (147503) i nie mogłem znaleźć sposobu na zrobienie tego w mniej niż 6 bajtów.)

`    % 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 bajty

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

Będzie to liczyć dokładnie do momentu, 0:00:00:00a następnie przerwa / wyjście. Uruchom z -r.

-2 bajty, gdybym nie musiał drukować 0.


1

RPL, 83 78 bajtów

Zakładając, że HP48 lub podobny jest skonfigurowany z poprawną (brytyjską) godziną i datą, formatem daty mm / dd i formatem 24-godzinnym:

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

Byłem zaskoczony, że mogłem zaoszczędzić 2 bajty, usuwając spacje wokół ":". 1.1 to najkrótsza ważna data, później zrzucona przez SUB. Uważaj na emulatory, czas może biegać szybciej lub wolniej (lub wcale) niż zegar ścienny. Z prawdziwym HP możesz zatrzymać ten program, naciskając klawisz ON… lub poczekać na rozładowane baterie.


0

PHP, 102 95 90 bajtów

Zaoszczędź 7 bajtów dzięki @TheLethalCoder i nie faktorując

Zaoszczędzono kolejne 5 bajtów, łącząc

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

To jest mój pierwszy golf, więc prawdopodobnie brakuje mi kilku trików, ale tutaj jesteś niezależnie.

Jeśli chodzi o odpowiedź PHP @chocochaos, która w innym przypadku przebije to, uważam, że jest błędna z powodów, które wyjaśniłem w moich komentarzach, ale ponieważ jestem tu nowy, mogę się mylić. Albo jestem tylko nowicjuszem :)


Może potrzebujesz tagu zamykającego? (Nie jestem tego pewien). Używasz tylko $araz, więc równie dobrze możesz użyć numeru na miejscu. Nie jestem zbyt zaznajomiony z php, ale wygląda na to, że może być więcej ulepszeń
TheLethalCoder

Co masz na myśli flawed because of reasons stated in the comments? Jeśli masz na myśli komentarze do ich odpowiedzi, jesteś jedynym, który skomentował.
caird coinheringaahing

@TheLethalCoder Nie wymaga tagu zamykającego. I fajny!
Sworrub Wehttam

1
Możesz zapisać ~ 7 bajtów, używając <?=otwierającego znacznika i upuszczając echo, przypisując $bmiejsce, w którym po raz pierwszy go używasz. Dodatkowo możesz zapisać 3 bajty używając ^0zamiast floor. Jest to bitowe lub obejmuje rzutowanie na int, to najkrótszy sposób na rzutowanie na int, jaki widziałem.
user59178

1
Moja odpowiedź działa dobrze :) Możesz też przeczytać tutaj kilka postów: codegolf.meta.stackexchange.com/questions/tagged/php Nie trzeba też otwierać tagów. Naprawdę poleciłbym napisać swoje rozwiązanie w taki sposób, aby działało z wiersza poleceń, a następnie nie musiałbyś bawić się nagłówkami w celu odświeżenia. Odświeżenie spowoduje również, że Twoje rozwiązanie „od czasu do czasu” „spudłuje”, ponieważ nie uwzględnia czasu straconego na samo żądanie.
chocochaos

0

AWK , 78 bajtów

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

Wypróbuj online!

Minęło więcej czasu, zanim zdałem sobie sprawę, że mogę wstępnie obliczyć czas zakończenia. Czasami opłaca się nieco spóźnić do gry i czerpać pomysły od innych.

Do Twojej wiadomości, link TIO nie działa zbyt dobrze, ponieważ nie jest \rpoprawnie wdrażany .


0

F #, 142 bajty

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

Dorastałem w Irlandii, około pół kilometra od granicy. Oprócz znaku „Welcome to Fermanagh” i zmieniających się znaków drogowych nie wiedziałbyś, że wjechałeś do innego kraju. Służyłem do dwukrotnego przekroczenia go w drodze do szkoły.


0

c, gcc 114 bajtów

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

Nic nie pominięto, pełny program. Program kompiluje się w gcc na Ubuntu. Odliczanie nie pokaże długiej ścieżki instrukcji drukowania z powodu wywołania systemowego do wyczyszczenia i zatrzymuje się, gdy odliczanie osiągnie 0 sekund.

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();
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.