Est-ce Noël?

33

Défi

Étant donné que Noël est:

  • décembre
  • Mois 12
  • Jour 25

Chaque année, déterminez la date d'aujourd'hui et indiquez si Noël est ou non. Si c'est Noël, vous devez imprimer "It's Christmas". Si ce n'est pas Noël, vous devez attendre Noël pour pouvoir l'imprimer "It's Christmas".

Exemple

De cette question de débordement de pile

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

Python en 115 caractères

Règles

Voici les règles:

  • Supposons que l'horloge de l'ordinateur a toujours raison.
  • Votre code doit pouvoir être lancé à tout moment.
  • Votre code doit être imprimé "It's Christmas"à Noël.
  • La mise en boucle n'est certainement pas nécessaire, mais une fois démarré, votre code ne doit pas s'arrêter avant l'impression.
  • Le code le plus court gagne.
Patrick Perini
la source
Je pensais que l'entrée est en date Julian avant de lire ce post
Ming-Tang

Réponses:

18

Perl + Unix, 40 caractères

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

C'est la même chose que la solution Perl de JB , sauf que je sauve quelques caractères en utilisant la datecommande external au lieu de celle de Perl localtime.

Ilmari Karonen
la source
143

Bash, 39 ans

Pour ceux qui ne peuvent pas attendre:

sudo date 12250000
echo It\'s Christmas

Cela suit toutes les règles, en particulier la première.

Joey Adams
la source
11
Intelligent. Pas ce que je voulais dire, mais sacrément malin.
Patrick Perini
8
"... et si l'horloge de l'ordinateur n'est pas toujours assez correcte, fabrique-la." Bon spectacle!
JB
13
Vous pouvez enregistrer 5 caractères si vous êtes root. : D
Wug
29

Unix, 39 octets

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

Avec l'aide de Dennis, merci pour cela.

Utilisateur inconnu
la source
Cela viole »La mise en boucle n'est certes pas nécessaire, mais une fois démarré, votre code ne doit pas s'arrêter avant d'avoir été imprimé.«, Cependant.
Joey
Je ne comprends pas votre critique. Vous prétendez que c'est en boucle? Qu'il s'arrête avant d'imprimer?
utilisateur inconnu
2
En utilisant echo{,} "It\'s Christmas"|at -t12252359, c'est plus court que la réponse acceptée. (La barre oblique inverse est obligatoire d'ailleurs.)
Dennis
1
@ Dennis: Bon usage de l'expansion du corset.
Joey Adams
18

PowerShell, 45 46 caractères

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

Ce n'est certainement pas très efficace en énergie, donc une batterie d'ordinateur portable pourrait mourir avant Noël (raison de souhaiter une nouvelle, peut-être). Mais ne pas dormir est définitivement plus court .

Ceci est également agnostique. Et merci à Jaykul pour cette astuce qui a permis de réduire davantage cette réduction.

Abuser un peu des règles, 45 caractères

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

Cela imprimera des lignes vides jusqu'à Noël, sur lequel sera imprimé «C'est Noël».

Il ...

  • ... peut être démarré à tout moment.
  • ... imprime «C'est Noël» à Noël. Plusieurs fois. Toute la journée (Les règles ne disent rien sur la fréquence d'impression.)
  • ... n'imprime pas «c'est Noël» lors de Noël (bien qu'il y ait une ligne vide dans ce cas; on peut y remédier en sacrifiant un autre personnage, mais cela ne rapporte rien par rapport à la solution plus saine ci-dessus).
  • ... ne s’arrête jamais (même après l’impression «C’est Noël», mais certainement pas avant).
Joey
la source
2
pour (; (date) .date-ne "12/25") {} "C'est Noël" # 45 caractères
Jaykul
Jaykul: Merci ... c'est quelque chose que je n'aurais jamais pensé travailler.
Joey
Le script "abusif" pourrait également utiliser -match, et se passer du caractère générique, sans gain ni perte de caractères.
Iszi
Vous pouvez supprimer les abus maintenant, c'est inutile.
Erik the Outgolfer
@EriktheGolfer: Comment ça? Il offre toujours une approche alternative intéressante, même si elle n’est pas plus courte.
Joey
13

Python (36 caractères)

Dans un esprit d'abus des règles:

  • Imprime définitivement "C'est Noël" à Noël

  • Si ce n'est pas Noël, passez le temps en imprimant "C'est Noël"

    while True:
        print "It's Christmas"
    
En essayant
la source
2
29 octets: 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)=

Ne lancez pas sur une imprimante, elle n’imprimera pas de page et ne imprimera votre imprimante que jusqu'au jour de Noël. Encore une fois, récupérer votre imprimante serait un beau cadeau.

MrMRDubya
la source
4
N'oubliez pas de coller une pancarte indiquant à l'imprimeur: NE TUEZ PAS LE TRAVAIL AVANT NOËL!
Joey Adams
Je suppose que la plupart des imprimantes n’auront même pas d’horloge matérielle en état de fonctionnement, ce qui est une fonctionnalité facultative. Très sympa cependant :)
Joey
7

Mathematica, 47

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

Perl, 44 45

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

Le temps GMT ne serait-il pas suffisant? (3 caractères off ;-)

JB
la source
1until localtime=~/c 25/;vous sauverait un caractère. :)
Ilmari Karonen
Je pensais avoir déjà essayé et échoué, mais il s’est avéré que j’avais oublié -Eà ce moment-là. Merci!
JB
Aucun problème. (Ps. Je viens de poster une version de votre solution en utilisant des backticks au lieu de localtimeci - dessous. N'hésitez pas à la voler si vous voulez, mais je pensais que la dépendance supplémentaire justifiait une réponse séparée.)
Ilmari Karonen Le
Naaaw, la honte est sur moi pour ne pas y penser à nouveau . La réponse séparée est parfaitement justifiée OMI (et votée).
JB
5

Perl, 45

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

Perl, 44

en utilisant l'opérateur ternaire (Merci à Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
la source
? :au lieu de, && ;cela vous sauverait aussi un personnage. (Et j'utiliserais sayplutôt que diepour une sortie plus jolie.)
Ilmari Karonen
@Ilmari Karonen: merci. Mais en utilisant sayau lieu de mourir, le script ne finit jamais.
Toto
Ce sera le cas si vous utilisez l'opérateur ternaire.
Ilmari Karonen
@Ilmari Karonen: oui, bien sûr. Peut-être que je suis trop fatigué !!!
Toto
5

Javascript, 51 caractères

C'est un tueur de CPU:

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

Je voulais faire cela sans analyser les chaînes. Par la suite, mon code contient beaucoup de chiffres magiques.

J'ai fait une approximation pour rendre compte des années bissextiles. Personne n'a dit qu'il devait l'imprimer dès le 25 décembre, à 00:00:00!

Perl, 80 69 57 caractères

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

Édité pour une boucle plus concise!

Ben Richards
la source
4

R (47)

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

Python, 66 à 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
la source
Cela 1me semble plutôt méfiant à la fin de la deuxième ligne. : P
cjfaure
@Trimsty: Le 1fournit un corps pour la boucle while. Il s’agit essentiellement d’attendre jusqu’au 25 décembre. L’effet est similaire while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, d'accord, merci d'avoir éclairci la situation.
cjfaure
Je pense que le time.ctime()ferait.
Gnibbler
@gnibbler: en effet il le ferait. Belle prise.
Steven Rumbalski
3

TI-BASIC, 42 38

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

S'attend à ce que le format de date soit AAAA / MM / JJ.

getDate crée une liste de trois éléments {year,month,day}; seulement à Noël, le mois ^ 2 + jour ^ 2 est égal à 769.

23 octets sont utilisés pour la chaîne car les lettres minuscules sont deux octets chacune, sauf pour i qui est affiché en tant que jeton d'unité imaginaire.

lirtosiast
la source
2

Fichier de commandes, 68 caractères

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

Non utilisable de manière interactive, car cela tue la session. Une résolution qui nécessiterait 5 caractères supplémentaires.

Également sensible aux paramètres régionaux. Cela fonctionne sur mon environnement local qui utilise le format de date ISO 8601.

Mais bon, c’est un fichier batch (pour la plupart même pas considéré comme un langage de programmation). Et plus court que Javascript (et à égalité avec Python).

Joey
la source
2

Groovy, 55 ans

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

Pense que cela fonctionne, mais attend toujours la sortie.

Armand
la source
Si les expressions rationnelles de Groovy ressemblent à celles de la plupart des autres langues, elles .*sont totalement inutiles. (Ps. Vous pouvez le tester en attendant le 5 décembre au lieu du 25)
Ilmari Karonen
1
Ilmari, Groovy est un langage JVM et les expressions rationnelles de Java sont ancrées par défaut.
Joey
1
Ilmari, je vérifierais mais mon programme est toujours en cours d'exécution
Armand
2

(pdf) eTeX - 180 caractères seulement les 1er et 25 décembre.

\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 ne dispose que d’un moyen d’accéder à la date de démarrage du programme et au temps écoulé depuis le début, limité à 32 768 secondes. Je dois donc calculer le nombre de secondes à attendre et faire une boucle pendant temps écoulé pour atteindre 1set réinitialiser le temps. (Justement, je fais des blocs de 900 secondes.)

Travailler pour n’importe quel mois nécessite plus de travail: 355 caractères.

\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
la source
2

MySQL, 180 caractères

Parce que vous utilisez votre moteur de base de données pour quoi faire?

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

Pas très compétitif en longueur, mais bon, c'est faisable!

TehShrike
la source
Essayez DELIMITER /, RETURNS TEXTet CURDATE()LIKE'%12-25'; et essayez de supprimer certains espaces.
Titus
2

Ruby, 53 ans

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

PHP, 40 octets

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

Boucle jusqu'au 25 décembre; puis quittez en mode brut et imprimez.

Exécuter avec les paramètres par défaut (ne pas afficher les avis).

Titus
la source
2

8086 code machine, 33 octets

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
utilisateur5434231
la source
1

Javascript, 93 89 78 77 caractères

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

JiminP
la source
@ Joey Merci! J'ai oublié cela.
jeudi
2
Une autre version non bloquante: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)à 61 caractères ... le seul inconvénient est que ce sera alert()toute la journée à Noël.
David Murdoch
Pourquoi setInterval1? setInveralà 1000*60*60*24et à la fois ne fera pas le processus souffrent et informera qu'une seule fois sur Noël.
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");
}
monstre à cliquet
la source
Vous pouvez probablement enregistrer deux caractères dans l’affectation. Et quelques autres en réduisant le nombre de lignes.
Joey
Je peux aussi en économiser en utilisant t.month^12|t.day^25(si mes priorités sont bien définies)
freak
1

Q, 63 caractères

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

travaillera pour le jour de Noël chaque année

tmartin
la source
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • En supposant SERVEROUTPUT ON
  • Plus court que la solution MySql (mangez ça, MySql!)
  • Trop tard pour l'année dernière, mais à temps pour cette année
  • Essayé DBMS_OUTPUT.putau lieu de DBMS_OUTPUT.put_linemais cela n'imprime rien.
SQB
la source
1

C # (126)

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

Plus sympa pour votre batterie:

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

modifier

La deuxième version ("plus agréable pour votre batterie") a un problème décroissant. 26 au déc. 31e je viens de penser à: P

Les deux versions peuvent probablement être raccourcies un peu plus.

RobIII
la source
1

Japt , 27 octets (non concurrents)

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

Pour tester par rapport à la date du jour: remplacez c 25par la dernière lettre du mois (raccourci) + espace + jour du mois. Feb 02==b 02

Essayez-le en ligne! Non compétitif car Japt est bien plus récent que ce défi.

Oliver
la source
1

VBA, 58 octets

VBE anonyme active la fonction de fenêtre qui ne prend aucune entrée et s’exécute jusqu’au jour de Noël; à ce moment, il émet It's Christmasvers la fenêtre d’affichage VBE.

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

bash-n-date: 69 caractères:

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

Mais cela échouera du 26 au 31 décembre.

Utilisateur inconnu
la source
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
la source
> Si ce n'est pas Noël, vous devez attendre jusqu'à Noël, puis imprimer "C'est Noël".
Skeevey
Toutes mes excuses, corrigé pour vérifier chaque seconde si c'est Noël ... ainsi, cela affichera "C'est Noël" 86 400 fois tous les 25 décembre. Évidemment, vous pouvez modifier cela en augmentant la minuterie, qui est en millisecondes.
Sinedcm