Quando o Brexit acontecerá?

27

Bem, o Brexit aconteceu . E o Sky News, sendo os gênios que são, decidiu criar uma contagem regressiva ao lado de um ônibus.

insira a descrição da imagem aqui

Seu trabalho é fazer algo semelhante. O Reino Unido sai da UE em 31 de março de 2019 e você precisa criar uma contagem regressiva digital para isso que muda a cada segundo (com um desvio de 0,05 segundo permitido).

Entrada

Seu programa não deve receber absolutamente nenhuma entrada. Está proibido!

Saída

Ele deve exibir o tempo até o Brexit no formato ddd:hh:mm:ss. Novas linhas iniciais e finais são permitidas, mas a exibição deve permanecer no mesmo local a cada vez. Deve parecer que está realmente diminuindo no lugar. Como apontado por @AnthonyPham, isso não significa imprimir novas linhas suficientes para "limpar" a tela, isso significa que você deve realmente limpar a tela.

Uma saída como esta não é permitida:

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

Nem isso

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

como eles estão em mais de uma linha.

Você não precisa se preocupar com o Brexit. Seu programa só precisa funcionar até 31/03/2019

Regras

  • As brechas padrão não são permitidas
  • Este é o pelo que o código mais curto em bytes vence.
  • Mensagens de erro (embora eu não consiga pensar como) são proibidas
  • O código deve poder ser executado em 2 anos (quando o Reino Unido deixar a UE) e deve exibir a hora real e não iniciar novamente a partir de 730 (veja abaixo)

Regra de contagem regressiva

A contagem regressiva não deve ser codificada e deve poder ser executada a qualquer momento antes do Brexit terminar e ainda assim produzir o resultado correto. Quando um novo dia é iniciado, a hora deve seguir o formato abaixo

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

Deixe-me dizer novamente, a data em que o Brexit termina é 31/03/2019 à meia-noite por conveniência (31: 3: 19 00:00:00 ou 31: 3: 2019 00:00:00 ou qualquer outro formato que você quiser)

NB: Acho que tenho tudo, mas não o publiquei na Sandbox, caso contrário, o tempo poderia ter mudado. Sinta-se à vontade para postar sugestões de melhorias, pois não é perfeito.

caird coinheringaahing
fonte
Posso executá-lo a cada milissegundo, mas ainda dar a aparência de atualizar a cada segundo? Isso é apenas para tornar meu código mais curto.
David Archibald
@DavidArchibald diz apenas que a exibição precisa mudar a cada segundo. Só que a maioria das respostas achará mais fácil executar a cada segundo.
você precisa saber é o seguinte
ahh Bem, eu tenho que colocar 1000se eu quiser mudar uma vez por segundo. Obrigado
David Archibald
Os zeros à esquerda são necessários?
Shaggy
1
Meia-noite, que fuso horário: UCT ou GMT? Temos que levar isso em conta?
Titus

Respostas:

12

JavaScript, 134 129 113 bytes

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

Editar: salvou 2 bytes graças a @Shaggy. Economizou 11 bytes graças a @ l4m2.

Neil
fonte
Conseguiu derrotar você @ Neil ... por alguns bytes.
David Archibald #
Por que não usar <a id=0>? Ou algo assim?
Solomon Ucko
3
Ou mesmo document.body.innerHTMLem vez deo.innerHTML
cloudfeet
1
Queria que fosse monoespacial para garantir que a tela permanecesse no mesmo lugar, mas acho que poderia salvar um byte e usá-lo <tt>.
Neil
3
Você pode economizar 2 bytes executando o código a cada milissegundo (ou 2 ou 3 ...).
Shaggy
11

PowerShell, 70 63 55 53 bytes

Citações duplas excluídas, fácil -2 graças a @Joey

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

Executar isso com suspensão adiciona 8 bytes, mas a entrada é quase invisível se for executada sem eles, versão (63 bytes) com suspensão:

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

for() é um loop infinito e dentro desse loop ..

cls para limpar a tela

get 31/3/19como um DateTimeobjeto e -a data atual a partir dele, para fornecer o tempo restante e, em seguida, .ToString()( |% T*) com o formato correto.

isso exibirá um tempo negativo após o brexit.

colsw
fonte
Isso também é sensível ao formato da data local. Embora o formato dd / m / aa do Reino Unido seja apropriado, imo, ele não será executado como está nas máquinas dos EUA. Estou curioso como T*funciona. Eu não estou familiarizado com isso.
Joel Coehoorn
@JoelCoehoorn É um bom truque, o %foreach pega o Tobjeto oString e aceita a próxima string como argumento. em relação ao formato de data e hora, por que não é executado nas máquinas dos EUA? Eu pensei que o ddetc eram insensíveis à cultura.
colsw
Ele está tentando encontrar o mês 31 na minha máquina. Funciona bem se eu mudar para 3/31/19. Também funcionaria em 2019-03-31qualquer lugar, mas isso custa alguns bytes.
Joel Coehoorn
@ JoelCoehoorn ah certo - desculpe, eu estava pensando na saída, Atualizado para em 31Mar19vez de 31/3/19que esperamos corrigi-lo?
colsw
1
Você pode perder as aspas ao redor da cadeia de formatação, conforme a análise de argumento de comando se aplica.
Joey
7

Excel VBA, 91 84 82 bytes

Economizou 7 bytes graças a JoeMalpass, indicando que o Excel vê datas como números.
Economizou 2 bytes graças a JoeMalpass

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

A saída é para célula A1na planilha ativa do Excel.

Engenheiro Toast
fonte
-6 bytes trocando ("2019-3-31")com (43555). Quando tento executar este no Excel no entanto, ele congela depois de cerca de 5-6 segundos ...
CactusCake
1
@ JoeMalpass Obrigado, esse é um bom argumento. Ele também procura alguns segundos para mim, porque está calculando muito mais rápido que 1 / segundo. A adição de atrasos, no entanto, adiciona bytes e o OP não diz que deve ser capaz de contar continuamente a partir de agora até o Brexit sem incendiar nada.
Engineer Toast
Aparentemente Nowfunciona sem a ()também ...
CactusCake
6

Python 3.6, 146 bytes

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}")
ovs
fonte
5

C #, 173 172 156 156 150 127 bytes

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

Guardou 16 bytes graças a @Bob Guardou 6 bytes graças a @ Søren D. Ptæus

Versão formatada:

using System;

class P
{
    static void Main()
    {
        for (;;)
            Console.Write($"\r{new DateTime(2019, 3, 31) - DateTime.Now:d\\:hh\\:mm\\:ss}  ");
    }
}
TheLethalCoder
fonte
Você pode fazer (TimeSpan)0? No telefone, não é possível testar no momento. Você ainda pode deixar o campo limpo, pois o retorno de carro cuida disso: coloca o cursor de volta no início da linha.
Bob
2
Pensamento: confiar no CR pode falhar se a duração mudar (menos de 100 dias). Correção: adicione dois espaços extras no final.
Bob
@ Bob esqueci de remover o Clear! Eu tolo. E não é possível converter intpara TimeSpaneu já tentei esse.
TheLethalCoder
Você pode salvar 6 bytes de escrita (t = new DateTime(2019, 3, 31) - DateTime.Now).Ticks > 0.
Søren D. Ptæus
@ SørenD.Ptæus Boa idéia nem sequer pensei nisso
#
4

JavaScript ES5, 320 319 316 305 295 284 bytes

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

Graças a @Fels pela referência Math, @dgrcode pela referênciaconsole

Sem golfe

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
fonte
2
Você pode salvar um pouco da minha renomeação de Math comog=Math;
Fels
Parece que o alias Mathainda pode salvar 2 bytes, certo?
Marie
Você pode economizar um pouco mais usando as funções de seta e se livrando var. Além disso, escolha nomes mais curtos para variáveis, como em hvez de hoursou em mvez de minutes. Provavelmente, isso c=consolesalvará mais alguns bytes. Também em 1e3vez de1000
Daniel Reina
4

PHP, 84 bytes

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

Bastante direto. 1553990400 é o carimbo de data e hora de 31/03/2019 00:00:00 no UTC. Faz um loop infinito, usando DateTime-> diff () -> format () para gerar quanto tempo resta. Após o Brexit, ele começará a contar a partir de 0.

Versão comentada / mais legível:

// 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
fonte
Novo aqui, e prestes a postar minha própria resposta. Algumas coisas: 1. Podemos omitir a <?tag aqui? 2. Acho que seus parênteses estão errados, agora você está chamando ->diffo eco, e não o objeto DateTime. 3. eco funciona sem parênteses de qualquer maneira. 4. Mesmo depois de consertar isso, isso não funciona para mim, mas eu sou novo no golfe, e isso pode ser apenas eu ser um idiota.
você precisa saber é o seguinte
1
Basta executá-lo e ver, ele funciona bem, conforme os requisitos. Não há necessidade de liberar ao executar o PHP a partir da linha de comando. Há um \ r no início da string para mover o cursor para o início da linha, ela sobrescreve o tempo emitido anteriormente. É o mesmo método que muitas outras respostas aqui estão usando.
Chocochaos
1
Desculpe, perdi seu primeiro comentário. Sim, podemos omitir as tags de abertura, a menos que haja um requisito para fornecer um programa completo. Os parênteses estão bem do jeito que estão. Sim, o eco funciona sem ele, mas chamar diff no objeto DateTime não funciona sem eles. Ele roda bem aqui, qual versão do PHP você está usando e como está executando o programa? :)
chocochaos
1
Você pode querer verificar para fora alguns posts aqui: codegolf.meta.stackexchange.com/questions/tagged/php
chocochaos
1
Que apenas cerca de cobre, obrigado pela visão :)
Sworrub Wehttam
4

CJam, 69 62 59 57 bytes

Economizou 7 bytes convertendo para o formato da hora de maneira diferente

Economizou 3 bytes graças às sugestões de Martin Ender

2 bytes salvos usando um retorno de carro em vez de backspaces

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

Não pode ser executado no TIO por razões óbvias.

Ele reescreve a exibição constantemente em um loop infinito, para que o texto entre e saia (pelo menos no meu console), embora na verdade só atualize o tempo uma vez por segundo.

Esta versão de 70 bytes é impressa apenas uma vez por segundo:

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

Explicação

{                           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)
Gato de negócios
fonte
Não é possível testar no momento, mas você provavelmente pode substituir Abpor se salvar um byte executando 1e3/primeiro e depois divida na ordem oposta 60md\60md\24md\]W%.
Martin Ender
@MartinEnder Sim, os dois funcionam. Obrigado
Business Cat
Ah e {60md\}2*salva outro.
22868 Martin Ender #
3

Python 3.5 (118 bytes)

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
fonte
3

C # 6, 149 bytes

Agradecemos a Bob por salvar 57 bytes!

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

Programa não destruído:

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 bytes

Agradecemos a Bob por salvar outros 47 bytes!

Obrigado a Martin Smith por economizar 4 bytes!

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

Programa não destruído:

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
fonte
1
new DateTime(2019,3,31)é mais curto.
Martin Smith
1
Você também pode remover o Console.Cleare, em vez preceder "\r"para a cadeia, por exemplo"\r"+(x-a)...
Bob
1
Mais melhorias: (x-a).ToString(@"d\:hh\:mm\:ss")é equivalente a `String.Format (" \ r {0: d \\: hh \\: mm \\: ss} ", xa)` é equivalente a $@"{x-a:d\:hh\:mm\:ss}"(string mais curta e interpolada no C # 6.0). Se você fizer isso, então você pode reduzir ainda mais o completo "\r"+$@"{x-a:d\:hh\:mm\:ss}"em $"\r{x-a:d\\:hh\\:mm\\:ss}".
Bob
1
@TheLethalCoder Eu entendi isso simplesmente como não permitindo uma abordagem "falsa" de várias novas linhas. Um retorno de carro ainda substitui a única coisa na tela. Pelo menos uma outra resposta também usa essa abordagem. Também é possível remover o sono, pois é importante que a exibição seja alterada uma vez por segundo, com atualizações sem alterações permitidas (consulte os comentários da pergunta). Edit: Na verdade, pergunta comentários também permitir explicitamente o CR ...
Bob
1
@ Bob Desculpe, eu li a sua sugestão como uma nova linha, meu erro. Mas sim o sono pode ser removido
TheLethalCoder
3

C, 104 bytes

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

Demolir

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
}

Confia no timenúmero de segundos retornados desde 01/01/1970, que é o meu caso (usando Clang / GCC no macOS) e deve ser o caso da maioria das coisas do UNIX.

Usa seqüências de escape do terminal bash para mover o cursor ( <esc>[1Amove o cursor para cima 1 linha). Seria melhor poder usar simplesmente \r, mas printfnão liberará até que ela veja uma nova linha, e liberá-la manualmente leva muito mais.

Provavelmente a contagem regressiva mais intensiva da CPU que eu já vi. É executado em um loop quente para garantir que seja sempre o mais preciso possível. Se executado após o prazo, produzirá algumas coisas bem estranhas (negativos em todos os lugares!)

Dave
fonte
@TobySpeight claro, corrigido. Penso neles como o bash, porque eu sempre usar esta página de referência: tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
Dave
Existem regras para a forma de main em C? Em C90: omitir retorno das principais causas UB, caso o chamador (SO) use o valor de retorno. No padrão C: main(x)não é uma forma válida de main, int implícito foi removido do idioma. Acredito que a versão mínima e segura seja int main(){}.
Lundin
@Lundin no code golf, os idiomas são definidos por sua implementação (por exemplo, se você pode encontrar um compilador disponível ao público que compila o código como desejar, você pode fazê-lo, mas se precisar de configuração de sinalizadores não-padrão, esses sinalizadores contarão para o bytecount). Você está certo de que isso não é nem de longe compatível com os padrões (assim como as coisas que você notou, há funções implicitamente definidas devido a nenhuma importação e a confiança no tempo retornando alguns segundos desde 01/01/1970). Dê uma olhada na meta para as regras (bastante dispersas) que as pessoas seguem por aqui.
Dave
Parte da diversão dos desafios do código de golfe é descobrir hacks bizarros e recursos obsoletos!
Dave
3

AHK , 145 bytes

Essa não é a resposta mais curta, mas o resultado dá uma sensação muito agradável de desgraça, eu acho. Originalmente, tentei enviar as teclas pressionadas Ctrl+ Aseguidas de DELe, em qualquer que fosse a hora, mas a taxa de atualização era muito lenta e destruiria qualquer ambiente em que você estivesse. Em vez disso, fui com a GUI. Acabou por demorar menos bytes para destruir completamente a janela e recriá-la do que para atualizar o controle repetidamente, então fui com isso. É um efeito legal.

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
}

Eu vou cantar a canção da desgraça!

Engenheiro Toast
fonte
3

C #, 128 127 bytes

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

Código não destruído:

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

Eu não teria descoberto o truque sem a ajuda das outras respostas C # aqui.

Para quem procura mais aprimoramentos, também pode colocar a expressão Write () dentro do loop for. Parece que eu deveria ser capaz de salvar um byte de alguma forma aqui, porque isso me poupa ponto e vírgula para essa declaração, mas funciona com o mesmo número porque você não pode ter um corpo totalmente vazio:

using System;class P{static void Main(){for(;;Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}"));}}
Joel Coehoorn
fonte
Bem-vindo ao PPCG!
Martin Ender
Você ainda pode salvar um único caractere usando uma seqüência interpolada;)Console.Write($"\r{new DateTime(2019,3,31)-DateTime.Now:ddd\\:hh\\:mm\\:ss}");
Bob
Bem jogado, tentei encontrar uma maneira de ter um loop while (true) no menor código possível! Vou me lembrar desse truque. Você pode precisar adicionar alguns espaços, como eu fiz, à sua gravação, caso contrário, quando os dias passarem de 3 a 2 dígitos, ele não substituirá o último caractere da sua sequência de tempo e você obterá uma saída estranha
NibblyPig
Você pode salvar um byte usando uma string interpolada, como na minha resposta. Seu formato de dddpreenchimento dos zeros parece melhor do que o método dos dois espaços.
TheLethalCoder
Atualizado para a sequência interpolada.
Joel Coehoorn
3

Ruby (83 bytes)

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

Basicamente, um dos envios do Python, com algumas melhorias. Nós apenas emitimos um "\ r" para iniciar o texto antes de renderizar novamente. E para o formato de string de "%03d:%02d:%02d:%02d", realmente não nos importamos com a largura do primeiro especificador ... então podemos fazê-lo "%02d"*4e emitir um backspace e um espaço para limpar os dois pontos extras desnecessários.

Além disso, eu encontrei um dois caracteres mais curto print: $><<. $>é um atalho global para $defout, que é o fluxo de saída para printe printfe padrões para STDOUT. IO#<<grava o lado direito dele no fluxo. Como esses dois caracteres são mais curtos? Bem, agora posso omitir o espaço que antecedeu o parêntese envolvendo a sequência de formatação.

Neste ponto, eu realmente acho que não há como reduzir ainda mais esse programa no Ruby.

Edit: Eu estava errado. Em vez do primeiro Time.new(2019,3,31), podemos usar apenas o tempo UNIX cru: 1553990400.

Edit 2: Tentei brincar de fatorar minutos e dividir o carimbo de data e hora do UNIX por essa constante, mas na verdade não acaba salvando bytes. :(

Editar 3: Acontece que o cache h=3600realmente me machucou por dois bytes. Ops.

Editar 4: salvou 3 bytes graças a @EricDuminill. Ele usou carros alegóricos, mas os racionais funcionam sem perda de precisão!

Editar 5: Array#*como um apelido para Array#join, com a ?sintaxe Ruby para caracteres individuais!

Stephen Touset
fonte
Trabalhar com horas em vez de segundos parece economizar 3 bytes: os loop{h=431664-Time.now.to_f/3600;$><<('%02d:'*4+"\b \r")%[h/24,h%24,h%1*60,3600*h%60]}segundos podem ser desativados em 1, devido ao arredondamento.
precisa saber é o seguinte
Obrigado! Amarrado com PHP agora. :) Eu usei em to_rvez de to_fpreservar a precisão.
Stephen Touset 04/04
De nada. Este relógio ainda pode ser 1s mais cedo, mesmo com em .to_rvez de.to_f
Eric Duminil 04/04
@StephenTouset Você pode mover +"\r"para a direita da matriz. Isso permite que você use em ['%02d']*4*?:vez de '%02d:'*4+"\b "perder os parênteses, o que lhe dá um byte. Salve mais um byte escrevendo em +?\rvez de +"\r".
Synoli 04/04
Excelente descoberta!
Stephen Touset
2

JavaScript + HTML, 136 + 7 = 143 bytes

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
fonte
A pontuação o torna um ... byte de amor ?
Engineer Toast
2

C #, 142 bytes

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

Programa não destruído:

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
fonte
Isso não vai parar de imprimir quando bate brexit, não tenho certeza se isso é um problema
TheLethalCoder
@TheLethalCoder Isso é legal. As instruções especificam especificamente que o código só deve funcionar até 31/03/2019, e o que acontece depois disso não importa. Se você pode salvar bytes com uma saída estranha ou até mesmo exceções após essa data, terá mais poder.
Joel Coehoorn
Também: Eu suspeito que será possível obter este mesmo curto-circuito, ignorando os ToString()bytes e, em vez construir a formatação para o método write (), ou talvez uma seqüência interpolada
Joel Coehoorn
Ok ... é definitivamente possível. Eu tenho até 127 bytes. Estou anexando-o abaixo do original, para que você ainda receba o crédito pela gotoideia básica .
Joel Coehoorn
Minha edição go limpou :( Acho que vou ter para postar minha própria resposta.
Joel Coehoorn
2

Data do Bash + GNU, 128 bytes

2 bytes eliminados graças a @muru e 2 bytes anteriores graças a @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
Steve
fonte
1
Nunca jogou golfe no Bash antes, mas você pode remover os espaços no momento while[1]:?
caird coinheringaahing
Ponto justo, agora tentei, mas gera line 1: [1]: command not founderro. Os espaços são obrigatórios, parece :-(
steve
2
Atribuir 3600a uma variável para salvar 2 bytes? Você também pode ser capaz de mudar B=3600;A=86400para B=3600;A=24*Bum outro byte?
caird coinheringaahing
Variável 3600 concluída, thx. 24 * B precisaria A=$[24*B]de modo não é possível lá embora
steve
1
C=:%02d;printf "%03d$C$C$C\r"salvar um byte? E mova as atribuições para A e B no contexto aritmético: D=$[B=3600,A=24*B,1553990400-`date +%s`]salvar outra?
Muni
2

MATL, 45 bytes

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

O TIO aparentemente não suporta a limpeza da saída, mas felizmente o MATL Online sim !

Com mais 2 bytes, uma versão um pouco mais compatível com a CPU que faz um pause(suspensão) a cada segundo:

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

Experimente no MATL Online

737515é "31 de março de 2019" representou o formato de época padrão do MATLAB - número de dias a partir de 0 de janeiro de 0000, incluindo opcionalmente uma parte fracionária para representar a hora do dia. (Tentei encurtar isso calculando-o de alguma forma, mas seus únicos fatores são 5 e outro número de seis dígitos (147503), e não consegui descobrir uma maneira de fazê-lo em menos de 6 bytes.)

`    % 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 - Restabelecer Monica
fonte
1

PHP, 64 bytes

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

Isso vai contar exatamente até 0:00:00:00e depois interromper / sair. Corra com -r.

-2 bytes se não precisar imprimir o 0.

Titus
fonte
1

RPL, 83 78 bytes

Supondo que o HP48, ou similar, esteja configurado com data e hora corretas (Reino Unido), formato de data em mm / dd e formato de 24 horas:

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

Fiquei surpreso ao poder salvar 2 bytes removendo espaços ao redor ":". 1.1 é a data válida mais curta, posteriormente descartada SUB. Cuidado com os emuladores, pois o tempo pode correr mais rápido ou mais devagar (ou nem um pouco) do que o relógio de parede. Com um HP real, você pode interromper esse programa pressionando a tecla LIGAR… ou esperar as pilhas vazias.

Nácar
fonte
0

PHP, 102 95 90 bytes

Economizou 7 bytes graças a @TheLethalCoder e por não fatorar

Salvo outros 5 bytes concatenando

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

Este é o meu primeiro golfe, então provavelmente estou perdendo alguns truques, mas aqui está você.

Quanto à resposta PHP do @chocochaos que, de outra forma, superaria isso, acredito que seja falha por razões que expliquei em meus comentários, mas como sou nova aqui, posso estar errada. Ou eu sou apenas um novato :)

Sworrub Wehttam
fonte
Você pode precisar de uma marca de fechamento? (Não tenho certeza disso). Você usa apenas $auma vez para que também possa usar o número no lugar. Eu não estou muito familiarizado com php, mas parece que poderia haver mais melhorias
TheLethalCoder
Como assim flawed because of reasons stated in the comments? Se você quer dizer os comentários na resposta deles, você é o único que comentou.
caird coinheringaahing
@TheLethalCoder Nenhuma tag de fechamento necessária. E legal!
Sworrub Wehttam
1
Você pode salvar ~ 7 bytes usando uma <?=tag de abertura e soltando o eco, atribuindo $bo local em que você a usou pela primeira vez. Além disso, você pode salvar 3 bytes usando em ^0vez de floor. É bit a bit ou envolve uma conversão para int, é a maneira mais curta de converter para int que eu já vi.
user59178
1
Minha resposta funciona muito bem :) Além disso, convém ler algumas postagens aqui: codegolf.meta.stackexchange.com/questions/tagged/php Também não é necessário abrir tags. Eu realmente recomendaria escrever sua solução de forma que ela fosse executada na linha de comando, para que você não precise mexer nos cabeçalhos para atualizar. Essa atualização também fará com que sua solução "perca" um segundo de vez em quando, porque não leva em conta o tempo perdido na própria solicitação.
Chocochaos
0

AWK , 78 bytes

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

Experimente online!

Demorou mais para eu perceber que podia pré-calcular o tempo do fim. Às vezes vale a pena chegar um pouco tarde para o jogo e obter idéias de outras pessoas.

Para sua informação, o link do TIO não funciona muito bem, pois não é implementado \rcorretamente.

Robert Benson
fonte
0

F #, 142 bytes

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

Eu cresci na Irlanda a cerca de meio quilômetro da fronteira. Além de um sinal de "Bem-vindo a Fermanagh" e as marcações da estrada mudando, você não saberia que havia entrado em outro país. Costumava atravessá-lo duas vezes a caminho da escola.

Ciaran_McCarthy
fonte
0

c, gcc 114 bytes

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

Nada omitido, programa completo. O programa é compilado no gcc no Ubuntu. A contagem regressiva não mostrará uma longa trilha de instruções de impressão devido à chamada do sistema para limpar e parar quando a contagem regressiva atingir 0 segundos.

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
fonte