¿Es navidad?

33

Reto

Dado que la Navidad es:

  • diciembre
  • Mes 12
  • Día 25

Cada año, determine la fecha de hoy y si hoy es Navidad o no. Si es Navidad, debes imprimir "It's Christmas". Si no es Navidad, de alguna manera debe esperar hasta Navidad y luego imprimir "It's Christmas".

Ejemplo

De esta pregunta de desbordamiento de pila

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

Python en 115 caracteres

Reglas

Estas son las reglas:

  • Suponga que el reloj de la computadora siempre está correcto.
  • Su código debe poder iniciarse en cualquier momento.
  • Su código debe imprimirse "It's Christmas"en Navidad.
  • Looping ciertamente no es necesario, pero una vez iniciado, su código no debe detenerse hasta que se haya impreso.
  • El código más corto gana.
Patrick Perini
fuente
Pensé que la entrada estaba en fecha juliana antes de leer esta publicación
Ming-Tang

Respuestas:

18

Perl + Unix, 40 caracteres

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

Esto es lo mismo que la solución Perl de JB , excepto que guardo algunos caracteres usando el datecomando externo en lugar de Perl localtime.

Ilmari Karonen
fuente
143

Bash, 39

Para aquellos que simplemente no pueden esperar:

sudo date 12250000
echo It\'s Christmas

Esto sigue todas las reglas, especialmente la primera.

Joey Adams
fuente
11
Inteligente. No es lo que quise decir, pero malditamente inteligente.
Patrick Perini
8
"... y si el reloj de la computadora no siempre es lo suficientemente correcto, hazlo". ¡Buen espectáculo!
JB
13
Puedes guardar 5 caracteres si eres root. : D
Wug
29

Unix, 39 bytes

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

Con la ayuda de Dennis, gracias por eso.

usuario desconocido
fuente
Esto viola "Looping ciertamente no es necesario, pero una vez iniciado, su código no debe detenerse hasta que se haya impreso".
Joey
No entiendo tu crítica. ¿Afirmas que esto es un bucle? ¿Que se detiene antes de imprimir?
usuario desconocido
2
Usando echo{,} "It\'s Christmas"|at -t12252359, esto es más corto que la respuesta aceptada. (La barra invertida es obligatoria por cierto.)
Dennis
1
@ Dennis: Buen uso de la expansión de llaves.
Joey Adams
18

PowerShell, 45 46 caracteres

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

Ciertamente, no es muy eficiente en el consumo de energía, por lo que una batería de computadora portátil podría morir antes de Navidad (razón para desear una nueva, tal vez). Pero no dormir es definitivamente más corto .

Esto también es independiente del entorno local. Y gracias a Jaykul por un buen truco para reducir esto aún más.

Abusando un poco de las reglas, 45 caracteres

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

Esto imprimirá líneas vacías hasta que sea Navidad, sobre el cual imprimirá "Es Navidad".

Eso ...

  • ... se puede iniciar en cualquier momento.
  • ... imprime "Es Navidad" en Navidad. Varias veces. Todo el día (Las reglas no decían nada sobre la frecuencia con la que se puede imprimir).
  • ... no imprime "It's Christmas" en no-Christmas (aunque imprime una línea vacía en ese caso; puede rectificarse sacrificando otro personaje, pero esto no gana nada sobre la solución más sensata anterior).
  • ... nunca se detiene (ni siquiera después de haber impreso "It's Christmas", pero definitivamente no antes).
Joey
fuente
2
for (; (date) .date-ne "12/25") {} "It's Christmas" # 45 chars
Jaykul
Jaykul: Gracias ... eso es algo que nunca hubiera pensado que estaría funcionando.
Joey
El script "abusivo" también podría usar -match, y prescindir del comodín, sin ganancia / pérdida de caracteres.
Iszi
Puede eliminar el abuso ahora, no es necesario.
Erik the Outgolfer
@EriktheGolfer: ¿Cómo es eso? Todavía ofrece un enfoque alternativo interesante, aunque no es más corto.
Joey
13

Python (36 caracteres)

En el espíritu de abusar de las reglas:

  • Definitivamente imprime "Es Navidad" en Navidad

  • Si no es Navidad, pase el tiempo imprimiendo "Es Navidad"

    while True:
        print "It's Christmas"
    
Molesto
fuente
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)=

No ejecute en una impresora, no imprime una página, y solo hará DoS su impresora hasta el día de Navidad. Por otra parte, recuperar su impresora sería un buen regalo.

MrMRDubya
fuente
44
No olvide pegar un letrero en la impresora que diga: ¡NO MATAR EL TRABAJO HASTA LA NAVIDAD!
Joey Adams
Supongo que la mayoría de las impresoras ni siquiera tendrán un reloj de hardware que funcione, ya que es una característica opcional. Muy agradable, aunque :)
Joey
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Señor mago
fuente
5

Perl, 44 45

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

¿No sería suficiente el tiempo GMT? (3 caracteres apagados ;-)

JB
fuente
1until localtime=~/c 25/;te ahorraría un char. :)
Ilmari Karonen
Pensé que ya lo había intentado y falló, pero resulta que en realidad lo olvidé -Een ese momento. ¡Gracias!
JB
No hay problema. (Ps. Acabo de publicar una versión de su solución usando backticks en lugar de a localtimecontinuación. Siéntase libre de robarla si lo desea, pero sentí que la dependencia adicional justificaba una respuesta por separado.)
Ilmari Karonen
Naaaw, la culpa es mía por no pensar en eso otra vez . La respuesta por separado está perfectamente justificada por la OMI (y votada).
JB
5

Perl, 45

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

Perl, 44

utilizando el operador ternario (Gracias a Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
fuente
? :en lugar de && ;ahorrarte un char también. (Y lo usaría en saylugar de dieuna salida más bonita.)
Ilmari Karonen
@Ilmari Karonen: gracias. Pero al usar en saylugar de morir, el guión nunca termina.
Toto
Lo hará, si utiliza el operador ternario.
Ilmari Karonen
@Ilmari Karonen: sí, por supuesto. Puede ser que estoy muy cansado !!!
Toto
5

Javascript, 51 caracteres

Es un asesino de CPU:

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

Quería hacer esto sin analizar cadenas. Posteriormente, hay muchos números mágicos en mi código.

Hice alguna aproximación para dar cuenta de los años bisiestos. ¡Nadie dijo que tenía que imprimirlo justo a las 00:00:00, 25 de diciembre!

Perl, 80 69 57 caracteres

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

Editado para bucles más concisos!

Ben Richards
fuente
4

R (47)

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

Pitón, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
fuente
Eso 1al final de la segunda línea me parece bastante sospechoso. : P
cjfaure
@Trimsty: 1proporciona un cuerpo para el bucle while. Básicamente es una espera ocupada hasta el 25 de diciembre. Tiene el mismo efecto que while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, está bien, gracias por aclarar eso.
cjfaure
Creo que time.ctime()lo haría
gnibbler
@gnibbler: De hecho lo haría. Buena atrapada.
Steven Rumbalski
3

TI-BASIC, 42 38

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

Espera que el formato de fecha sea AAAA / MM / DD.

getDate crea una lista de tres elementos {year,month,day} ; solo en Navidad es mes ^ 2 + día ^ 2 igual a 769.

Se usan 23 bytes para la cadena porque las letras minúsculas son dos bytes cada una, excepto por i, que se muestra como el token de la unidad imaginaria.

lirtosiast
fuente
2

Archivo por lotes, 68 caracteres

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

No se puede usar de forma interactiva, ya que mata la sesión. Resolver eso requeriría 5 caracteres más.

También sensible a la localización. Esto funciona en mi entorno local que utiliza el formato de fecha ISO 8601.

Pero bueno, es un archivo por lotes (que la mayoría ni siquiera considera un lenguaje de programación). Y más corto que Javascript (y a la par con Python).

Joey
fuente
2

Groovy, 55

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

Creo que funciona, pero aún esperando la salida.

Armand
fuente
Si las expresiones regulares de Groovy son como en la mayoría de los otros idiomas, .*son completamente innecesarias. (Ps. Puede probarlo esperando el 5 de diciembre en lugar de 25.)
Ilmari Karonen
1
Ilmari, Groovy es un lenguaje JVM y las expresiones regulares de Java están ancladas por defecto.
Joey
1
Ilmari, lo comprobaría pero mi programa aún se está ejecutando
Armand
2

(pdf) eTeX - 180 caracteres solo del 1 al 25 de diciembre.

\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 solo tiene una forma de acceder a la fecha en que se inicia el programa, y ​​el tiempo transcurrido desde el inicio, con un límite de 32768 segundos, por lo que necesito calcular la cantidad de segundos a esperar y, por cada segundo, hacer un ciclo que espere tiempo transcurrido para alcanzar 1sy restablecer el tiempo. (Precisamente, estoy haciendo bloques de 900 segundos).

Trabajar para cualquier mes requiere más trabajo: 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
fuente
2

MySQL, 180 caracteres

Porque, ¿para qué estás usando tu motor de base de datos?

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

No es muy competitivo a lo largo, pero bueno, ¡es factible!

TehShrike
fuente
Tratar DELIMITER /, RETURNS TEXTy CURDATE()LIKE'%12-25'; e intente eliminar algunos espacios en blanco.
Titus
2

Rubí, 53

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

PHP, 40 bytes

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

Bucle hasta el 25 de diciembre; luego salga al modo plano e imprima.

Ejecutar con la configuración predeterminada (no mostrar avisos).

Titus
fuente
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
usuario5434231
fuente
1

Javascript, 93 89 78 77 caracteres

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

JiminP
fuente
@Joey ¡Gracias! Me olvide de eso.
JiminP
2
Otra versión sin bloqueo: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)con 61 caracteres ... el único inconveniente es que será alert()todo el día en Navidad.
David Murdoch
¿Por qué setIntervala 1? setInverala1000*60*60*24 y que ambos no hará que el proceso sufren y notificará sólo una vez en navidad.
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");
}
monstruo de trinquete
fuente
Probablemente pueda guardar dos caracteres en la tarea. Y algunos más al reducir el número de líneas.
Joey
También puedo ahorrar un poco usando t.month^12|t.day^25(si tengo mis prioridades correctas)
Ratchet Freak
1

Q, 63 caracteres

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

trabajará para el día de navidad todos los años

tmartin
fuente
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Asumiendo SERVEROUTPUT ON
  • Más corto que la solución MySql (¡cómelo, MySql!)
  • Demasiado tarde para el año pasado, pero a tiempo para este año.
  • Intenté en DBMS_OUTPUT.putlugar de DBMS_OUTPUT.put_linepero eso no imprime nada.
SQB
fuente
1

C # (126)

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

Más agradable para su batería:

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

La segunda versión ("más agradable para su batería") tiene un pequeño problema de dec. 26 al dic. 31º Solo pensé en: P

Ambas versiones probablemente se pueden acortar un poco más.

RobIII
fuente
1

Japt , 27 bytes (no competidor)

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

Para comparar con la fecha de hoy: Reemplace c 25con la última letra de este mes (abreviatura) + espacio + día del mes. Feb 02==b 02

Pruébalo en línea! No competir porque Japt es mucho más nuevo que este desafío.

Oliver
fuente
1

VBA, 58 bytes

La función de ventana VBE anónima inmediata no toma ninguna entrada y se ejecuta hasta el día de Navidad, momento en el que sale It's Christmasa la ventana VBE inmediata.

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

bash-n-date: 69 caracteres:

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

Pero fallará del 26 de diciembre al 31 de diciembre.

usuario desconocido
fuente
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
fuente
> Si no es Navidad, de alguna manera debe esperar hasta Navidad y luego imprimir "Es Navidad".
skeevey
Mis disculpas, corregidas para verificar cada segundo si es Navidad ... así que esto imprimirá "Es Navidad" 86.400 veces cada 25 de diciembre. Obviamente, puede modificar esto aumentando el temporizador, que está en milisegundos.
sinedcm