Кодуйте дату у форматі Святвечір


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

.

Ваше завдання - взяти дату запуску програми та кодувати її у форматі Святвечір.

  • Якщо ваша програма запускається на Різдво, вона повинна вивести рядок "Різдво".
  • Якщо ваша програма не запускається на Різдво, вона повинна вивести рядок "Різдво", після чого повторюваний рядок "Єва" повторюється nраз, де nкількість днів до Різдва.
    • Зауважте, що це повинно базуватися на наступному Різдві. Наприклад, якщо день - 26 квітня 2019 року, ви повинні зробити свій розрахунок на основі 25 грудня 2019 року, а не будь-якого іншого Різдва.
    • Не забудьте рахувати високосні дні.
  • Різдво - 25 грудня кожного року.

Це , тому найкоротший код виграє! Зауважте, що мета полягає не в тому, щоб знайти найкоротшу програму будь-якою мовою, а знайти найкоротшу програму кожною конкретною мовою. Наприклад, якщо ви знайдете найкоротшу програму C ++, виграєте цей конкурс для C ++, навіть якщо хтось знайде більш коротку програму в Python.


7
Я якось знав, що це буде завданням КППГ, коли я побачив мультфільм - +1 від мене
Чорна сова Кай

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

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

1
Чи може дата бути параметром?
Олів'є Грегоар

1
@ OlivierGrégoire uhm, я дозволю, якщо мова не має можливості отримати поточну дату іншим способом.
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?
таргумон

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
Я думаю = «Різдво» і REPT («Єва», ДАТА (РОК (ЗАРАЗ () + 6), 12,26) -СЕГА ()) ще коротше, і я вважаю, що це повинно працювати.
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 байт

скажіть 'Різдво' ~ 'Eve'x (Date.today ... ^ {. місяць == 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
Jo King

Я думаю, що можна припустити, що цього ніколи не відбудеться
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"Різдво" з такою кількістю "Єви".


Ви використовуєте лише 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псевдоніми 's %, використовуючи форму, яка може викликати метод за допомогою wildcarded імені; у цьому випадку метод знаходиться AddDays()на DateTimeоб’єкті, і значення, яке ми йому надаємо, є $i.

Це ForEach-Objectзнову стає необхідним для виклику ToString()методу з рядком формату Md(місяць, потім день, мінімальні цифри, оскільки нам не байдуже, що буде далі). Потім цей рядок тестується, щоб перевірити, чи не дорівнює -neйому число 1225, яке буде перетворене на рядок для порівняння, врятувавши мене лапки.

Ось чому не важливо, що місяці та дні є одноцифровими, це ніколи не буде неоднозначним, оскільки немає іншого дня року, який би зміцнювався 1225.

Цикл продовжується до тих пір , рядок НЕ буде 1225 . На початку програми $iбуде дорівнює нулю, тому вона буде порівнювати сьогоднішню дату, і цикл ніколи не виконується, але за будь-який інший день $iзбільшується в тілі циклу, так що ми будемо рахувати кількість днів до Наступного Різдва, автоматично облік високосних років та незалежність від того, чи минуло Різдво цього року.

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


Мабуть, ;після {$i++}цього зайве? (також ух, ви знову взяли на себе перемогу над
басом

@Cowsquack приємно! як я цього не помітив ?!
британіст

7

C # (Visual C # Interactive Compiler) , 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 собі в інкременторі? У мене немає документів перед собою, але якщо ні, ви можете зберегти ще два байти.
Стек

1
о, це структура. Звичайно, так і є. Не звертай уваги.
Стек

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'c o p y у бібліотеці dfns

⎕TS Поточний t ime s tamp як [рік, місяць, день, година, хв, сек, мс]
days[c]  знайти кількість днів [n] з 1899-12-31 00: 00: 00.000
(⍳366) додати перші 366 цілих чисел (0 ... 365) в тому , що
date[з]  знайти дати [N] , які відповідають цим номерам (366 × 7 таблиці, один стовпець за одиницю)
 транспонувати (7 × 366 таблиця, один рядок за одиницю)
1↓ впустити один рядок (роки)
2↑ приймають перші два ряди (місяці та дні)
12 25⍳⍨ знаходять індекс першого різдвяного
 множення, що на чотири
' Eve'⍴⍨ використовують це для перетворення списку символів,
'Christmas ', додаючи це до цього

[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 дати: зараз і Xmas цього року. Якщо остання ще не пройшла, вона просто відрізняється від них, якщо вона минула, відмінна від Xmas наступного року. Використовується або відрізняється для кількості повторів.

(Намагається) Подумайте поза рамкою ( 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, і повторювати, поки не настане Xmas, щоб дати вихід.

Оскільки 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)

Починаючи з сьогоднішнього дня, збільшуйте дату на день до настання Xmas, потім використовуйте лічильник цієї петлі для кількості необхідних повторів.

Поліпшення (у тому числі проходження мініфікатора та використання трюку 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-тільки: видалення місця перед &помилками
Barranka

-1 байт. Завдяки @ ASCII-тільки за те, що
пішов на друк

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

3

Bash + GNU дата, 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

Спробуйте в Інтернеті


Гммм, чому це =~не працює в умовному циклі?
Kritixi Lithos

оскільки умова циклу - це арифметичний вираз, слова примусові до цілого числа, а число, що починається з 0, припускається у восьмерику, тому 1 є попередньою
Науель Фулле

3

Python 2, 128 байт / Python 3, 130 байт

звичайно, два менших байти з 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])


@tsh Це дивовижний підхід!
iBug



3

Баш , 68 65 61 байт

Поле з байдарками 4 байти завдяки Нахуелю Фулею , використовуючи ``заміну команди і 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 ...

Кожен аргумент до echoдрукується шляхом розділення пробілами, що призводить до бажаного виводу.


У bashцьому рішенні немає нічого конкретного. Це вимагає GNU date, sedі seqхоча.
Кусалаланда


@NahuelFouilleul Спасибі, приємний трюк використання заміни команд backtick, щоб уникнути xargs та використовувати eval, щоб пропустити на наступний
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"));}

Спробуйте в Інтернеті!


IMO вам слід залишити поза #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]
roofcat

2

Groovy , 66 байт

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

Спробуйте в Інтернеті!

Надано лише @ ASCII


Вам потрібно роздрукувати його, оскільки це повноцінна програма, а не функція
лише 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

Дякую, на три байти менше! 😁
S.

уау, прекрасно зроблено, доСпорядок побачень був приємний
В. Куртуа

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 байт.
таргумон

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 Нелюбовий, 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)}

Спробуйте в Інтернеті!

Scala + Joda-Time , 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


Ах @ ASCII - я не рахував object Main extends App{}символів у своєму підрахунку (тому що я не знав і в інших відповідях Скали). Якщо ми це заберемо, ти побив мене ^^
В. Куртуа

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 # Interactive Compiler) , 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 тільки Hmm, звичайно! Дякую!
Гален Іванов



@ Тільки ASCII Ваша 76-байтна версія не дає правильного результату під час запуску на Різдво: Дата як аргумент, я відчуваю себе дурним за те, що не використовую лише nowта не now/date. Дякую за вдосконалення!
Гален Іванов

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.