É natal?

33

Desafio

Dado que o Natal é:

  • dezembro
  • Mês 12
  • Dia 25

Todo ano, determine a data de hoje e se hoje é Natal ou não. Se for Natal, você deve imprimir "It's Christmas". Se não for Natal, você deve esperar até o Natal e depois imprimir "It's Christmas".

Exemplo

A partir desta pergunta de estouro de pilha

import time
while time.strftime("%b, %d", time.localtime()) != "Dec, 25":
    time.sleep(60)
print "It's Christmas"

Python em 115 caracteres

Regras

Aqui estão as regras:

  • Suponha que o relógio do computador esteja sempre certo.
  • Seu código deve poder ser iniciado a qualquer momento.
  • Seu código deve ser impresso "It's Christmas"no Natal.
  • O loop não é certamente necessário, mas uma vez iniciado, seu código não deve parar até que seja impresso.
  • O menor código vence.
Patrick Perini
fonte
Eu pensei que a entrada é na data de Julian antes de ler este post
Ming-Tang

Respostas:

18

Perl + Unix, 40 caracteres

1until`date`=~/c 25/;say"It's Christmas"

É o mesmo que a solução Perl do JB , exceto que eu salvo alguns caracteres usando o datecomando externo em vez do Perl localtime.

Ilmari Karonen
fonte
143

Bash, 39

Para quem não pode esperar:

sudo date 12250000
echo It\'s Christmas

Isso segue todas as regras, especialmente a primeira.

Joey Adams
fonte
11
Inteligente. Não é o que eu quis dizer, mas malditamente inteligente.
Patrick Perini
8
“... e se o relógio do computador nem sempre estiver certo, faça-o.” Bom show!
JB
13
Você pode salvar 5 caracteres se for root. : D
Wug
29

Unix, 39 bytes

echo{,} "It\'s christmas"|at -t12252359

Com a ajuda de Dennis, obrigado por isso.

Usuário desconhecido
fonte
Isso viola »o looping certamente não é necessário, mas uma vez iniciado, seu código não deve parar até que seja impresso.«, No entanto.
Joey #
Eu não entendo sua crítica. Você afirma que isso está em loop? Que para antes de imprimir?
usuário desconhecido
2
Usando echo{,} "It\'s Christmas"|at -t12252359, isso é mais curto que a resposta aceita. (A barra invertida é necessária por forma a.)
Dennis
1
@ Dennis: Bom uso da expansão da cinta.
Joey Adams
18

PowerShell, 45 46 caracteres

for(;(date).date-ne'12/25'){}"It's Christmas"

Certamente não é muito eficiente em termos de energia; portanto, uma bateria de laptop pode morrer antes do Natal (motivo para desejar uma nova, talvez). Mas não dormir é definitivamente mais curto .

Isso também é independente de local. E obrigado a Jaykul por um bom truque para reduzir ainda mais isso.

Abusando um pouco das regras, 45 caracteres

for(){"It's Christmas"*((date)-like'12/25*')}

Isso imprimirá linhas vazias até o Natal, nas quais será impresso "É Natal".

Isto ...

  • ... pode ser iniciado a qualquer momento.
  • ... imprime "É Natal" no Natal. Várias vezes. O dia inteiro. (As regras não diziam nada sobre a frequência com que ela pode ser impressa.)
  • ... não imprime “É Natal” em não Natal (embora, nesse caso, imprima uma linha vazia; pode ser retificado sacrificando outro caractere, mas isso não ganha nada com a solução mais sã acima).
  • ... nunca para (nem mesmo depois de imprimir "It's Christmas", mas definitivamente não antes).
Joey
fonte
2
para (; (date) .date-ne "25/12") {} "É Natal" # 45 caracteres
Jaykul 6/06/11
Jaykul: Obrigado ... isso é algo que eu nunca pensaria estar trabalhando.
Joey #
O script "abusivo" também pode usar -matche sem o caractere curinga, sem ganho / perda de caracteres.
Iszi
Você pode remover o abuso agora, é desnecessário.
Erik the Outgolfer
@EriktheGolfer: Como assim? Ele ainda oferece uma abordagem alternativa interessante, mesmo que não seja mais curta.
Joey
13

Python (36 caracteres)

No espírito de abusar das regras:

  • Definitivamente imprime "It's Christmas" no Natal

  • Se não for Natal, passe o tempo imprimindo "É Natal"

    while True:
        print "It's Christmas"
    
Tentando
fonte
2
29 bytes: while 1:print"It's Christmas".
Erik the Outgolfer
11

PostScript, 90

(%Calendar%)currentdevparams begin{Month 12 eq Day 25 eq and{exit}if}loop(It's Christmas)=

Não funcione em uma impressora, ela não imprime uma página e apenas fará DoS sua impressora até o dia de Natal. Por outro lado, recuperar a impressora seria um belo presente.

MrMRDubya
fonte
4
Não esqueça de colar um sinal na impressora dizendo: NÃO MATE TRABALHO ATÉ O NATAL!
Joey Adams
Acho que a maioria das impressoras nem sequer tem um relógio de hardware funcionando, pois esse é um recurso opcional. Muito bom, embora :)
Joey
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Mr.Wizard
fonte
5

Perl, 44 45

perl -E'1until localtime=~/c 25/;say"It's Christmas"'

O tempo GMT não seria suficiente? (3 caracteres desativados ;-)

JB
fonte
1until localtime=~/c 25/;pouparia um char. :)
Ilmari Karonen
Eu pensei que já tinha tentado isso e falhou, mas acontece que eu realmente esqueci -Ena época. Obrigado!
JB
Sem problemas. (. Ps Acabei de publicar uma versão da sua solução usando backticks em vez de localtimeseguir Sinta-se livre para roubá-lo se quiser, mas eu senti a dependência adicional justifica uma resposta em separado..)
Ilmari Karonen
Naaaw, a vergonha está em mim por não pensar nisso novamente . A resposta separada é perfeitamente justificada pela IMO (e votada).
JB
5

Perl, 45

{localtime=~/c 25/&&die"It's Christmas";redo}

Perl, 44

usando operador ternário (Agradecimentos a Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
fonte
? :em vez de && ;você economizaria um caractere também. (E eu usaria em sayvez de dieuma saída mais bonita.)
Ilmari Karonen
@ Ilmari Karonen: obrigado. Mas, ao sayinvés de morrer, o script nunca termina.
Toto
Será, se você usar o operador ternário.
Ilmari Karonen
@ Ilmari Karonen: sim, é claro. Pode ser que eu esteja cansado demais !!!
Toto
5

Javascript, 51 caracteres

É um assassino de CPU:

while(!/c 25/.test(Date()));alert("It's Christmas")
David Murdoch
fonte
4

Eu queria fazer isso sem analisar as strings. Posteriormente, há muitos números mágicos no meu código.

Fiz algumas aproximações para explicar os anos bissextos. Ninguém disse que tinha de imprimi-lo às 00:00:00 de 25 de dezembro!

Perl, 80 69 57 caracteres

{(time-30931200)%31557600<86399?die"It's Christmas":redo}

Editado para um loop mais conciso!

Ben Richards
fonte
4

R (47)

while(!grepl("c 25",date())){};"It's Christmas"
zx8754
fonte
3

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
fonte
Isso 1no final da segunda linha parece bastante suspeito para mim. : P
cjfaure
@ Trimsty: O 1fornece um corpo para o loop while. É basicamente uma espera movimentada até 25 de dezembro. Tem o mesmo efeito while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, ok, obrigado por esclarecer isso.
cjfaure
Eu acho time.ctime()que faria.
Gnibbler
@gnibbler: De fato seria. Boa pegada.
Steven Rumbalski
3

TI-BASIC, 42 38

Repeat 769=sum(getDate²,2
End
"It's Christmas

Espera que o formato da data seja AAAA / MM / DD.

getDate cria uma lista de três elementos {year,month,day} ; somente no Natal o mês ^ 2 + dia ^ 2 é igual a 769.

23 bytes são usados ​​para a sequência porque as letras minúsculas têm dois bytes cada, exceto i, que é exibido como o token da unidade imaginária.

lirtosiast
fonte
2

Arquivo em lote, 68 caracteres

:l
@date/t|findstr/c:"-12-25">nul&&echo It's Christmas&&exit
@goto l

Não é utilizável interativamente, pois mata a sessão. Resolução que exigiria mais 5 caracteres.

Também sensível à localidade. Isso funciona no meu código do idioma que usa o formato de data ISO 8601.

Mas, ei, é um arquivo em lotes (pela maioria nem sequer é considerado uma linguagem de programação). E menor que o Javascript (e no mesmo nível do Python).

Joey
fonte
2

Groovy, 55

while(!new Date()==~/.*c 25.*/);
println"It's Christmas"

Acho que funciona, mas ainda está esperando a saída.

Armand
fonte
Se os regexps do Groovy são parecidos na maioria dos outros idiomas, eles .*são totalmente desnecessários. (. Ps Você pode testá-lo à espera de 05 de dezembro, em vez de 25.)
Ilmari Karonen
1
Ilmari, Groovy é uma linguagem JVM e as expressões regulares do Java são ancoradas por padrão.
Joey
1
Ilmari, eu iria verificar, mas meu programa ainda está em execução
Armand
2

(pdf) eTeX - 180 caracteres apenas de 1 a 25 de dezembro.

\lccode`m`~\let\e\expandafter\def~{\ifdim900pt<\pdfelapsedtime
sp\pdfresettimer\else\e~\fi}\lowercase\e{\e\scantokens\e
{\romannumeral\numexpr (25 - \day)*96000}}It's Christmas!\bye

O TeX tem apenas uma maneira de acessar a data em que o programa é iniciado e o tempo decorrido desde o início, limitado a 32768 segundos. Por isso, preciso calcular o número de segundos a esperar e, a cada segundo, fazer um loop que aguarde o tempo decorrido para alcançar 1se redefinir o tempo. (Precisamente, estou fazendo blocos de 900 segundos.)

Trabalhar para qualquer mês requer mais trabalho: 355 caracteres.

\lccode`m=`~\let\o\or\let\y\year\let\n\numexpr\let\e\expandafter
\def\b#1{\ifnum#1=\n(#1/4)*4\relax+1\fi}\def~{\ifdim
900pt<\pdfelapsedtime sp\pdfresettimer\else\e~\fi}\lowercase
\e{\e\scantokens\e{\romannumeral\n(25-\day+\ifcase\month\o334\b\y
\o303\b\y\o275\o244\o214\o183\o153\o122\o91\o61\o30\o0\ifnum25<\day
365\b{\n\y+1}\fi\fi)*96000}}It's Christmas!\bye
Bruno Le Floch
fonte
2

MySQL, 180 caracteres

Porque para que você está usando seu mecanismo de banco de dados?

DELIMITER $$
CREATE FUNCTION c() RETURNS CHAR(14) BEGIN a: LOOP IF DAY(NOW())=25 && MONTH(NOW())=12 THEN RETURN 'It\'s Christmas'; END IF; END LOOP a; END$$
DELIMITER ;
SELECT c();

Não é muito competitivo longitudinalmente, mas ei, é factível!

TehShrike
fonte
Tente DELIMITER /, RETURNS TEXTe CURDATE()LIKE'%12-25'; e tente remover algum espaço em branco.
Titus
2

Ruby, 53

until Time.now.to_s=~/c 25/
end
puts"It's Christmas!"
Steven Rumbalski
fonte
2

PHP, 40 bytes

<?while(date(dm)-1225);?>It´s Christmas;

Loop até 25 de dezembro; depois saia para o modo comum e imprima.

Execute com as configurações padrão (não exiba avisos).

Titus
fonte
2

Código de máquina 8086, 33 bytes

00000000  b4 2a cd 21 81 fa 19 0c  75 f6 b4 09 ba 12 01 cd  |.*.!....u.......|
00000010  21 c3 49 74 27 73 20 43  68 72 69 73 74 6d 61 73  |!.It's Christmas|
00000020  24                                                |$|
00000021
user5434231
fonte
1

Javascript, 93 89 78 77 caracteres

function x(){Date().match("c 25")?alert("It's Christmas"):setTimeout(x,1)}x()

JiminP
fonte
@ Joey Thanks! Eu esqueci disso.
JiminP
2
Outra versão não-bloqueadora: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)com 61 caracteres ... a única desvantagem é que será o alert()dia todo no Natal.
David Murdoch
Por setIntervalque 1? setInverala 1000*60*60*24e ambos não fará com que o processo de sofrer e irá notificar apenas uma vez no Natal.
George Mauer 12/02
1

D, 130

import std.datetime,std.stdio;
main(){
do{
auto t = Clock.currTime();
}while(t.month!=12||t.day!=25);
writeln("It's Christmas");
}
catraca arrepiante
fonte
Provavelmente, você pode salvar dois caracteres na tarefa. E um pouco mais, reduzindo o número de linhas.
Joey #
Eu posso também poupar algum usando t.month^12|t.day^25(se eu conseguir minhas prioridades direito)
catraca aberração
1

Q, 63 caracteres

system"t 1000";.z.ts:{$["12.25"~-5#-3!.z.d;1"It's Christmas";]}

vai trabalhar no dia de natal todos os anos

tmartin
fonte
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Assumindo SERVEROUTPUT ON
  • Mais curta que a solução MySql (coma isso, MySql!)
  • Tarde demais para o ano passado, mas a tempo para este ano
  • Tentei em DBMS_OUTPUT.putvez de, DBMS_OUTPUT.put_linemas isso não imprime nada.
SQB
fonte
1

C # (126)

using System;class P{static void Main(){while(DateTime.Now.Date.ToString("Md")!="1225");Console.WriteLine("It's Christmas");}}

Melhor para a sua bateria:

C # (163)

using s=System;class P{static void Main(){s.Threading.Thread.Sleep(s.DateTime.ParseExact("1225","Md",null)-s.DateTime.Now);s.Console.WriteLine("It's Christmas");}}

editar

A segunda versão ("melhor para a bateria") tem um pouco de um problema de dezembro. 26 a dez. 31 eu apenas pensei em: P

Ambas as versões provavelmente podem ser reduzidas um pouco mais.

RobIII
fonte
1

Japt , 27 bytes (não concorrente)

Ks f"c 25" ?`It's CËItµs`:P

Para testar a data de hoje: Substitua c 25pela última letra deste mês (taquigrafia) + espaço + dia do mês. Feb 02==b 02

Experimente online! Não competir porque Japt é muito mais novo que esse desafio.

Oliver
fonte
1

VBA, 58 bytes

O VBE anônimo inicia a função de janela que não recebe entrada e é executada até o dia de Natal, quando sai It's Christmaspara a janela do VBE.

While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"
Taylor Scott
fonte
0

bash-n-date: 69 caracteres:

sleep $(($(date -d"12/25" +%s)-$(date +%s))) && echo "It's X-Ray    "

Mas falhará de 26 a 31 de dezembro.

Usuário desconhecido
fonte
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
fonte
> Se não for Natal, espere até o Natal e imprima "É Natal".
skeevey
Minhas desculpas, corrigidas para verificar a cada segundo se é Natal ... então isso imprimirá "É Natal" 86.400 vezes a cada 25 de dezembro. Obviamente, você pode alterar isso aumentando o temporizador, que está em milissegundos.
precisa saber é