55
\$\begingroup\$

The day this post was published was Christmas Eve. Tomorrow will be Christmas. Yesterday was Christmas Eve Eve. In two days it will be

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

.

Your job is to take the date the program is run and encode it in Christmas Eve format.

  • If your program is run on Christmas, it should output the string "Christmas".
  • If your program is not run on Christmas, it should output the string "Christmas", followed by the string " Eve" repeated n times, where n is the number of days until Christmas.
    • Note that this must be based on the next Christmas. For example, if the day is April 26, 2019, you must do your calculation based on December 25, 2019, not any other Christmas.
    • Remember to count leap days.
  • Christmas is December 25th of every year.

This is , so the shortest code wins! Note though that the goal is not to find the shortest program in any language, but to find the shortest program in every particular language. For example, if you find the shortest C++ program, then it wins this contest for C++, even if someone finds a shorter program in Python.

\$\endgroup\$
20
  • 7
    \$\begingroup\$ Somehow I knew that this was going to be a PPCG challenge the moment I saw the cartoon - +1 from me \$\endgroup\$
    – Kateba
    Dec 24, 2018 at 23:36
  • 26
    \$\begingroup\$ A xkcd cartoon that was published today. imgs.xkcd.com/comics/christmas_eve_eve.png \$\endgroup\$
    – Kateba
    Dec 24, 2018 at 23:38
  • 7
    \$\begingroup\$ @BlackOwlKai LMBO I didn't even see that comic until your comment. I had already planned to post this, and was just waiting for Christmas Eve. Great minds think alike, I guess? \$\endgroup\$ Dec 24, 2018 at 23:41
  • 1
    \$\begingroup\$ Can the date be a parameter? \$\endgroup\$ Dec 26, 2018 at 11:23
  • 1
    \$\begingroup\$ @OlivierGrégoire uhm, I'll permit it iff the language does not have the ability to get the current date in another way. \$\endgroup\$ Dec 26, 2018 at 14:53

35 Answers 35

58
\$\begingroup\$

SmileBASIC, 73 71 67 bytes

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

The program prints "Christmas", then prints " Eve" every time a day passes, until it is December 25th. (12/25 = 0.48)
May take up to a year to run.

\$\endgroup\$
8
  • 8
    \$\begingroup\$ pure genius ... \$\endgroup\$
    – FlipTack
    Dec 25, 2018 at 11:43
  • 8
    \$\begingroup\$ This made me Smile... \$\endgroup\$
    – Neil
    Dec 25, 2018 at 14:10
  • 3
    \$\begingroup\$ Nice! One of my JavaScript solutions takes a similar approach. However, in JavaScript the wait time is just a best effort. How is SmileBASIC faring in this regard? \$\endgroup\$
    – targumon
    Dec 26, 2018 at 0:16
  • 4
    \$\begingroup\$ @12Me21 that would obviously fail due to leap seconds, this version looks much better. \$\endgroup\$
    – Riker
    Dec 26, 2018 at 16:08
  • 6
    \$\begingroup\$ +1 for thinking outside the box and making me laugh. \$\endgroup\$
    – Tom
    Dec 27, 2018 at 10:29
24
\$\begingroup\$

Excel formula, 59 bytes

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
\$\endgroup\$
13
  • 4
    \$\begingroup\$ I think YEAR(TODAY()+6) always returns the correct year, thus avoiding the condition. \$\endgroup\$
    – Neil
    Dec 25, 2018 at 19:32
  • 3
    \$\begingroup\$ I think YEAR(NOW()+6) works as well with 2 less bytes. \$\endgroup\$ Dec 26, 2018 at 20:01
  • 2
    \$\begingroup\$ I think ="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,26)-NOW()) is even shorter and I believe it should work. \$\endgroup\$
    – Jeroen
    Dec 27, 2018 at 14:02
  • 1
    \$\begingroup\$ NOW() includes the time, so it won't be an integer and I'm not sure REPT would allow that. \$\endgroup\$
    – 12Me21
    Dec 28, 2018 at 4:57
  • 2
    \$\begingroup\$ but this does not give "Christmas" on Christmas day. Check ="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25)) \$\endgroup\$
    – Anthony
    Dec 29, 2018 at 15:18
12
\$\begingroup\$

Perl 6, 61 47 bytes

say 'Christmas'~' Eve'x(Date.today...^{.month==12&&.day==25})

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

Try it online!

-14 bytes (!) thanks to Jo King

Date.today ...^ /12\-25/ is the sequence of dates starting today and ending the day before Christmas. (The regular expression /12\-25/ is matched against the string representation of the dates.) The string " Eve" is replicated a number of times equal to the length of that sequence, and is output after the string "Christmas".

\$\endgroup\$
4
  • \$\begingroup\$ Could you do "month>11" to save a byte? \$\endgroup\$ Dec 26, 2018 at 19:35
  • 2
    \$\begingroup\$ Would /12.25/ work? \$\endgroup\$
    – user41805
    Dec 27, 2018 at 7:49
  • 2
    \$\begingroup\$ @Cowsquack no, because then it might match the year in dates like 12025-12-24 \$\endgroup\$
    – Jo King
    Dec 27, 2018 at 12:05
  • \$\begingroup\$ I think it's safe to assume that will never happen \$\endgroup\$
    – 12Me21
    Dec 28, 2018 at 6:24
8
\$\begingroup\$

R, 112 106 72 bytes

Via @digEmAll and @J.Doe

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

Try it online!

My original answer was prior to the clarification that the code was to take the date on which the code is run as input. It could be modified as above to save many bytes but I won't bother.

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

Try it online!

Explanation: everyone's at church so I have time to do this. Extract the year, coerce to integer. Make vector of that year's Xmas and the next year's Xmas and subtract the input date to get a vector of two differences between the input date and those two Xmases.

Pick the non-negative one and cat "Christmas" with that many "Eves".

\$\endgroup\$
4
  • \$\begingroup\$ You only use y once so you can just use it directly for 108 bytes. \$\endgroup\$
    – Giuseppe
    Dec 25, 2018 at 2:02
  • \$\begingroup\$ Also would z[z>=0][1] work instead of min? \$\endgroup\$
    – Giuseppe
    Dec 25, 2018 at 2:03
  • \$\begingroup\$ 73 bytes. According to the last comment, the program must output the text based on the day it runs. Merry christmas BTW ! :D \$\endgroup\$
    – digEmAll
    Dec 25, 2018 at 10:16
  • 1
    \$\begingroup\$ Tweaked yours for 72 bytes, @digEmAll. Merry Christmas! \$\endgroup\$
    – J.Doe
    Dec 25, 2018 at 11:34
8
\$\begingroup\$

Windows PowerShell, 67 64 63 bytes

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

Try it online!

Managed to shave off 3 bytes 4 bytes (thanks Cows quack) by using the -format operator instead of .ToString(), and then subtracting the date string from the numerical value 1225 instead of doing a comparison with -ne. The resulting integer will be interpreted as a boolean for the conditional where 0 (which will happen on Christmas) is interpreted as False (don't enter the loop), and any other value is interpreted as True (enter the loop).

Since the integer is on the left now, the date string will be converted to the integer and math will be done, as opposed to the previous version where the 1225 integer was converted to string for the comparison.

Original Version


Windows PowerShell, 67 bytes

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

Try it online!

Using a for loop as a while loop basically, because it's shorter. In the loop condition we check the current date (date, a shortened form of Get-Date), piped to ForEach-Object's alias %, using the form that can invoke a method by wildcarded name; in this case the method is AddDays() on the DateTime object, and the value we give it is $i.

This gets piped to ForEach-Object again to invoke the ToString() method, with format string Md (month, then day, minimal digits since we don't care for what comes next). This string is then tested to see if it's not equal -ne to the number 1225, which will be converted to a string for the comparison, saving me the quotes.

This is why it doesn't matter that the months and days are single digits, it will never be ambiguous because there's no other day of the year that would stringify to 1225.

The loop continues until the string is 1225. At the beginning of the program, $i will be zero so it will be comparing today's date, and the loop will never execute, but for any other day $i gets incremented in the loop body, so that we will have a count of how many days until the next Christmas, automatically accounting for leap years and whether or not Christmas passed this year.

After the loop we just output the string Christmas concatenated with the result of multiplying the string eve times the value of $i (which, on Christmas day, will be 0, resulting in no eves).

\$\endgroup\$
2
  • \$\begingroup\$ Apparently the ; after {$i++} is redundant? (also wow you took the lead over bash again) \$\endgroup\$
    – user41805
    Dec 27, 2018 at 18:45
  • \$\begingroup\$ @Cowsquack nice! how did I not notice that?! \$\endgroup\$
    – briantist
    Dec 27, 2018 at 18:58
7
\$\begingroup\$

C# (Visual C# Interactive Compiler), 89 bytes

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

Try it online!

-3 bytes thanks to @JeppeStigNielsen!

My strategy is pretty straightforward:

  1. Initialize a loop variable t to the current date
  2. Print Eve if t is not Christmas
  3. Add a day to t and repeat

I tried some fancier things, but this way required the fewest bytes.

\$\endgroup\$
3
  • \$\begingroup\$ ...do you need to assign t to itself in the incrementor? I don't have the docs in front of me, but if not, you could save two bytes more. \$\endgroup\$
    – Stackstuck
    Dec 28, 2018 at 21:38
  • 1
    \$\begingroup\$ oh, it's a struct. Of course it is. Nevermind. \$\endgroup\$
    – Stackstuck
    Dec 28, 2018 at 21:39
  • 1
    \$\begingroup\$ You can substitute t.Month<12|t.Day!=25 with the shorter $"{t:Md}"!="1225". It uses an interpolated string and a custom DateTime formatting string. \$\endgroup\$ Dec 28, 2018 at 23:34
6
\$\begingroup\$

APL (Dyalog Unicode), 76 63 bytesSBCS

Full program. Assumes ⎕IO←0 (zero-indexing).

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

Try it online!

⎕CY'dfns'copy in the dfns library

⎕TS current time stamp as [year,month,day,hour,min,sec,ms]
days[c] find the number of days[n] since 1899-12-31 00:00:00.000
(⍳366) add the first 366 integers (0…365) to that
date[c] find the dates[n] that correspond to those numbers (366×7 table; one column per unit)
 transpose (7×366 table; one row per unit)
1↓ drop one row (the years)
2↑ take the first two rows (months and days)
12 25⍳⍨ find the index of the first Christmas
 multiply that by four
' Eve'⍴⍨ use that to reshape the character list
'Christmas ', append that to this

[c] code of that function
[n] notes for that function

\$\endgroup\$
6
\$\begingroup\$

T-SQL, 92 88 bytes

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

Edit: Saved 4 bytes thanks to @BradC.

\$\endgroup\$
2
  • \$\begingroup\$ Nice work. Save 2 with PRINT'Christmas'+... and 2 more by using DATEDIFF(D, instead of DATEDIFF(DAY, \$\endgroup\$
    – BradC
    Jan 7, 2019 at 16:19
  • \$\begingroup\$ @BradC Nice, thanks! \$\endgroup\$
    – Neil
    Jan 7, 2019 at 16:54
5
\$\begingroup\$

Python 2, 111 103 bytes

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

Try it online!

Update inspired by Richard Crossley's answer.

Explanation:

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
\$\endgroup\$
4
\$\begingroup\$

Ruby, 80 bytes

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

Try it online!

Thanks to tsh for his idea

\$\endgroup\$
1
  • \$\begingroup\$ 77 bytes (i.e., save 3 bytes) by replacing puts with p: Try It Online link \$\endgroup\$
    – Spencer D
    Dec 30, 2018 at 6:57
4
\$\begingroup\$

PHP, 61 bytes

Christmas<?for($t=time();date(md,$t+=86400)-1226;)echo" Eve";

Run with -n or try it online.

\$\endgroup\$
4
\$\begingroup\$

JavaScript, 135 131 121 92 88 bytes

My first (naïve) solution (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)

It sets 2 dates: now and Xmas of this year. If the latter hasn't passed yet, it just diffs them, if it has passed, diffs to next year's Xmas. Uses either diffs for the number of repeats.

(Trying to) Think Outside the Box (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()

The challange specifies WHICH output is required when running the program on a given day, but doesn't specify WHEN to return it...

This will just 'sleep' for a day, increment a counter by 1, and repeat till it's Xmas in order to give the output.

Since JavaScript doesn't guarantee the 'sleep' time, the actual result might be off.

It is also ugly for using the alert function, which means wer'e actually not dealing with pure JavaScript, but with browser APIs as well (we can use console.log at the cost of 6 extra bytes).

A better approach (121b):

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

Starting from today, increment the date by a day until it's Xmas, then use that loop's counter for the number of repeats required.

Improving (including going through a minifier and using 12Me21's trick to shave extra 5b) (92b):

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

Final touches (88b):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • For all of the above, REPL is assumed.
  • See Vadim's submission - much better than mine!
\$\endgroup\$
11
  • 1
    \$\begingroup\$ I think you can use t.getMonth()/t.getDate-.48 to check if date is not december 25th \$\endgroup\$
    – 12Me21
    Dec 26, 2018 at 0:50
  • 1
    \$\begingroup\$ Welcome to the site! You can use a 4 space indent to make your code blocks look better. \$\endgroup\$
    – Wheat Wizard
    Dec 26, 2018 at 3:51
  • 1
    \$\begingroup\$ Welcome to PPCG! \$\endgroup\$
    – Shaggy
    Dec 26, 2018 at 11:47
  • 1
    \$\begingroup\$ 98, print is needed since this is a program not a function, unless 1. you turn it into a lambda or 2. you state that you're using a REPL \$\endgroup\$
    – ASCII-only
    Dec 28, 2018 at 1:28
  • 1
    \$\begingroup\$ t=new Date(+t+864e5) is 1 byte shorter. \$\endgroup\$ Dec 29, 2018 at 19:16
4
\$\begingroup\$

Bash, 68 65 61 bytes

Golfed 4 bytes thanks to Nahuel Fouilleul by using `` command substitution and eval in place of sed e and xargs

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

Try it online!

Inside the `` command substitution, we have

eval run the following string as shell commands

  • date\ -d{0..366}day\; under brace expansion of {0..366}, this results in the string date -d0day; date -d1day; date -d2day; ... date -d366day;, each command in this string computing the date between 0 and 366 days from present resulting in output of the format Wed Dec 26 18:22:33 UTC 2018, with each in its own line

|sed upon which, call the following sed commands

  • /c.25/Q if the regex /c.25/ is matched, Quit without printing

  • \;cEve otherwise change the line to Eve

All the required number of Eves are produced each on its own line. This output is captured in ``, and is subject to word splitting where words are split on newlines. Each word is fed as an argument to echo.

echo Christmas ...

Each argument to echo is printed by being separated by spaces, resulting in the desired output.

\$\endgroup\$
3
  • 1
    \$\begingroup\$ There's nothing really bash-specific about this solution. It requires GNU date, sed and seq though. \$\endgroup\$ Dec 27, 2018 at 21:00
  • \$\begingroup\$ -4 bytes \$\endgroup\$ Dec 28, 2018 at 9:12
  • \$\begingroup\$ @NahuelFouilleul Thanks, nice trick of using backtick command substitution to avoid xargs and using eval to skip out on seq \$\endgroup\$
    – user41805
    Jul 21, 2019 at 18:03
4
\$\begingroup\$

Bash +GNU date, 72, 73, 67 bytes

for((d=7;`date +%-j -d$d\day`-1;d++));{ x+=\ Eve;};echo Christmas$x
  • one byte saved replacing != with -
  • another removing extra space
  • fix -3 bytes d=0, because date -dday is date+1 and doesn't work on 25/12
  • 6 bytes saved thanks to Toby Speight using %-j format to avoid 0 padding (and octal conversion) and shorter than %d%m compared to 2512

Try it online

\$\endgroup\$
4
  • \$\begingroup\$ Hmmm, why does =~ not work in the for-loop conditional? \$\endgroup\$
    – user41805
    Dec 26, 2018 at 19:14
  • \$\begingroup\$ because the for loop condition is an arithmetic expression, words are coerced to integer also number starting with 0 are assumed in octal, that's why 1 is prepended \$\endgroup\$ Dec 27, 2018 at 8:04
  • \$\begingroup\$ Instead of prepending 1 in two places, we could use %-d format (saving 1 byte net). But we can save more by starting with d=7, and then comparing the Julian day with 1st of January: ((d=7;`date +%-j -d$d\day`-1;d++)) - 67 bytes. \$\endgroup\$ Nov 17, 2023 at 9:54
  • \$\begingroup\$ @TobySpeight interesting ideas, updated \$\endgroup\$ Nov 17, 2023 at 10:50
3
\$\begingroup\$

VBA (Excel), 108 bytes

Copy in a blank module. Prints to the Immediate window:

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

Note: Using : instead of line breaks saves two bytes per line.

Notice that the VBA editor will insert additional spaces between keywords, operators, etc... and parenthesis after the Sub definition, but if you copy and paste this code it will work (I couldn't get rid of that space before the &).

Not bad for VBA (for once).

\$\endgroup\$
4
  • 1
    \$\begingroup\$ *Christmas :| \$\endgroup\$
    – ASCII-only
    Dec 26, 2018 at 23:47
  • \$\begingroup\$ @ASCII-only: removing the space before the & throws an error \$\endgroup\$
    – Barranka
    Dec 26, 2018 at 23:49
  • \$\begingroup\$ -1 bytes. Thanks to @ASCII-only for catching the typo \$\endgroup\$
    – Barranka
    Dec 27, 2018 at 0:06
  • 1
    \$\begingroup\$ You can cut this down to 71 chars by converting it to an immediate window function and removing the temporary variable for now. When you do that, it should look something like ?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next \$\endgroup\$ Feb 13, 2019 at 21:54
3
\$\begingroup\$

Python 2, 128 bytes / Python 3, 130 bytes

of course, two less bytes with Python 2

from datetime import date as D
T=D.today()
Y=T.year
a=(D(Y,12,25)-T).days
print("Christmas"+" Eve"*[a,(D(Y+1,12,25)-T).days][a<0])
\$\endgroup\$
4
3
\$\begingroup\$

Python 3, 106 Bytes

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

C (gcc), 157 bytes

I thought that I would be able to avoid including time.h but that just gave segment faults.

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

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ IMO you should leave out the #include <stdlib.h>, not like it does anything at all here \$\endgroup\$
    – ASCII-only
    Dec 26, 2018 at 9:02
  • \$\begingroup\$ Suggest *t;f(u) instead of *t,u;f() and #import<time.h> instead of #include <time.h> and 5[t=localtime(&u)] instead of t=localtime(&u);t[5] \$\endgroup\$
    – ceilingcat
    Dec 28, 2018 at 20:40
2
\$\begingroup\$

Groovy, 66 bytes

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

Try it online!

Courtesy of @ASCII-only

\$\endgroup\$
12
  • \$\begingroup\$ You need to print it out since this is a full program not a function \$\endgroup\$
    – ASCII-only
    Dec 27, 2018 at 23:25
  • \$\begingroup\$ > Chistmas :/ \$\endgroup\$
    – ASCII-only
    Dec 27, 2018 at 23:32
  • \$\begingroup\$ fixed, 149 \$\endgroup\$
    – ASCII-only
    Dec 27, 2018 at 23:36
  • \$\begingroup\$ 123 \$\endgroup\$
    – ASCII-only
    Dec 27, 2018 at 23:55
  • \$\begingroup\$ taking your first one and using Groovy 2.5 slims it down to 115. \$\endgroup\$
    – bdkosher
    Dec 28, 2018 at 0:01
2
\$\begingroup\$

Scala, 116 113 bytes

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

Try it online!

Where c 25 is short for Dec 25.

\$\endgroup\$
3
  • 1
    \$\begingroup\$ I think you can use contains("c 25") instead of matches(".*c 25.*") \$\endgroup\$
    – 12Me21
    Dec 29, 2018 at 15:49
  • \$\begingroup\$ Thanks, three bytes less! 😁 \$\endgroup\$
    – Kjetil S
    Dec 29, 2018 at 15:55
  • \$\begingroup\$ wow, nicely done, toString of date was nice \$\endgroup\$ Jan 2, 2019 at 8:09
2
\$\begingroup\$

JavaScript, 86 77 bytes

Using REPL it would be

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

Kudos to ASCII-only for -9 bytes

\$\endgroup\$
2
  • \$\begingroup\$ 77 \$\endgroup\$
    – ASCII-only
    Dec 30, 2018 at 8:33
  • \$\begingroup\$ Bravo! You did much better than me. May I offer to shave an extra byte? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c or this variant: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s both are 76 bytes. \$\endgroup\$
    – targumon
    Dec 31, 2018 at 23:42
2
\$\begingroup\$

Lua, 137 118 bytes.

118 bytes

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 bytes (previous)

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

It's worth noting that it doesn't work in LuaJIT (syntax error)

\$\endgroup\$
1
  • \$\begingroup\$ Welcome to PPCG! Nice first post! \$\endgroup\$
    – Riker
    Dec 31, 2018 at 4:14
2
\$\begingroup\$

Julia 1.0, 91 bytes

using Dates
t=today()
print(:Christmas," Eve"^~-(tonext(==((12,26))∘monthday,t)-t).value)

Try it online!

  • -1 byte thanks to @MarcMush: Substitute 1>0 for true
  • -5 bytes thanks to @MarcMush: Substitute _.value for Dates.value(_)
  • -1 byte thanks to @amelies: print symbol :Christmas rather than string "Christmas"
  • -1 byte thanks to @MarcMush: compose functions with
  • -7 bytes thanks to @MarcMush: use Boxing Day as the end date and subtract one in order to eliminate the same=true parameter
\$\endgroup\$
5
  • 1
    \$\begingroup\$ -1 byte with 1>0 instead of true \$\endgroup\$
    – MarcMush
    Nov 17, 2022 at 11:30
  • 1
    \$\begingroup\$ And I believe you can access the date field directly, x.value maybe instead of Dates.value(x) \$\endgroup\$
    – MarcMush
    Nov 17, 2022 at 11:31
  • 1
    \$\begingroup\$ use :Christmas symbol instead of string, save one byte, i.e, print(:Christmas," Eve"^(t<etc...> \$\endgroup\$
    – amelies
    Nov 18, 2022 at 11:33
  • 1
    \$\begingroup\$ -1 byte: ==((12,25))∘monthday instead of x->... \$\endgroup\$
    – MarcMush
    Nov 16, 2023 at 22:59
  • 1
    \$\begingroup\$ remove same=true, go to the 26th and subtract one: " Eve"^~-(tonext(==((12,26))∘monthday,t)-t).value) \$\endgroup\$
    – MarcMush
    Nov 16, 2023 at 23:09
1
\$\begingroup\$

MySQL, 102 bytes

pretty much the same as Neil´s T-SQL answer. There seems to be no shorter way in SQL.

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

Try it online.

\$\endgroup\$
1
\$\begingroup\$

MATLAB, 91 bytes

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 bytes

x=datenum(datetime(floor((now+5)/365.2425),12,25))
d=x-now
['Christmas' repmat(' Eve',1,min(d(d>=0)))]
\$\endgroup\$
1
\$\begingroup\$

Scala, 123 bytes

Thanks to ASCII-only's work.

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

Try it online!

Scala + Joda-Time, 140 bytes

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)

Does not run in TIO since it requires Joda-Time library.

\$\endgroup\$
12
  • \$\begingroup\$ no joda, 154. sadly can't get java.util.Date to work here :/ \$\endgroup\$
    – ASCII-only
    Dec 28, 2018 at 0:12
  • \$\begingroup\$ 148 \$\endgroup\$
    – ASCII-only
    Dec 28, 2018 at 0:19
  • \$\begingroup\$ Ah @ASCII-only I did not count object Main extends App{} chars in my counting (cause I didn't in my other Scala answers either). If we take that out you beat me ^^ \$\endgroup\$ Dec 28, 2018 at 6:40
  • \$\begingroup\$ The withDate() call is so expensive... \$\endgroup\$ Dec 28, 2018 at 6:41
  • \$\begingroup\$ 1. remember you need to specify language as "Scala + Joda-Time" since you use an external library and 2. not going to use my changes? it's shorter plus doesn't need a library :P \$\endgroup\$
    – ASCII-only
    Dec 31, 2018 at 6:17
1
\$\begingroup\$

q, 53 bytes

"Christmas",(4*(not 12 25~`mm`dd$.z.d+)(1+)/0)#" Eve"

k, 50 bytes

"Christmas",(4*(~12 25~`mm`dd$.z.d+)(1+)/0)#" Eve"

Increment counter while the date is not Dec 25th, then take that number of copies of " Eve" and append to "Christmas".

\$\endgroup\$
1
\$\begingroup\$

05AB1E, 93 89 87 81 bytes

'ŒÎžfže«Ž9Ú.S©DΘžg+т‰0Kθ4ÖUi390že-X+ë®_i0ë•ΘÏF•º11£®ª₂+ā2QX*+13žf-.£Ože-]Fð'»ˆ}J™

Try it online or Try it online with an emulated self-specified date of 'today'.

Old 93 89 87 bytes approach that loops over the days one by one:

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

Try it online or Try it online with an emulated self-specified date of 'today'.

Explanation:

05AB1E doesn't have any builtins for dates, except for receiving the current year/month/day/hours/minutes/seconds/microseconds, so most bytes are used for manual calculations.

'ŒÎ           '# Push dictionary string "christmas"
žfže«          # Append the current month and current day together
        .S     # Compare it with
     Ž9Ú       # Compressed integer 1225
               # (1 if >1225; 0 if ==1225; -1 if <1225)
          ©    # Store this comparison in variable `®` (without popping)
D              # Duplicate it
 Θ             # Check if it's equal to 1 (1 if 1; 0 if 0 or -1)
  žf+          # Add the current year to it
     т‰0Kθ4Ö   # Check if this is a leap year:
     т‰        #  Divmod it by 100
       0K      #  Remove the 0s
         θ     #  Only leave the last item
          4Ö   #  Check if it's divisible by 4
            U  # Pop and store this is_leap_year in variable `X`
i              # If the comparison is 1:
 390že-        #  Push 390 minus the current day
               #  (390 is 31 for days in December and 259 for days of Christmas Day)
 X+            #  Add the is_leap_year check from variable `X`
ë®_i           # Else if the comparison is 0:
    0          #  Push 0
ë              # Else (the comparison is -1):
 •ΘÏF•         #  Push compressed integer 5254545
      º        #  Mirror it to 52545455454525
       11£     #  Only leave the first 11: 52545455454
          ®ª   #  Convert it to a list of digits, and append the -1:
               #   [5,2,5,4,5,4,5,5,4,5,4,-1]
            ₂+ #  Add 26 to each: [31,28,31,30,31,30,31,31,30,31,30,25]
 ā             #  Push a list in the range [1,length] (without popping):
               #   [1,2,3,4,5,6,7,8,9,10,11,12]
  2Q           #  Check which is equal to 2: [0,1,0,0,0,0,0,0,0,0,0,0]
    X*         #  Multiply each by the is_leap_year check of variable `X`
      +        #  Add the values at the same positions in the lists together
 13žf-         #  Push 13 minus the current month
      .£       #  Only leave that many items from the end of the list
        O      #  Sum them together
 že-           #  Subtract the current day
]              # Close the if-else statements
 F             # Loop that many times:
  ð            #  Push a space character " "
  '»ˆ         '#  Push dictionary string "eve"
 }J            # After the loop: join the entire stack together
   ™           # Titlecase each word
               # (after which the result is output implicitly)

žežfžg)V   # Get the current [day,month,year] and save it in variable `Y`
'ŒÎ       '# Push dictionary string "christmas"
[          # Start an infinite loop:
 Y¨J       #  Remove the year, and join the month and day together
       Q   #  Check if this is equal to
    Ž9Ú    #  Compressed integer 1225
        #  #   If this is truthy (thus it's December 25th): stop the infinite loop
 Y`т‰0Kθ4ÖUD<i\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝV
           #  Go to the next day, and set `Y` to it
 ð         #  Push a space " "
 '»ˆ      '#  Push dictionary string "eve"
}J         # After the infinite loop: join the entire stack together
  ™        # Titlecase each word
           # (after which the result is output implicitly)

See this 05AB1E answer of mine to understand the is_leap_year check.

See this 05AB1E answer of mine to understand how we go to the next day (with the second longer approach).

See this 05AB1E tip of mine (sections How to use the dictionary? and How to compress large integers?) to understand why '»ˆ is "eve"; 'ŒÎ is "christmas"; Ž9Ú is 1225; and •ΘÏF• is 5254545.

\$\endgroup\$
1
  • \$\begingroup\$ Clever golfing! \$\endgroup\$
    – MilkyWay90
    Jan 5, 2019 at 18:35
1
\$\begingroup\$

Go, 178 bytes

import(."time";."strings")
func f()string{n:=Now()
y:=n.Year()
if n.Month()>11&&n.Day()>25{y++}
return"Christmas"+Repeat(" Eve",int(Date(y,12,25,0,0,0,0,UTC).Sub(n).Hours())/24)}

Attempt This Online!

And a variant that takes a Time as input, 175 bytes:

import(."time";."strings")
func f(n Time)string{y:=n.Year()
if n.Month()>11&&n.Day()>25{y++}
return"Christmas"+Repeat(" Eve",int(Date(y,12,25,0,0,0,0,UTC).Sub(n).Hours())/24)}

Attempt This Online!

\$\endgroup\$
0
\$\begingroup\$

C# (Visual C# Interactive Compiler), 141 bytes

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

Try it online!

\$\endgroup\$
5
  • 1
    \$\begingroup\$ I don't think this works for the 30th of November... \$\endgroup\$
    – Neil
    Dec 25, 2018 at 9:56
  • \$\begingroup\$ Fixed now, I forgot to add a check to if it was December or not \$\endgroup\$
    – Gymhgy
    Dec 25, 2018 at 17:58
  • \$\begingroup\$ Are you sure about Month > 25? \$\endgroup\$
    – Neil
    Dec 25, 2018 at 19:12
  • \$\begingroup\$ Fixed it now... \$\endgroup\$
    – Gymhgy
    Dec 25, 2018 at 20:20
  • \$\begingroup\$ Is the ?1:0 nessesary? doesn't & return an integer? \$\endgroup\$
    – 12Me21
    Dec 25, 2018 at 23:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.