È Natale?


33

Sfida

Dato che il Natale è:

  • dicembre
  • Mese 12
  • 25 ° giorno

Ogni anno, determinare la data di oggi e se oggi è Natale. Se è Natale, devi stampare "It's Christmas". Se non è Natale, devi in ​​qualche modo aspettare fino a Natale e poi stampare "It's Christmas".

Esempio

Da questa domanda Stack Overflow

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

Python in 115 personaggi

Regole

Ecco le regole:

  • Supponiamo che l'orologio del computer sia sempre corretto.
  • Il tuo codice deve poter essere avviato in qualsiasi momento.
  • Il codice deve essere stampato "It's Christmas"a Natale.
  • Il looping non è certamente necessario, ma una volta avviato il codice non dovrebbe fermarsi fino a quando non viene stampato.
  • Il codice più corto vince.

Pensavo che l'input fosse in data giuliana prima di leggere questo post
Ming-Tang,

Risposte:


18

Perl + Unix, 40 caratteri

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

Questo è lo stesso della soluzione Perl di JB , tranne per il fatto che salvo alcuni caratteri usando il datecomando esterno anziché Perl localtime.


143

Bash, 39

Per coloro che non vedono l'ora:

sudo date 12250000
echo It\'s Christmas

Questo segue tutte le regole, specialmente la prima.


11
Intelligente. Non quello che volevo dire, ma dannatamente intelligente.
Patrick Perini,

8
"... e se l'orologio del computer non è sempre abbastanza giusto, fallo." Bello spettacolo!
JB,

13
Puoi salvare 5 caratteri se sei root. : D
Wug

29

Unix, 39 byte

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

Con l'aiuto di Dennis, grazie per quello.


Ciò viola »Il looping non è certamente necessario, ma una volta avviato il codice non deve arrestarsi fino a quando non viene stampato.«, Tuttavia.
Joey,

Non capisco la tua critica. Sostieni che questo è in loop? Che si ferma prima della stampa?
utente sconosciuto

2
Utilizzando echo{,} "It\'s Christmas"|at -t12252359, questo è più breve della risposta accettata. (A proposito, la barra rovesciata è necessaria.)
Dennis

1
@Dennis: buon uso dell'espansione del tutore.
Joey Adams,

18

PowerShell, 45 46 caratteri

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

Non è certamente molto efficiente dal punto di vista energetico, quindi una batteria del laptop potrebbe esaurirsi prima di Natale (motivo per desiderarne una nuova, forse). Ma non dormire è sicuramente più breve .

Anche questo è indipendente dalla locale. E grazie a Jaykul per un bel trucco nel ridurlo ulteriormente.

Abusare un po 'delle regole, 45 caratteri

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

Questo stamperà righe vuote fino a quando non è Natale, su cui stamperà "È Natale".

...

  • ... può essere avviato in qualsiasi momento.
  • ... stampa "È Natale" a Natale. Parecchie volte. L'intera giornata. (Le regole non dicono nulla sulla frequenza con cui può essere stampata.)
  • ... non stampa "È Natale" su non Natale (anche se in questo caso stampa una riga vuota; può essere rettificato sacrificando un altro personaggio, ma questo non guadagna nulla rispetto alla soluzione più sana sopra).
  • ... non si ferma mai (nemmeno dopo aver stampato "È Natale" ma sicuramente non prima).

2
per (; (data) .date-ne "12/25") {} "È Natale" # 45 caratteri
Jaykul,

Jaykul: Grazie ... è qualcosa che non avrei mai pensato di lavorare.
Joey,

Lo script "abusivo" potrebbe anche utilizzare -matche fare a meno del carattere jolly, senza alcun guadagno / perdita di caratteri.
Iszi il

È possibile rimuovere l'abuso ora, non è necessario.
Erik the Outgolfer,

@EriktheGolfer: In che modo? Offre ancora un approccio alternativo interessante, anche se non è più breve.
Joey,

13

Python (36 caratteri)

Nello spirito di abusare delle regole:

  • Sicuramente stampa "È Natale" a Natale

  • Se non è Natale, passa il tempo stampando "È Natale"

    while True:
        print "It's Christmas"
    

2
29 byte: 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)=

Non eseguire su una stampante, non stampa una pagina e farà solo la tua stampante fino al giorno di Natale. Inoltre, riavere la tua stampante sarebbe un bel regalo.


4
Non dimenticare di registrare un cartello sulla stampante che dice: NON UCCIDERE IL LAVORO FINO A NATALE!
Joey Adams,

Suppongo che la maggior parte delle stampanti non avrà nemmeno un orologio hardware funzionante in quanto questa è una funzione opzionale. Molto bello, però :)
Joey il

7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"

5

Perl, 44 45

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

L'ora GMT non sarebbe sufficiente? (3 caratteri fuori ;-)


1until localtime=~/c 25/;ti farebbe risparmiare un personaggio. :)
Ilmari Karonen,

Pensavo di averlo già provato e non ci riuscì, ma a quanto pare mi ero davvero dimenticato -Eal momento. Grazie!
JB,

Nessun problema. (Ps. Ho appena pubblicato una versione della tua soluzione usando i backtick invece che localtimesotto. Sentiti libero di rubarla se vuoi, ma ho sentito che la dipendenza aggiuntiva giustificava una risposta separata.)
Ilmari Karonen,

Naaaw, la vergogna è per me per non pensarci più . La risposta separata è perfettamente giustificata dall'IMO (e votata).
JB,

5

Perl, 45

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

Perl, 44

utilizzando l'operatore ternario (Grazie a Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}

? :invece di && ;risparmiare anche un carattere. (E saydie
userei

@Ilmari Karonen: grazie. Ma usando sayinvece di die, la sceneggiatura non finisce mai.
Toto

Lo farà, se si utilizza l'operatore ternario.
Ilmari Karonen,

@Ilmari Karonen: sì, certo. Forse sono troppo stanco !!!
Toto

5

Javascript, 51 caratteri

È un killer della CPU:

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

4

Volevo farlo senza analizzare le stringhe. Successivamente, ci sono molti numeri magici nel mio codice.

Ho fatto alcune approssimazioni per tenere conto degli anni bisestili. Nessuno ha detto che doveva stamparlo direttamente alle 00:00:00, il 25 dicembre!

Perl, 80 69 57 caratteri

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

Modificato per un loop più conciso!


4

R (47)

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

3

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"

Che 1alla fine della seconda riga mi sembra abbastanza sospetto. : P
cjfaure,

@Trimsty: 1fornisce un corpo per il ciclo while. Fondamentalmente è un'attesa impegnativa fino al 25 dicembre. Ha l'effetto simile a while 1:if'c 25'in time.asctime():break.
Steven Rumbalski,

Ah, ok, grazie per avermi chiarito.
cjfaure,

Penso che time.ctime()farebbe.
Gnibbler,

@gnibbler: In effetti lo sarebbe. Bella presa.
Steven Rumbalski,

3

TI-BASIC, 42 38

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

Si aspetta che il formato della data sia AAAA / MM / GG.

getDate crea un elenco di tre elementi {year,month,day}; solo a Natale è mese ^ 2 + giorno ^ 2 pari a 769.

23 byte vengono utilizzati per la stringa perché le lettere minuscole sono due byte ciascuna, ad eccezione di i che viene visualizzato come token unità immaginario.


2

File batch, 68 caratteri

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

Non utilizzabile in modo interattivo, in quanto uccide la sessione. Risoluzione che richiederebbe altri 5 personaggi.

Anche sensibile alle impostazioni locali. Funziona sul mio locale che utilizza il formato data ISO 8601.

Ma hey, è un file batch (per molti nemmeno considerato un linguaggio di programmazione). E più breve di Javascript (e alla pari con Python).


2

Groovy, 55

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

Penso che funzioni, ma sto ancora aspettando un output.


Se le regexps di Groovy sono come nella maggior parte delle altre lingue, quelle .*sono del tutto inutili. (Ps. Puoi provarlo aspettando il 5 dicembre invece del 25.)
Ilmari Karonen il

1
Ilmari, Groovy è un linguaggio JVM e le regex di Java sono ancorate di default.
Joey,

1
Ilmari, vorrei controllare ma il mio programma è ancora in esecuzione
Armand,

2

(pdf) eTeX - 180 caratteri solo 1-25 dicembre.

\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

TeX ha solo un modo per accedere alla data di avvio del programma e al tempo trascorso dall'inizio, limitato a 32768 secondi, quindi ho bisogno di calcolare il numero di secondi per aspettare, e per ogni secondo fare un ciclo che attende il tempo trascorso per raggiungere 1se azzerare il tempo. (Precisamente, sto facendo blocchi di 900 secondi.)

Lavorare per qualsiasi mese richiede più lavoro: 355 caratteri.

\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

2

MySQL, 180 caratteri

Perché comunque stai usando il tuo motore di database?

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

Non molto competitivo nel senso della lunghezza, ma hey, è fattibile!


Prova DELIMITER /, RETURNS TEXTe CURDATE()LIKE'%12-25'; e prova a rimuovere alcuni spazi bianchi.
Tito


2

PHP, 40 byte

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

Loop fino al 25 dicembre; quindi uscire in modalità normale e stampare.

Esegui con le impostazioni predefinite (non visualizzare gli avvisi).


2

8086 codice macchina, 33 byte

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

1

Javascript, 93 89 78 77 caratteri

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


@ Grazie Joey! Me ne sono dimenticato.
JiminP

2
Un'altra versione non bloccante: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)a 61 caratteri ... l'unico inconveniente è che sarà alert()tutto il giorno a Natale.
David Murdoch,

Perché setInterval1? setInveralper 1000*60*60*24e entrambi non renderà il processo di soffrire e vi comunicheremo solo una volta a Natale.
George Mauer,

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

Probabilmente puoi salvare due personaggi nell'assegnazione. E pochi altri riducendo il numero di linee.
Joey,

Posso anche salvarne alcuni usando t.month^12|t.day^25(se ho le mie priorità giuste)
maniaco del cricco

1

Q, 63 caratteri

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

lavorerà per il giorno di Natale ogni anno


1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • assumendo SERVEROUTPUT ON
  • Più breve della soluzione MySql (mangia, MySql!)
  • Troppo tardi per l'anno scorso, ma in tempo per quest'anno
  • Provato DBMS_OUTPUT.putinvece DBMS_OUTPUT.put_linema che non stampa nulla.

1

C # (126)

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

Più bello per la tua batteria:

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

modificare

La seconda versione ("più bella per la tua batteria") presenta un piccolo problema dec. Dal 26 al dic. 31 Ho appena pensato: P

Entrambe le versioni possono probabilmente essere abbreviate un po 'di più.


1

Japt , 27 byte (non concorrenti)

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

Per verificare la data odierna: sostituisci c 25con l'ultima lettera di questo mese (scorciatoia) + spazio + giorno del mese. Feb 02==b 02

Provalo online! Non competere perché Japt è molto più recente di questa sfida.


1

VBA, 58 byte

VBE anonimo immediatamente attiva la funzione della finestra che non accetta input e viene eseguito fino al giorno di Natale, momento in cui viene emesso It's Christmasalla finestra immediata di VBE.

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

0

bash-n-date: 69 caratteri:

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

Ma fallirà dal 26 dicembre al 31 dicembre.


0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}

> Se non è Natale, devi in ​​qualche modo attendere fino a Natale e quindi stampare "È Natale".
skeevey

Mi scuso, corretto per controllare ogni secondo se è Natale ... quindi questo stampa "È Natale" 86.400 volte ogni 25 dicembre. Ovviamente puoi modificarlo aumentando il timer, che è in millisecondi.
sinedcm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.