День публикации этого поста был канун Рождества. Завтра будет Рождество. Вчера был канун Рождества. Через два дня будет
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.
Ответы:
SmileBASIC,
737167 байтПрограмма печатает «Рождество», затем печатает «Ева» каждый раз, когда проходит день, до 25 декабря. (12/25 = 0,48)
Может потребоваться до года, чтобы бежать.
источник
Формула Excel, 59 байт
источник
YEAR(TODAY()+6)
всегда возвращает правильный год, таким образом избегая условия.YEAR(NOW()+6)
работает также с 2 байтами меньше.NOW()
включает в себя время, поэтому оно не будет целым числом, и я не уверен,REPT
что позволил бы это.="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Perl 6 ,
6147 байтскажем 'Рождество' ~ 'Сочельник (Date.today ... ^ {. month == 12 &&. day == 25})Попробуйте онлайн!
-14 байт (!) Благодаря Джо Кингу
Date.today ...^ /12\-25/
последовательность дат, начинающихся сегодня и заканчивающихся за день до Рождества. (Регулярное выражение/12\-25/
сопоставляется со строковым представлением дат.) Строка" Eve"
реплицируется количество раз, равное длине этой последовательности, и выводится после строки"Christmas"
.источник
/12.25/
работать?12025-12-24
R ,
112 10672 байтаЧерез @digEmAll и @ J.Doe
Попробуйте онлайн!
Мой первоначальный ответ был до разъяснения, что код должен принимать дату запуска кода в качестве входных данных. Это можно изменить, как указано выше, чтобы сэкономить много байтов, но я не буду беспокоиться.
Попробуйте онлайн!
Объяснение: все в церкви, поэтому у меня есть время, чтобы сделать это. Извлеки год, приведи к целому числу. Сделайте вектор Xmas этого года и Xmas следующего года и вычтите входную дату, чтобы получить вектор двух разностей между датой ввода и этими двумя Xmases.
Выберите неотрицательный и
cat
"Рождество" с таким количеством "Eves".источник
y
один раз, поэтому вы можете использовать его напрямую для 108 байтов.z[z>=0][1]
работал бы вместоmin
?Windows PowerShell ,
676463 байтаПопробуйте онлайн!
Удалось сбрить
3 байта на4 байта (благодаря шарлатану-f
Корова ), используя вместо этого оператор ormat.ToString()
, а затем вычесть строку даты из числового значения 1225 вместо сравнения с-ne
. Полученное целое число будет интерпретировано как логическое значение для условия, где0
(что произойдет на Рождество) будет интерпретировано какFalse
(не входите в цикл), а любое другое значение будет интерпретировано какTrue
(введите цикл).Поскольку целое число находится слева, строка даты будет преобразована в целое число, и будет выполнена математическая обработка, в отличие от предыдущей версии, где
1225
целое число было преобразовано в строку для сравнения.Оригинальная версия
Windows PowerShell , 67 байт
Попробуйте онлайн!
Использование
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++}
является избыточным? (Вау, ты снова взял на себя инициативу)C # (интерактивный компилятор Visual C #) , 89 байт
Попробуйте онлайн!
-3 байта благодаря @JeppeStigNielsen!
Моя стратегия довольно проста:
t
для текущей датыEve
еслиt
не Рождествоt
и повторитеЯ попробовал несколько более причудливых вещей, но для этого потребовалось меньше байтов.
источник
t.Month<12|t.Day!=25
с более коротким$"{t:Md}"!="1225"
. Он использует интерполированную строку и пользовательскую строку форматирования DateTime.T-SQL,
9288 байтРедактировать: 4 байта сохранены благодаря @BradC.
источник
PRINT'Christmas'+...
и еще 2, используяDATEDIFF(D,
вместоDATEDIFF(DAY,
APL (Dyalog Unicode) ,
7663 байта SBCSПолная программа. Предполагается
⎕IO←0
(нулевая индексация).Попробуйте онлайн!
⎕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⍳⍨
найти индекс первого Рождества4×
умножить на четыре' Eve'⍴⍨
использования, чтобы изменить список символов'Christmas ',
Append , что к этому[c] код этой функции
[n] примечания к этой функции
источник
Python 2 ,
111103 байтаПопробуйте онлайн!
Обновление вдохновлено ответом Ричарда Кроссли .
Объяснение:
источник
Рубин , 80 байт
Попробуйте онлайн!
Спасибо ТШ за его идею
источник
puts
p
PHP, 61 байт
Запустите
-n
или попробуйте онлайн .источник
JavaScript,
1351311219288 байтМое первое (наивное) решение ( 135b ):
Он устанавливает 2 даты: сейчас и Рождество этого года. Если последний еще не прошел, он просто отправляет их, если прошел, к Рождеству следующего года. Использует либо различия в количестве повторений.
(Пытаясь) Думать вне коробки ( 131b ):
Вызов указывает, какой вывод требуется при запуске программы в определенный день, но не указывает, КОГДА его вернуть ...
Это просто «спит» в течение дня, увеличивает счетчик на 1 и повторяет до наступления Рождества, чтобы выдать результат.
Поскольку JavaScript не гарантирует время ожидания, реальный результат может быть отключен.
Это также уродливо для использования
alert
функции, что означает, что на самом деле мы имеем дело не с чистым JavaScript, а с API-интерфейсами браузера (мы можем использоватьconsole.log
за счет 6 дополнительных байтов).Лучший подход ( 121b ):
Начиная с сегодняшнего дня, увеличивайте дату на день, пока не наступит Рождество, а затем используйте счетчик цикла для количества требуемых повторений.
Улучшение (включая прохождение минификатора и использование трюка 12Me21 для дополнительного бритья 5b) ( 92b ):
Последние штрихи ( 88b ):
источник
t.getMonth()/t.getDate-.48
чтобы проверить, не является ли дата 25 декабряprint
требуется, поскольку это программа, а не функция, если только 1. вы не превратите ее в лямбду или 2. вы заявите, что используете REPLt=new Date(+t+864e5)
на 1 байт короче.VBA (Excel), 108 байт
Скопируйте в пустой модуль. Печать в ближайшее окно:
Примечание. Использование
:
вместо разрывов строки экономит два байта на строку.Обратите внимание, что редактор VBA будет вставлять дополнительные пробелы между ключевыми словами, операторами и т. Д. И круглыми скобками после определения Sub, но если вы скопируете и вставите этот код, он будет работать (я не смог избавиться от этого пробела до
&
).Неплохо для VBA (на этот раз).
источник
Christmas
: |&
ошибкойnow
. Когда вы это сделаете, это должно выглядеть примерно так?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Bash + GNU date,
7273 байта!=
с заменой на-
d=0
, потому чтоdate -dday
дата + 1 и не работает 25/12Попробуйте онлайн
источник
=~
не работает условный цикл for?Python 2, 128 байт / Python 3, 130 байт
конечно, на два байта меньше с Python 2
источник
as D
самостоятельноБаш ,
686561 байтГольф 4 байта благодаря Nahuel Fouilleul , используя
``
замену команд иeval
вместо sede
иxargs
Попробуйте онлайн!
Внутри
``
подстановки команд мы имеем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/
совпадает,Q
UIT без печати\;cEve
в противном случае измените строку наEve
Все необходимое количество
Eve
s производится каждый на своей линии. Этот вывод фиксируется в``
, и подвергается разделению слов, где слова разделяются на новые строки. Каждое слово подается в качестве аргументаecho
.echo Christmas
...
Каждый аргумент to
echo
печатается через пробел, что приводит к желаемому выводу.источник
bash
этом решении нет ничего особенного . Требуется GNUdate
,sed
иseq
все же.C (gcc) , 157 байтов
Я думал, что смогу избежать включения,
time.h
но это только дало ошибки сегмента.Попробуйте онлайн!
источник
#include <stdlib.h>
, а не то, что он вообще здесь что-то делает*t;f(u)
вместо*t,u;f()
и#import<time.h>
вместо#include <time.h>
и5[t=localtime(&u)]
вместоt=localtime(&u);t[5]
Groovy , 66 байт
Попробуйте онлайн!
Предоставлено @ ASCII-only
источник
Chistmas
: /Python 3, 106 байт
источник
Scala ,
116113 байтовПопробуйте онлайн!
Где
c 25
коротко дляDec 25
.источник
contains("c 25")
вместоmatches(".*c 25.*")
JavaScript,
8677 байтИспользуя REPL, это было бы
Слава 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 байтов.Луа ,
137118 байт.118 байт
137 байт (предыдущий)
Стоит отметить, что это не работает в LuaJIT (синтаксическая ошибка)
источник
MySQL, 102 байта
почти так же, как ответ Нейла T-SQL . Кажется, нет более короткого пути в SQL.
Попробуйте онлайн .
источник
MATLAB, 91 байт
MATLAB Non-looper, 100 байт
источник
Scala , 123 байта
Благодаря работе только в ASCII.
Попробуйте онлайн!
Скала + Йода-Тайм , 140 байт
Не работает в TIO, поскольку требует библиотеки Joda-Time.
источник
java.util.Date
до работы здесь: /object Main extends App{}
символы при подсчете (потому что я не учел и другие ответы в Scala). Если мы возьмем это, ты побьешь меня ^^withDate()
Звонок так дорого ...05AB1E ,
9389 байтПопробуйте онлайн или Попробуйте онлайн с эмулируемой самоназначенной датой «сегодня» .
Объяснение:
05AB1E не имеет встроенных функций для дат, за исключением получения текущего года / месяца / дня / часов / минут / секунд / микросекунд, поэтому большинство байтов используются для ручных вычислений.
Посмотрите мой ответ, чтобы понять, как мы пойдем на следующий день. (PS:
1¾ǝ
был заменен наT`ǝ
, так как мы используемcounter_variable
где-то еще.)Смотрите этот 05AB1E наконечника шахты (разделы Как использовать словарь? И Как сжать большие целые числа? ) , Чтобы понять , почему
'»ˆ
это"eve"
;'ŒÎ
есть"christmas"
; иŽ9Ú
это1225
.источник
C # (интерактивный компилятор Visual C #) , 141 байт
Попробуйте онлайн!
источник
Красный ,
8986847876 байт-10 байт благодаря ASCII-только!
Попробуйте онлайн!
источник
now
и неnow/date
. Спасибо за ваши улучшения!Perl 5 , 68 байт
Попробуйте онлайн!
Где
c 25
коротко дляDec 25
.источник