Кодировать дату в формате сочельника


51

День публикации этого поста был канун Рождества. Завтра будет Рождество. Вчера был канун Рождества. Через два дня будет

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

,

Ваша задача - взять дату запуска программы и закодировать ее в формате сочельника.

  • Если ваша программа запускается на Рождество, она должна вывести строку «Рождество».
  • Если ваша программа не запускается на Рождество, она должна вывести строку «Christmas», за которой следует строка «Eve», повторяющаяся nраз, где nуказано количество дней до Рождества.
    • Обратите внимание, что это должно быть основано на следующем Рождестве. Например, если день 26 апреля 2019 года, вы должны сделать свой расчет на основе 25 декабря 2019 года, а не любого другого Рождества.
    • Не забывайте считать високосные дни.
  • Рождество 25 декабря каждого года.

Это , поэтому выигрывает самый короткий код! Обратите внимание, что цель состоит не в том, чтобы найти самую короткую программу на любом языке, а в том, чтобы найти самую короткую программу на каждом конкретном языке. Например, если вы найдете самую короткую программу на C ++, она выиграет этот конкурс на C ++, даже если кто-то найдет более короткую программу на Python.


7
Каким-то образом я знал, что это будет вызов PPCG, как только я увидел мультфильм - +1 от меня
Черная Сова Кай

25
Мультфильм xkcd, который был опубликован сегодня. imgs.xkcd.com/comics/christmas_eve_eve.png
Черная сова Кай,

7
@ BlackOwlKai LMBO Я даже не видел этот комикс до твоего комментария. Я уже планировал опубликовать это, и просто ждал сочельника. Думаю, великие умы похожи?
PyRulez

1
Может ли дата быть параметром?
Оливье Грегуар

1
@ OlivierGrégoire Хм, я позволю, если у языка нет возможности получить текущую дату другим способом.
PyRulez

Ответы:


52

SmileBASIC, 73 71 67 байт

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

Программа печатает «Рождество», затем печатает «Ева» каждый раз, когда проходит день, до 25 декабря. (12/25 = 0,48)
Может потребоваться до года, чтобы бежать.


7
чистый гений ...
FlipTack

7
Это заставило меня улыбнуться ...
Нил

3
Приятно! Одно из моих решений JavaScript использует аналогичный подход. Однако в JavaScript время ожидания - это просто лучшее усилие. Как поживает SmileBASIC?
Targumon

4
@ 12Me21, который, очевидно, потерпит неудачу из-за високосных секунд, эта версия выглядит намного лучше.
Rɪᴋᴇʀ

5
+1 за нестандартное мышление и смешение.
Том

24

Формула Excel, 59 байт

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())

4
Я думаю, что YEAR(TODAY()+6)всегда возвращает правильный год, таким образом избегая условия.
Нил

3
Я думаю, что YEAR(NOW()+6)работает также с 2 байтами меньше.
Инженер Тост

2
Я думаю, что = "Christmas" & REPT ("Eve", DATE (YEAR (NOW (NOW () + 6), 12,26) -NOW ()) еще короче, и я считаю, что это должно работать.
JeroendeK

1
NOW()включает в себя время, поэтому оно не будет целым числом, и я не уверен, REPTчто позволил бы это.
12Me21

2
но это не дает "Рождество" на Рождество. Проверка="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Энтони

12

Perl 6 , 61 47 байт

скажем 'Рождество' ~ 'Сочельник (Date.today ... ^ {. month == 12 &&. day == 25})

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

Попробуйте онлайн!

-14 байт (!) Благодаря Джо Кингу

Date.today ...^ /12\-25/последовательность дат, начинающихся сегодня и заканчивающихся за день до Рождества. (Регулярное выражение /12\-25/сопоставляется со строковым представлением дат.) Строка " Eve"реплицируется количество раз, равное длине этой последовательности, и выводится после строки "Christmas".


Не могли бы вы сделать «месяц> 11», чтобы сохранить байт?
chrixbittinx

2
Будет /12.25/работать?
Kritixi Lithos

2
@ Cowsquack нет, потому что тогда это может совпадать с годом в таких датах, как12025-12-24
Джо Кинг,

Я думаю, можно с уверенностью предположить, что этого никогда не произойдет
12Me21

8

R , 112 106 72 байта

Через @digEmAll и @ J.Doe

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

Попробуйте онлайн!

Мой первоначальный ответ был до разъяснения, что код должен принимать дату запуска кода в качестве входных данных. Это можно изменить, как указано выше, чтобы сэкономить много байтов, но я не буду беспокоиться.

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

Попробуйте онлайн!

Объяснение: все в церкви, поэтому у меня есть время, чтобы сделать это. Извлеки год, приведи к целому числу. Сделайте вектор Xmas этого года и Xmas следующего года и вычтите входную дату, чтобы получить вектор двух разностей между датой ввода и этими двумя Xmases.

Выберите неотрицательный и cat"Рождество" с таким количеством "Eves".


Вы используете только yодин раз, поэтому вы можете использовать его напрямую для 108 байтов.
Джузеппе

И z[z>=0][1]работал бы вместо min?
Джузеппе

73 байта . Согласно последнему комментарию, программа должна выводить текст в зависимости от дня, в который она выполняется. Кстати, с Рождеством! : D
digEmAll

1
Настроил ваш на 72 байта , @digEmAll. Счастливого Рождества!
J.Doe

8

Windows PowerShell , 67 64 63 байта

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

Попробуйте онлайн!

Удалось сбрить 3 байта на 4 байта (благодаря шарлатану-f Корова ), используя вместо этого оператор ormat .ToString(), а затем вычесть строку даты из числового значения 1225 вместо сравнения с -ne. Полученное целое число будет интерпретировано как логическое значение для условия, где 0(что произойдет на Рождество) будет интерпретировано как False(не входите в цикл), а любое другое значение будет интерпретировано как True(введите цикл).

Поскольку целое число находится слева, строка даты будет преобразована в целое число, и будет выполнена математическая обработка, в отличие от предыдущей версии, где 1225целое число было преобразовано в строку для сравнения.

Оригинальная версия


Windows PowerShell , 67 байт

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

Попробуйте онлайн!

Использование forцикла в качестве whileцикла в основном, потому что он короче. В условии цикла мы проверяем текущую дату ( dateсокращенную форму Get-Date), переданную по ForEach-Objectпсевдониму %, используя форму, которая может вызывать метод по имени с подстановочными символами; в этом случае метод находится AddDays()на DateTimeобъекте, и значение, которое мы ему даем, равно $i.

Это ForEach-Objectснова вызывается для вызова ToString()метода с форматной строкой Md(месяц, затем день, минимальные цифры, так как нам не важно, что будет дальше). Затем эта строка проверяется, чтобы узнать, не совпадает -neли она с числом 1225, которое будет преобразовано в строку для сравнения, что спасет меня от кавычек.

Вот почему не имеет значения, что месяцы и дни являются однозначными, это никогда не будет двусмысленным, потому что нет другого дня года, к которому можно было бы привязаться 1225.

Цикл продолжается до тех пор, пока строка не станет 1225 . В начале программы $iбудет ноль, поэтому он будет сравнивать сегодняшнюю дату, и цикл никогда не будет выполнен, но в любой другой день $iбудет увеличен в теле цикла, так что у нас будет счетчик количества дней до на следующее Рождество, автоматически учитывающие високосные годы и то, прошло или нет Рождество в этом году.

После цикла мы просто вывести строку Christmasсцепляются с результатом умножения строковое eveраз превышает значение $i(которое, в день Рождества, будет 0, в результате чего нет eveс).


Видимо, ;после {$i++}является избыточным? (Вау, ты снова взял на себя инициативу)
Kritixi Lithos

@ Классно! как я этого не заметил ?!
Бриантист

7

C # (интерактивный компилятор Visual C #) , 89 байт

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

Попробуйте онлайн!

-3 байта благодаря @JeppeStigNielsen!

Моя стратегия довольно проста:

  1. Инициализируйте переменную цикла tдля текущей даты
  2. Распечатать Eveесли tне Рождество
  3. Добавьте день tи повторите

Я попробовал несколько более причудливых вещей, но для этого потребовалось меньше байтов.


... вам нужно присвоить t себе в инкременторе? У меня нет документов передо мной, но если нет, вы можете сэкономить еще два байта.
Stackstuck

1
о, это структура Конечно, это является. Неважно.
Stackstuck

1
Вы можете заменить t.Month<12|t.Day!=25с более коротким $"{t:Md}"!="1225". Он использует интерполированную строку и пользовательскую строку форматирования DateTime.
Джеппе Стиг Нильсен

6

T-SQL, 92 88 байт

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

Редактировать: 4 байта сохранены благодаря @BradC.


Хорошо сделано. Сохраните 2 с PRINT'Christmas'+...и еще 2, используя DATEDIFF(D,вместоDATEDIFF(DAY,
BradC

@BradC Хорошо, спасибо!
Нил

5

APL (Dyalog Unicode) , 76 63 байта SBCS

Полная программа. Предполагается ⎕IO←0(нулевая индексация).

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

Попробуйте онлайн!

⎕CY'dfns'с о р у в библиотеке dfns

⎕TS текущий T IME сек TAMP как [год, месяц, день, час, мин, сек, мс]
days[с]  найти количество дней [п] , так как 1899-12-31 00: 00: 00,000
(⍳366) добавить первые 366 целых чисел (0 ... 365) в том , что
date[с]  найти даты [п] , которые соответствуют этим номерам (366 × 7 таблицы; один столбец на единицу)
 транспонирования (7 × 366 таблица, одна строка за единицу)
1↓ уронить одну строку (годы)
2↑ взятием первые две строки (месяцы и дни)
12 25⍳⍨ найти индекс первого Рождества
 умножить на четыре
' Eve'⍴⍨ использования, чтобы изменить список символов
'Christmas ', Append , что к этому

[c]  код этой функции
[n]  примечания к этой функции


5

Python 2 , 111 103 байта

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

Попробуйте онлайн!

Обновление вдохновлено ответом Ричарда Кроссли .

Объяснение:

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



4

JavaScript, 135 131 121 92 88 байт

Мое первое (наивное) решение ( 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)

Он устанавливает 2 даты: сейчас и Рождество этого года. Если последний еще не прошел, он просто отправляет их, если прошел, к Рождеству следующего года. Использует либо различия в количестве повторений.

(Пытаясь) Думать вне коробки ( 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()

Вызов указывает, какой вывод требуется при запуске программы в определенный день, но не указывает, КОГДА его вернуть ...

Это просто «спит» в течение дня, увеличивает счетчик на 1 и повторяет до наступления Рождества, чтобы выдать результат.

Поскольку JavaScript не гарантирует время ожидания, реальный результат может быть отключен.

Это также уродливо для использования alert функции, что означает, что на самом деле мы имеем дело не с чистым JavaScript, а с API-интерфейсами браузера (мы можем использовать console.logза счет 6 дополнительных байтов).

Лучший подход ( 121b ):

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

Начиная с сегодняшнего дня, увеличивайте дату на день, пока не наступит Рождество, а затем используйте счетчик цикла для количества требуемых повторений.

Улучшение (включая прохождение минификатора и использование трюка 12Me21 для дополнительного бритья 5b) ( 92b ):

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

Последние штрихи ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Для всего вышеперечисленного предполагается REPL.
  • Смотрите представление Вадима - намного лучше, чем у меня!

1
Я думаю, что вы можете использовать, t.getMonth()/t.getDate-.48чтобы проверить, не является ли дата 25 декабря
12Me21

1
Добро пожаловать на сайт! Вы можете использовать 4 пробела, чтобы ваши блоки кода выглядели лучше.
Пшеничный Волшебник

1
Добро пожаловать в PPCG!
Лохматый

1
98 , printтребуется, поскольку это программа, а не функция, если только 1. вы не превратите ее в лямбду или 2. вы заявите, что используете REPL
только для ASCII

1
t=new Date(+t+864e5)на 1 байт короче.
Андрей Светличный

3

VBA (Excel), 108 байт

Скопируйте в пустой модуль. Печать в ближайшее окно:

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

Примечание. Использование :вместо разрывов строки экономит два байта на строку.

Обратите внимание, что редактор VBA будет вставлять дополнительные пробелы между ключевыми словами, операторами и т. Д. И круглыми скобками после определения Sub, но если вы скопируете и вставите этот код, он будет работать (я не смог избавиться от этого пробела до &).

Неплохо для VBA (на этот раз).


1
* Christmas: |
Только для ASCII,

@ Только для ASCII: удаление пробела перед &ошибкой
Барранка

-1 байт Спасибо @ ASCII-only за обнаружение опечатки
Барранка

1
Вы можете сократить это до 71 символа, преобразовав его в непосредственную оконную функцию и удалив временную переменную для now. Когда вы это сделаете, это должно выглядеть примерно так?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Тейлор Скотт

3

Bash + GNU date, 72 73 байта

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • один байт сохранен !=с заменой на-
  • еще одно удаление лишнего пространства
  • исправить -3 байта d=0, потому что date -ddayдата + 1 и не работает 25/12

Попробуйте онлайн


Хм, а почему =~не работает условный цикл for?
Критиси Литос

поскольку условие цикла for является арифметическим выражением, слова приводятся к целому числу, а числа, начинающиеся с 0, предполагаются в восьмеричном
формате


3

Баш , 68 65 61 байт

Гольф 4 байта благодаря Nahuel Fouilleul , используя ``замену команд и evalвместо sed eиxargs

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

Попробуйте онлайн!

Внутри `` подстановки команд мы имеем

eval запустите следующую строку как команды оболочки

  • date\ -d{0..366}day\;при расширении распорной части {0..366}, это приводит к строке date -d0day; date -d1day; date -d2day; ... date -d366day;, каждая команда в этой строке вычисления даты между 0 и 366 дней от настоящего , что приводит к выходу формата Wed Dec 26 18:22:33 UTC 2018, причем каждый в своей собственной линии

|sed после чего вызовите следующие команды sed

  • /c.25/Qесли регулярное выражение /c.25/совпадает, QUIT без печати

  • \;cEve в противном случае измените строку на Eve

Все необходимое количество Eves производится каждый на своей линии. Этот вывод фиксируется в ``, и подвергается разделению слов, где слова разделяются на новые строки. Каждое слово подается в качестве аргумента echo.

echo Christmas ...

Каждый аргумент to echoпечатается через пробел, что приводит к желаемому выводу.


В bashэтом решении нет ничего особенного . Требуется GNU date, sedи seqвсе же.
Кусалананда


@NahuelFouilleul Спасибо, хороший прием использования подстановки команды backtick, чтобы избежать xargs, и использования eval для пропуска на seq
Kritixi Lithos

2

C (gcc) , 157 байтов

Я думал, что смогу избежать включения, time.hно это только дало ошибки сегмента.

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

Попробуйте онлайн!


ИМО, ты должен не учесть #include <stdlib.h>, а не то, что он вообще здесь что-то делает
только ASCII

Предлагайте *t;f(u)вместо *t,u;f()и #import<time.h>вместо #include <time.h>и 5[t=localtime(&u)]вместоt=localtime(&u);t[5]
потолка кошка

2

Groovy , 66 байт

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

Попробуйте онлайн!

Предоставлено @ ASCII-only


Вы должны распечатать его, так как это полная программа, а не функция
только ASCII

> Chistmas: /
Только для ASCII



взяв свой первый и используя Groovy 2.5, он уменьшится до 115 .
bdkosher


2

Scala , 116 113 байтов

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

Попробуйте онлайн!

Где c 25коротко для Dec 25.


1
Я думаю, что вы можете использовать contains("c 25")вместоmatches(".*c 25.*")
12Me21

Спасибо, на три байта меньше! K
С.

вау, хорошо сделано, toString даты было приятно
В. Куртуа

2

JavaScript, 86 77 байт

Используя REPL, это было бы

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

Слава ASCII-только для -9 байтов



Браво! Вы сделали намного лучше, чем я. Могу ли я предложить побрить лишний байт? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c или этот вариант: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s оба - 76 байтов.
Targumon

2

Луа , 137 118 байт.

118 байт

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 байт (предыдущий)

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

Стоит отметить, что это не работает в LuaJIT (синтаксическая ошибка)


Добро пожаловать в PPCG! Хороший первый пост!
Rɪᴋᴇʀ


1

MATLAB, 91 байт

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 байт

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

1

Scala , 123 байта

Благодаря работе только в ASCII.

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

Попробуйте онлайн!

Скала + Йода-Тайм , 140 байт

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)

Не работает в TIO, поскольку требует библиотеки Joda-Time.


нет йода, 154 . к сожалению, не могу добраться java.util.Dateдо работы здесь: /
только ASCII


Ah @ ASCII-only Я не считал object Main extends App{}символы при подсчете (потому что я не учел и другие ответы в Scala). Если мы возьмем это, ты побьешь меня ^^
В. Куртуа

withDate()Звонок так дорого ...
В. Куртуа

1. помните, что вам нужно указать язык как "Scala + Joda-Time", так как вы используете внешнюю библиотеку и 2. не собираетесь использовать мои изменения? короче плюс не нужна библиотека: P
только ASCII

1

05AB1E , 93 89 байт

ž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™

Попробуйте онлайн или Попробуйте онлайн с эмулируемой самоназначенной датой «сегодня» .

Объяснение:

05AB1E не имеет встроенных функций для дат, за исключением получения текущего года / месяца / дня / часов / минут / секунд / микросекунд, поэтому большинство байтов используются для ручных вычислений.

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

Посмотрите мой ответ, чтобы понять, как мы пойдем на следующий день. (PS: 1¾ǝбыл заменен на T`ǝ, так как мы используемcounter_variable где-то еще.)

Смотрите этот 05AB1E наконечника шахты (разделы Как использовать словарь? И Как сжать большие целые числа? ) , Чтобы понять , почему '»ˆэто "eve"; 'ŒÎесть "christmas"; и Ž9Úэто1225 .


Умный гольф!
MilkyWay90

0

C # (интерактивный компилятор Visual C #) , 141 байт

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

Попробуйте онлайн!


1
Я не думаю, что это работает на 30 ноября ...
Нил

Исправлено сейчас, я забыл добавить проверку, если это был декабрь или нет
Воплощение невежества

Ты уверен в Месяце> 25?
Нил

Исправлено сейчас ...
Воплощение Невежества

Является ли? 1: 0 необходимым? не возвращает целое число?
12Me21

0

Красный , 89 86 84 78 76 байт

-10 байт благодаря ASCII-только!

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

Попробуйте онлайн!



@ ASCII-только Хм, конечно! Спасибо!
Гален Иванов



@ ASCII-only Ваша 76-байтовая версия не дает правильного результата при запуске на Рождество: дата как аргумент, я чувствую себя глупо, что не использую только nowи не now/date. Спасибо за ваши улучшения!
Гален Иванов

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.