Encoder la date au format veille de Noël

51

Le jour où ce message a été publié était la veille de Noël. Demain ce sera Noël. Hier, c'était la veille de Noël. Dans deux jours ce sera

Christmas Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve

.

Votre travail consiste à prendre la date d'exécution du programme et à l'encoder au format veille de Noël.

  • Si votre programme est exécuté à Noël, il doit générer la chaîne "Noël".
  • Si votre programme n’est pas exécuté à Noël, il doit générer la chaîne "Noël", suivie de la chaîne "Eve" à plusieurs nreprises, avec nle nombre de jours avant Noël.
    • Notez que cela doit être basé sur le prochain Noël. Par exemple, si le jour est le 26 avril 2019, vous devez effectuer votre calcul en fonction du 25 décembre 2019, et non de tout autre Noël.
    • N'oubliez pas de compter les jours bissextiles.
  • Noël est le 25 décembre de chaque année.

C'est du , alors le code le plus court gagne! Notez cependant que l'objectif n'est pas de trouver le programme le plus court dans une langue, mais de trouver le programme le plus court dans chaque langue. Par exemple, si vous trouvez le programme C ++ le plus court, il remporte ce concours pour C ++, même si quelqu'un trouve un programme plus court en Python.

PyRulez
la source
7
D'une manière ou d'une autre, je savais que cela allait être un défi du PPCG dès l'instant où j'ai vu le dessin animé - +1 de moi
Black Owl Kai
25
Un dessin animé xkcd qui a été publié aujourd'hui. imgs.xkcd.com/comics/christmas_eve_eve.png
Chouette noire Kai
7
@BlackOwlKai LMBO Je n'ai même pas vu cette BD avant votre commentaire. J'avais déjà prévu de poster ceci et n'attendais que la veille de Noël. Les grands esprits se rencontrent, je suppose?
PyRulez
1
La date peut-elle être un paramètre?
Olivier Grégoire
1
@ OlivierGrégoire Euh, je le permettrai si la langue n'a pas la possibilité d'obtenir la date actuelle d'une autre manière.
PyRulez

Réponses:

52

SmileBASIC, 73 71 67 octets

?"Christmas";
@L?" Eve"*(D!=P);
P=D
DTREAD OUT,M,D
IF M/D-.48GOTO@L

Le programme imprime "Noël", puis "Eve" chaque jour, jusqu'au 25 décembre. (12/25 = 0,48)
Peut prendre jusqu'à un an.

12Me21
la source
7
pur génie ...
FlipTack
7
Cela m'a fait sourire ...
Neil
3
Agréable! Une de mes solutions JavaScript adopte une approche similaire. Cependant, en JavaScript, le temps d’attente n’est que le meilleur des efforts. Comment se porte SmileBASIC à cet égard?
Targumon
4
@ 12Me21 qui échouerait évidemment à cause de secondes intercalaires, cette version a bien meilleure apparence.
Rɪᴋᴇʀ
5
+1 pour sortir des sentiers battus et me faire rire.
Tom
24

Formule Excel, 59 octets

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
Richard Crossley
la source
4
Je pense que YEAR(TODAY()+6)retourne toujours la bonne année, évitant ainsi la condition.
Neil
3
Je pense que YEAR(NOW()+6)fonctionne aussi avec 2 octets de moins.
Ingénieur Toast
2
Je pense = "Noël" & REPT ("Eve", DATE (ANNÉE (MAINTENANT () + 6), 12,26) -NOW ()) est encore plus court et je crois que cela devrait fonctionner.
JeroendeK
1
NOW()comprend le temps, donc ce ne sera pas un entier et je ne suis pas sûr REPTque le permettrait.
12Me21
2
mais cela ne donne pas "Noël" le jour de Noël. Chèque="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony
12

Perl 6 , 61 47 octets

dites 'Noël' ~ 'Eve'x (Date.aujourd'hui ... ^ {. mois == 12 &&. jour == 25})

say 'Christmas'~' Eve'x(Date.today...^/12\-25/)

Essayez-le en ligne!

-14 octets (!) Grâce à Jo King

Date.today ...^ /12\-25/est la séquence de dates commençant aujourd'hui et se terminant la veille de Noël. (L'expression régulière /12\-25/correspond à la représentation sous forme de chaîne des dates.) La chaîne " Eve"est répliquée un nombre de fois égal à la longueur de cette séquence et est sortie après la chaîne "Christmas".

Sean
la source
Pourriez-vous faire "mois> 11" pour sauvegarder un octet?
Chrixbittinx
2
Serait /12.25/travailler?
Kritixi Lithos
2
@Cowsquack Non, car il se peut que l'année soit identique à celle de12025-12-24
Jo King
Je pense qu'il est prudent de supposer que cela n'arrivera jamais
12Me21
8

R , 112 106 72 octets

Via @digEmAll et @ J.Doe

x=Sys.Date()-1;cat('Christmas');while(!grepl('12-25',x<-x+1))cat(' Eve')

Essayez-le en ligne!

Ma réponse initiale était antérieure à la clarification selon laquelle le code devait prendre comme date la date à laquelle le code est exécuté. Il pourrait être modifié comme ci-dessus pour économiser beaucoup d'octets, mais je ne vais pas m'en faire.

function(x,z=as.Date(paste0(strtoi(format(x,"%Y"))+0:1,"-12-25"))-x)cat("Christmas",rep("Eve",z[z>=0][1]))

Essayez-le en ligne!

Explication: tout le monde est à l'église alors j'ai le temps de le faire. Extraire l'année, contraindre à un entier. Créez un vecteur de Noël de cette année et de l'année suivante et soustrayez la date d'entrée pour obtenir un vecteur de deux différences entre la date d'entrée et ces deux Xmases.

Choisissez le non négatif et cat"Noël" avec autant de "Eves".

ngm
la source
Vous n'utilisez yqu'une seule fois, vous pouvez donc l'utiliser directement pour 108 octets.
Giuseppe
Aussi z[z>=0][1]travaillerait au lieu de min?
Giuseppe
73 octets . Selon le dernier commentaire, le programme doit afficher le texte en fonction du jour où il est exécuté. Joyeux Noël BTW! : D
digEmAll
1
Ajustez le vôtre pendant 72 octets , @digEmAll. Joyeux Noël!
J.Doe
8

Windows PowerShell , 67 64 63 octets

for(;1225-'{0:Md}'-f(date|% *ys $i)){$i++}'Christmas'+' eve'*$i

Essayez-le en ligne!

Géré pour raser 3 octets 4 octets (merci charlatans ) en utilisant l' -fopérateur ormat au lieu de .ToString(), puis en soustrayant la chaîne de date de la valeur numérique 1225 au lieu de faire une comparaison avec -ne. L'entier résultant sera interprété comme un booléen pour le conditionnel où 0(ce qui se passera à Noël) est interprété comme False(n'entrez pas dans la boucle), et toute autre valeur est interprétée comme True(entrez dans la boucle).

Puisque le nombre entier est maintenant à gauche, la chaîne de date sera convertie en nombre entier et les calculs seront effectués, contrairement à la version précédente où le 1225nombre entier a été converti en chaîne pour la comparaison.

Version originale


Windows PowerShell , 67 octets

for(;(date|% *ys $i|% tost* Md)-ne1225){$i++};'Christmas'+' eve'*$i

Essayez-le en ligne!

Utiliser une forboucle comme une whileboucle car elle est plus courte. Dans la condition de boucle, nous vérifions la date actuelle ( dateune forme abrégée de Get-Date), ForEach-Objectalias le nom de piped to %, à l'aide du formulaire permettant d'appeler une méthode par un nom générique; dans ce cas, la méthode est AddDays()sur l' DateTimeobjet et la valeur que nous lui donnons est $i.

Ceci est redirigé sur ForEach-Objectpour invoquer la ToString()méthode, avec une chaîne de formatage Md(mois, puis jour, chiffres minimaux car nous ne nous soucions pas de ce qui va suivre). Cette chaîne est ensuite testée pour voir si elle n’est pas égale -neau nombre 1225qui sera converti en une chaîne pour la comparaison, ce qui me sauvera les guillemets.

C'est pourquoi, peu importe que les mois et les jours soient à un chiffre, cela ne sera jamais ambigu, car il n'y a pas d'autre jour de l'année qui serait contraignant 1225.

La boucle continue jusqu'à ce que la chaîne soit 1225 . Au début du programme, $isera égal à zéro, ce qui permettra de comparer la date d'aujourd'hui et la boucle ne s'exécutera jamais, mais pour tout autre jour $i, il sera incrémenté dans le corps de la boucle, de sorte que nous compterons le nombre de jours jusqu'à ce que le prochain Noël, en tenant compte automatiquement des années bissextiles et si Noël est passé ou non cette année.

Après la boucle, nous sortons simplement la chaîne Christmasconcaténée avec le résultat de la multiplication de la chaîne evemultipliée par la valeur de $i(ce qui, le jour de Noël, aura pour 0résultat aucun eves).

briantiste
la source
Apparemment, l' ;après {$i++}est redondant? (aussi wow vous avez encore repris l'avantage sur bash)
Kritixi Lithos
@Cowsquack nice! comment n'ai-je pas remarqué cela?!
Briantist
7

C # (compilateur interactif Visual C #) , 89 octets

Write("Christmas");for(var t=DateTime.Now;$"{t:Md}"!="1225";t=t.AddDays(1))Write(" Eve");

Essayez-le en ligne!

-3 octets grâce à @JeppeStigNielsen!

Ma stratégie est assez simple:

  1. Initialiser une variable de boucle tà la date actuelle
  2. Imprimer Evesi ce tn'est pas Noël
  3. Ajouter un jour tet répéter

J'ai essayé des choses plus sophistiquées, mais cette manière a exigé le moins d'octets.

Dana
la source
... devez-vous vous attribuer t dans l'incrémenteur? Je n'ai pas la documentation devant moi, mais sinon, vous pourriez économiser deux octets de plus.
Stackstuck
1
oh, c'est une structure. Bien sûr que ça l'est. Ça ne fait rien.
Stackstuck
1
Vous pouvez remplacer t.Month<12|t.Day!=25par le plus court $"{t:Md}"!="1225". Il utilise une chaîne interpolée et une chaîne de mise en forme DateTime personnalisée.
Jeppe Stig Nielsen
6

T-SQL, 92 88 octets

PRINT'Christmas'+REPLICATE(' Eve',DATEDIFF(D,GETDATE(),STR(YEAR(GETDATE()+6))+'-12-25'))

Edit: 4 octets enregistrés grâce à @BradC.

Neil
la source
Bon travail. Économisez 2 avec PRINT'Christmas'+...et 2 autres en utilisant DATEDIFF(D,au lieu deDATEDIFF(DAY,
BradC
@BradC Nice, merci!
Neil
5

APL (Dyalog Unicode) , SBCS de 76 63 octets

Programme complet. Suppose ⎕IO←0(indexation zéro).

⎕CY'dfns'
'Christmas',' Eve'⍴⍨4×12 25⍳⍨⍉2↑1↓⍉date(⍳366)+days⎕TS

Essayez-le en ligne!

⎕CY'dfns'C o p y dans la bibliothèque dfns

⎕TS courant t emps de la tassage [année, mois, jour, heure, minutes, secondes, ms]
days[c]  trouver le nombre de jours [n] depuis 31/12/1899 00: 00: 00.000
(⍳366) ajouter les premiers 366 entiers (0 … 365) pour que
date[c]  trouve les dates [n] qui correspondent à ces nombres (tableau 366 × 7; une colonne par unité)
 transposée (tableau 7 × 366; une ligne par unité)
1↓ supprimer une ligne (années)
2↑ prendre les deux premières lignes (mois et jours)
12 25⍳⍨ trouver l'index du premier Noël
 multiplier par quatre l'
' Eve'⍴⍨ utiliser pour remodeler la liste des caractères
'Christmas ', append à ce que

[c]  code de cette fonction
[n]  notes pour cette fonction

Adam
la source
5

Python 2 , 111 103 octets

from datetime import*
d=date.today()
print"Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days

Essayez-le en ligne!

Mise à jour inspirée par la réponse de Richard Crossley .

Explication:

from datetime import*
# get today as a date, so we don't have to worry about rounding errors due to time
d=date.today()
                              # get the year of the Christmas to compare to
                              # if the current date is after this year's Christmas, the 6 day offset will give the next year
                              # otherwise, returns this year
                              (d+timedelta(6)).year
                         # next Christmas minus the current date
                         date(.....................,12,25)-d
# Christmas, plus (number of days until next Christmas) " Eve"s
print"Christmas"+" Eve"*(...................................).days
Triggernométrie
la source
4

Ruby , 80 octets

require'date'
t=Date.today
puts'Christmas'+' Eve'*(Date.new((t+6).year,12,25)-t)

Essayez-le en ligne!

Merci à tsh pour son idée

iBug
la source
77 octets (c.-à-d., Enregistrez 3 octets) en remplaçant putspar p: lien Try It Online
Spencer D
4

JavaScript, 135 131 121 92 88 octets

Ma première solution (naïve) ( 135b ):

t=new Date();n=new Date();n.setMonth(11);n.setDate(25);'Christmas'+' Eve'.repeat((n>=t?n-t:(n.setFullYear(n.getFullYear()+1)-t))/864e5)

Il fixe 2 dates: maintenant et Noël de cette année. Si ce dernier n'est pas encore passé, il les diffère, s'il est passé, diffs au Noël de l'année prochaine. Utilise soit diffs pour le nombre de répétitions.

(Essayer de) sortir des sentiers battus ( 131b ):

i=0;f=_=>{t=new Date();if(t.getMonth()!=11||t.getDate()!=25){i++;setTimeout(f,864e5)}else{alert('Christmas'+' Eve'.repeat(i))}};f()

Challange spécifie QUELLE sortie est requise lors de l'exécution du programme un jour donné, mais ne spécifie pas QUAND le renvoyer ...

Cela va juste "dormir" pendant un jour, incrémenter un compteur de 1, et répéter jusqu'à ce que ce soit Noël pour donner la sortie.

Étant donné que JavaScript ne garantit pas le temps de "sommeil", le résultat réel peut être erroné.

Il est également moche d’utiliser la alertfonction, ce qui signifie que nous n’avons pas réellement affaire à du JavaScript pur, mais également aux API du navigateur (nous pouvons utiliser console.logau prix de 6 octets supplémentaires).

Une meilleure approche ( 121b ):

t=new Date();i=0;while(t.getMonth()!=11||t.getDate()!=25){t=new Date(t.valueOf()+864e5);i++};'Christmas'+' Eve'.repeat(i)

A partir d'aujourd'hui, incrémentez la date d'un jour jusqu'à Noël, puis utilisez le compteur de cette boucle pour connaître le nombre de répétitions requises.

Améliorer (y compris passer au minifier et utiliser l'astuce de 12Me21 pour gagner 5 b. De plus) ( 92b ):

for(s='Christmas',t=new Date;t.getMonth()/t.getDate()-.44;)t=new Date(t*1+864e5),s+=' Eve';s

Touches finales ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • REPL est supposé pour tout ce qui précède.
  • Voir la soumission de Vadim - bien meilleure que la mienne!
Targumon
la source
1
Je pense que vous pouvez utiliser t.getMonth()/t.getDate-.48pour vérifier si la date n'est pas le 25 décembre
12Me21
1
Bienvenue sur le site! Vous pouvez utiliser un retrait de 4 espaces pour améliorer l'apparence de vos blocs de code.
Wheat Wizard
1
Bienvenue chez PPCG!
Shaggy
1
98 , printest nécessaire car il s’agit d’un programme et non d’une fonction, sauf si 1. vous le transformez en lambda ou 2. vous indiquez que vous utilisez un REPL
ASCII uniquement
1
t=new Date(+t+864e5)est 1 octet plus court.
Andrew Svietlichnyy
3

VBA (Excel), 108 octets

Copier dans un module vierge. Imprime dans la fenêtre Immédiat:

Sub X:s="Christmas":d=Now:For t=1 To (DateSerial(Year(d+6),12,25)-d):s=s &" Eve":Next:Debug.Print s:End Sub

Remarque: l' utilisation :de sauts de ligne au lieu de deux sauts de ligne économise deux octets par ligne.

Notez que l'éditeur VBA insérera des espaces supplémentaires entre les mots clés, les opérateurs, etc ... et les parenthèses après la définition de Sub, mais si vous copiez et collez ce code, cela fonctionnera (je ne pouvais pas supprimer cet espace avant le &).

Pas mal pour VBA (pour une fois).

Barranka
la source
1
* Christmas: |
ASCII seulement
@ ASCII-only: suppression de l'espace avant le &jette une erreur
Barranka
-1 octets. Merci à @ ASCII-only pour avoir attrapé la faute de frappe
Barranka
1
Vous pouvez réduire ce nombre à 71 caractères en le convertissant en une fonction de fenêtre immédiate et en supprimant la variable temporaire pour now. Lorsque vous faites cela, cela devrait ressembler à quelque chose comme?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott
3

Date Bash + GNU, 72 73 octets

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • un octet enregistré en remplacement !=de-
  • une autre suppression d'espace supplémentaire
  • correction de -3 octets d=0, car date -ddaydate + 1 et ne fonctionnant pas le 25/12

Essayez-le en ligne

Nahuel Fouilleul
la source
Hmmm, pourquoi ne =~pas travailler dans la boucle for conditionnelle?
Kritixi Lithos
parce que la condition de boucle pour est une expression arithmétique, les mots sont contraints de nombre entier nombre aussi à partir de 0 sont supposés en octal, qui est la raison pour laquelle 1 est préfixé
Nahuel Fouilleul
3

Bash , 68 65 61 octets

Golfé 4 octets grâce à Nahuel Fouilleul en utilisant la ``substitution de commande et evalà la place de sed eetxargs

echo Christmas `eval date\ -d{0..366}day\;|sed /c.25/Q\;cEve`

Essayez-le en ligne!

À l'intérieur de la `` substitution de commande , nous avons

eval lance la chaîne suivante en tant que commande shell

  • date\ -d{0..366}day\;sous l' extension accolade de {0..366}, cela donne la chaîne date -d0day; date -d1day; date -d2day; ... date -d366day;, chaque commande de cette chaîne calculant la date entre 0 et 366 jours, à partir de la date du jour, donnant lieu à la sortie du format Wed Dec 26 18:22:33 UTC 2018, chacune dans sa propre ligne

|sed sur quoi, appelez les commandes sed suivantes

  • /c.25/Qsi l'expression régulière /c.25/est appariée, Quit sans impression

  • \;cEve sinon changez la ligne en Eve

Tous les nombres requis Evesont produits chacun sur sa propre ligne. Cette sortie est capturée dans ``et est sujette à la scission de mots lorsque les mots sont divisés sur les nouvelles lignes. Chaque mot est alimenté comme argument echo.

echo Christmas ...

Chaque argument de echoest imprimé en étant séparé par des espaces, ce qui donne le résultat souhaité.

Kritixi Lithos
la source
Il n'y a rien de vraiment bashspécifique à cette solution. Cela nécessite GNU date, sedet seqbien.
Kusalananda
-4 octets
Nahuel Fouilleul
@NahuelFouilleul Merci, bonne astuce pour utiliser la substitution de commande backtick afin d'éviter xargs et utiliser eval pour passer
in
2

C (gcc) , 157 octets

Je pensais pouvoir éviter d’inclure time.hmais cela ne donnait que des erreurs de segment.

#include <time.h>
*t,u;f(){time(&u);t=localtime(&u);t[5]+=t[4]>10&t[3]>25;t[4]=11;t[3]=25;u-=mktime(t);printf("Christmas");for(u/=86400;u++;printf(" Eve"));}

Essayez-le en ligne!

ErikF
la source
OMI, vous devriez laisser de côté #include <stdlib.h>, pas comme si ça ne faisait rien du tout ici
ASCII seulement
Suggère *t;f(u)au lieu de *t,u;f()et #import<time.h>au lieu de #include <time.h>et 5[t=localtime(&u)]au lieu det=localtime(&u);t[5]
ceilingcat
2

Groovy , 66 octets

d=[]as Date
print'Christmas'+' Eve'*(new Date((d+6).year,11,25)-d)

Essayez-le en ligne!

Gracieuseté de @ ASCII-only

bdkosher
la source
Vous devez l'imprimer puisqu'il s'agit d'un programme complet et non d'une fonction
ASCII uniquement
> Chistmas: /
ASCII uniquement
corrigé, 149
ASCII uniquement
123
ASCII uniquement
prendre votre premier et utiliser Groovy 2.5 le réduit à 115 .
bdkosher
2

Python 3, 106 octets

from datetime import*
d=date.today()
print("Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days)
Albert Capp
la source
2

Scala , 116 113 octets

var d=new java.util.Date
print("Christmas")
while(!(""+d).contains("c 25")){print(" Eve");d.setDate(d.getDate+1)}

Essayez-le en ligne!

c 25est l'abréviation de Dec 25.

Kjetil S.
la source
1
Je pense que vous pouvez utiliser contains("c 25")au lieu dematches(".*c 25.*")
12Me21
Merci, trois octets de moins! 😁
Kjetil S.
wow, bien fait, la date était agréable
V. Courtois
2

JavaScript, 86 77 octets

En utilisant REPL ce serait

for(c='Christmas',d=new Date;!/c 25/.test(d);d=new Date(+d+864e5))c+=' Eve';c

Félicitations à ASCII seulement pour -9 octets

Vadim
la source
77
ASCII seulement
Bravo! Tu as fait beaucoup mieux que moi. Puis-je proposer de raser un octet supplémentaire? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c ou cette variante: les for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s deux sont de 76 octets.
Targumon
2

Lua , 137 118 octets.

118 octets

t,d,month,day=os.time,os.date,1,-6year=d"%Y"+(d"%D">"12/25"and 2or 1)print("Christmas",d" Eve":rep(d("%j",t(_G)-t())))

137 octets (précédent)

t,d=os.time,os.date a=d"*t"a.year,a.month,a.day=a.year+(d"%m%d">"1225"and 1 or 0),12,25 print("Christmas",("Eve "):rep((t(a)-t())/86400))

Il convient de noter que cela ne fonctionne pas dans LuaJIT (erreur de syntaxe)

Tae Hanazono
la source
Bienvenue chez PPCG! Nice premier post!
Rɪᴋᴇʀ
1

MySQL, 102 octets

à peu près la même chose que la réponse T-SQL de Neil . Il ne semble pas y avoir de moyen plus court en SQL.

select concat("Christmas",repeat(" Eve",datediff(concat(year(now()+interval 6 day),"-12-25"),now())));

Essayez-le en ligne .

Titus
la source
1

MATLAB, 91 octets

n=datetime
x=datetime(year(n+6),12,25)
s='Christmas'
while days(x-n)>=1 n=n+1 s=[s,' Eve'] end

MATLAB Non-Looper, 100 octets

x=datenum(datetime(floor((now+5)/365.2425),12,25))
d=x-now
['Christmas' repmat(' Eve',1,min(d(d>=0)))]
Anthony
la source
1

Scala , 123 octets

Merci au travail en ASCII uniquement.

print("Christmas")
var d=new java.util.Date
while(d.getMonth()<11||d.getDate()!=25){print(" Eve");d.setDate(d.getDate()+1)}

Essayez-le en ligne!

Scala + Joda-Time , 140 octets

import org.joda.time._
var s="Christmas"
var d=DateTime.now
while(d!=d.withDate(d.year().get(),12,25)){d=d.plusDays(1);s+=" Eve"};println(s)

Ne s'exécute pas dans TIO car il nécessite la bibliothèque Joda-Time.

V. Courtois
la source
pas de joda, 154 . ne peux malheureusement pas aller java.util.Datetravailler ici: /
ASCII-only
148
ASCII uniquement
Ah @ ASCII uniquement, je n'ai pas compté les object Main extends App{}caractères dans mon décompte (parce que je ne l'ai pas non plus dans mes autres réponses Scala). Si on enlève ça, vous me battez ^^
V. Courtois Le
L' withDate()appel coûte si cher ...
V. Courtois Le
1. rappelez-vous que vous devez spécifier la langue "Scala + Joda-Time" puisque vous utilisez une bibliothèque externe et 2. ne pas utiliser mes modifications? il est plus court et n'a pas besoin de bibliothèque: P
ASCII seulement
1

05AB1E , 93 89 octets

žežfžg)V'ŒÎ[Y¨JŽ9ÚQ#Y`2ô0Kθ4ÖUD2Qi\28X+ë31s<7%É-}‹iY¬>0ëYT`ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVð'»ˆ}J™

Essayez-le en ligne ou essayez-le en ligne avec une date «aujourd'hui» émulée par vous-même .

Explication:

05AB1E ne contient pas d'intégré pour les dates, à l'exception de la réception de l'année / mois / jour / heures / minutes / secondes / microsecondes en cours. La plupart des octets sont donc utilisés pour les calculs manuels.

žežfžg)V   # Get the current date and save it in variable `Y`
'ŒÎ       '# Push compressed string "christmas"
[          # Start an infinite loop
 Y¨JŽ9ÚQ   #  If the current date is December 25th:
        #  #   Stop the infinite loop
 Y`2ô0Kθ4ÖUD2Qi\28X31s<7%É-}‹iY¬>0ëYTDÅsD12i>1ë\1Dǝ¤>2}}ǝV
           #  Go to the next day, and set `Y` to it
 ð         #  Push a space " "
 '»ˆ      '#  Push compressed string "eve"
}          # After the infinite loop:
 J         # Join everything on the stack together
          # And make every word title-case (and output the result implicitly)

Voir ma réponse pour comprendre comment nous allons au lendemain. (PS: 1¾ǝa été remplacé par T`ǝ, puisque nous utilisons lecounter_variable endroit.)

Voir cette astuce de mes 05AB1E (sections Comment utiliser le dictionnaire? Et Comment compresser les grands entiers? ) Pour comprendre pourquoi '»ˆest "eve"; 'ŒÎest "christmas"; et Ž9Úest 1225.

Kevin Cruijssen
la source
Le golf intelligent!
MilkyWay90
0

C # (compilateur interactif Visual C #) , 141 octets

var g=DateTime.Now;Write("Christmas"+string.Concat(Enumerable.Repeat(" Eve",(new DateTime(g.Year+(g.Day>25&g.Month>11?1:0),12,25)-g).Days)));

Essayez-le en ligne!

Incarnation de l'ignorance
la source
1
Je ne pense pas que ça marche pour le 30 novembre ...
Neil
Corrigé maintenant, j'ai oublié d'ajouter un chèque à si c'était en décembre ou non
Incarnation de l'Ignorance
Êtes-vous sûr de mois> 25?
Neil
Corrigé maintenant ...
Incarnation de l'Ignorance
Le 1: 0 est-il nécessaire? ne retourne pas un entier?
12Me21
0

rouge , 89 86 84 78 76 octets

-10 octets grâce à ASCII uniquement!

does[a: now prin"Christmas"while[a/3 * 31 + a/4 <> 397][prin" Eve"a: a + 1]]

Essayez-le en ligne!

Galen Ivanov
la source
84
ASCII uniquement
@ ASCII seulement Hmm, bien sûr! Je vous remercie!
Galen Ivanov
78
ASCII seulement
76
ASCII uniquement
@ ASCII-only Votre version à 76 octets ne donne pas un résultat correct lorsqu'elle est exécutée à Noël: Date comme argument, je me sens stupide de ne pas utiliser uniquement nowet non now/date. Merci pour vos améliorations!
Galen Ivanov