Contagem regressiva de Natal


10

No espírito das férias, e como alguém já começou o tema do inverno ( Construa um boneco de neve! ), Proponho um novo desafio.

Imprima o número de dias, horas, minutos e segundos até o Natal (meia-noite (00:00:00) 25 de dezembro) em uma janela independente (não um console) em qualquer formato inequívoco que achar melhor e atualize-o continuamente como estes valores mudam.

Entrada - nada, deve ler a hora do sistema.

O código mais curto vence :) As cadeias "Dias", "Horas", "Minutos", "Segundos" e "Até o Natal" são código livre. Você também pode saboreá-los, se quiser. Aromatizá-los é pura e simplesmente com o objetivo de produzir uma boa produção. Não é possível criar sequências de caracteres com o objetivo de criar um número mágico para salvar o código.


O que exatamente você quer dizer com "dar sabor a eles"? "Dias", "horas", "minutos", "segundos" e "até o Natal" são necessários na saída ou apenas opções gratuitas? Quanto "aroma" dessas cordas é gratuito?
Iszi

2
No console ?? Os codificadores de console revoltam-se! Só brincando. Boa ideia. Boas festas
Darren Stone

@ Iszi Eles não são necessários. Eu apenas os libertei para que, se as pessoas quiserem ter uma boa produção, não perderão tantos caracteres.
Cruncher

11
A meia-noite do Natal não é o fim do Natal?
DavidC

2
Não, normalmente a meia-noite é o instante zero do novo dia. "Meia-noite de Natal" é quando o Natal começa.
breadbox

Respostas:


5

Rubi com sapatos , 96 - 33 = 63

Shoes.app{p=para
animate{p.text="0 days 0 hours 0 minutes #{1387951200-Time.new.to_f} seconds"}}

Bem, você nunca disse que não podíamos . ;)

captura de tela

Atualiza uma vez a cada quadro.

O número mágico 1387951200é Natal - 25 de dezembro de 2013 às 00:00.

Exemplo de sessão do IRB para onde obtive os números:

irb(main):211:0> "0 days 0 hours 0 minutes  seconds".size
=> 33
irb(main):212:0> Time.new(2013,12,25,00,00,00).to_i
=> 1387951200
irb(main):213:0>

Dec 25, 2013 00:00é meia-noite.
Cruncher

@ Cruncher Ah, tudo bem então. Editando muitos textos inúteis então
Doorknob

3

PowerShell: 279

A contagem de caracteres não leva em consideração nenhum brinde. @Cruncher - ajuste de acordo.

Golfe

($t=($a='New-Object Windows.Forms')+".Label"|iex).Text=($i={((New-TimeSpan -en 12/25|Out-String)-split"`n")[2..6]});$t.Height=99;($x=iex $a".Form").Controls.Add($t);$x.Text='Time Until Christmas';($s=iex $a".Timer").add_tick({$t.Text=&$i;$x.Refresh()});$s.Start();$x.ShowDialog()

Essa não é a coisa mais bonita, seja como código ou como janela, mas funciona.

Uma boa parte é que isso não é bom para 2013 - funcionará em qualquer ano, das 00:00 de 1º de janeiro às 00:00 de 25 de dezembro.

Aviso: A janela pode não responder - continuará sendo atualizada, mas talvez você não consiga movê-la ou fechá-la.

insira a descrição da imagem aqui

Sem jogar golfe com comentários

(
    # $t will be the label that displays our countdown clock on the form.
    $t=(
        # $a is used as a shortcut to address the Forms class later.
        $a='New-Object Windows.Forms'
    # Tack ".Label" onto the end with iex to finish making $t.
    )+".Label"|iex

# Set the text for our label.
).Text=(
    # $i will be a script block shortcut for later.
    $i={
        (
            (
                # Get the current "Time until Christmas", and output it as a string.
                New-TimeSpan -en 12/25|Out-String
            # Break the string into newline-delimeted array.
            )-split"`n"
        # Only output elements 2..6 - Days, Hours, Minutes, Seconds, Milliseconds.
        )[2..6]
    }
);

# Make sure the label is tall enough to show all the info.
$t.Height=99;

(
    # Use iex and $a as shortcut to make $x a "New-Object Windows.Forms.Form".
    $x=iex $a".Form"

# Add the label to the form.
).Controls.Add($t);

# Put 'Time Until Christmas' in the title bar for flavor.
$x.Text='Time Until Christmas';

(
    # Use iex and $a as shortcut to make $s a "New-Object Windows.Forms.Timer".
    $s=iex $a".Timer"

# Tell the timer what to do when it ticks.
).add_tick(
    {
        # Use the $i script block to update $t.Text.
        $t.Text=&$i;
        # Reload the form so the updated text displays.
        $x.Refresh()
    }
);

# Start the timer.
$s.Start();

# Show the form.
$x.ShowDialog();

# Variable cleanup - omit from golfed code.
rv t,a,x,i,s

3

Mathematica 167 - 44 = 123

O seguinte atualiza continuamente uma tabela mostrando os dias, horas, minutos e segundos (em milésimos) até o início do dia de Natal. Não sei como contar o desconto para as strings gratuitas.

Dynamic[Grid[Join[{{"Countdown", "until Christmas"}}, 
{DateDifference[Date[], {2013, 12, 25, 0, 0, 0}, {"Day", "Hour", "Minute", "Second"}], 
Clock[{1, 1}, 1]}[[1]] /. d_String :> d <> "s"]] ]

contagem regressiva


Uma solução rápida e suja : 104-19 = 85 caracteres

Dynamic@{DateDifference[Date[], {2013, 12, 25, 0, 0, 0}, {"Day", "Hour", "Minute", 
 "Second"}], Clock[{1, 1}, 1]}[[1]]

{{17, "Dia"}, {10, "Hora"}, {59, "Minuto"}, {51.4011, "Segundo"}}


"Countdown to Christmas: Days"Isso pode ser livre, "Day", "Hour", "Minute", "Second"pode ser assim.
Cruncher

Obrigado pelo esclarecimento. Aliás, espaços fora das strings não são obrigatórios. Eles são inseridos apenas para legibilidade.
18713

Por que há "-" na frente dos números? Pode ser confuso e parece que já passamos o Natal. Eles seriam corrigidos alterando a ordem no DateDifference?
Cruncher

Eu os removi e melhorei a formatação, pagando o preço em caracteres adicionados.
DavidC 06/12/19

2

Python 136

Tenho certeza de que alguém pode fazer isso melhor - nunca usei o Tkinter antes. Em particular, aposto que l.pack()e l["text"]pode ser evitável.

tk

Golfe

from Tkinter import*
from datetime import datetime as d
r=Tk()
l=Label(r)
l.pack()
while 1:
    l["text"]=d(2013,12,25)-d.now()
    r.update()

1

R

Aqui está uma solução para R usando GTK + através do pacote gWidgets. Este é um código bastante feio, pois não estou familiarizado com o pacote gWidgets / GTK +.

Código

Aqui está o código:

library(gWidgets)
options(guiToolkit="RGtk2")

# FUNCTION compute the hours minutes and seconds from time in seconds
fnHMS = function(timeInSec) {
  hours = timeInSec %/% 3600
  minutes = (timeInSec %% 3600) %/% 60
  seconds = (timeInSec %% 3600) %% 60
  return(list(hours = hours, minutes = minutes, seconds = seconds))
}

# test the function
fnHMS(1478843)

# container for the label and the button widget
christmasCountdownContainer = gwindow('Christmas Countdown!!', visible = TRUE)
christmasCountdownGroup = ggroup(horizontal = FALSE,
                                 container = christmasCountdownContainer)
ccWidget1 = glabel(sprintf('%4.0f hours, %4.0f minutes, %4.0f seconds till Christmas!!', 
                           (liHMS <- fnHMS(as.double(difftime(as.POSIXct(strptime('25-12-2013 00:00:01', 
                                      format = '%d-%m-%Y %H:%M:%S')),
                  Sys.time(), units = 'secs'))))[[1]], liHMS[[2]], liHMS[[3]]), 
                            container = christmasCountdownGroup)

ccWidget2 = gbutton("Update!", handler = function(h, ...) {
  # retrieve the old value of the ccWidget1
  oldValue = svalue(ccWidget1)
  liHMS = fnHMS(as.double(difftime(as.POSIXct(strptime('25-12-2013 00:00:01', 
                                                       format = '%d-%m-%Y %H:%M:%S')),
                                   Sys.time(), units = 'secs')))
  svalue(ccWidget1) = sprintf('%4.0f hours, %4.0f minutes, %4.0f seconds till Christmas!!',
                              liHMS[[1]], liHMS[[2]], liHMS[[3]])
  }, container = christmasCountdownGroup)

Resultado

Aqui está a aparência da saída:

insira a descrição da imagem aqui


Tem que atualizar continuamente - isso significa automaticamente
Doorknob

1

Dyalog APL, 61

{⎕SM[1;]←1 1,⍨⊂⍕(1 4⍴2↓2013 12 24 23 59 59 1000-⎕TS)⍪'Days' 'Hours' 'Minutes' 'Seconds'⋄∇1}1

0

C # 128

Golfe

using D=System.DateTime;using System.Windows.Forms;class C{static void Main(){MessageBox.Show(""+(new D(2013, 12, 25)-D.Now));}}

Ungolfed

using D=System.DateTime;
using System.Windows.Forms;
class C
{
    static void Main()
    {
        MessageBox.Show(""+(new D(2013,12,25)-D.Now));
    }
}

11
Isso não conta continuamente, não é? Além disso, bem-vindo ao codegolf!
Cruncher

Obrigado, feliz por estar aqui! Acho que entendi mal, isso só seria atualizado quando fosse executado novamente. Vou editar e repassar breve
James C.

0

Python 2, 115

from datetime import datetime as d
n=d.now()
print str(24-n.day),str(23-n.hour),str(59-n.minute),str(60-n.second)

Isso conta novas linhas como 2 caracteres.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.