Веселого Гольфмаса, Всем!

35

Всем Рождество, и вот соревнование по коду для игры в гольф. Вам нужно составить программу для распечатки подарка. В частности, слова "Счастливого Рождества". НО, есть загвоздка: эта программа должна работать, только если это 25 декабря. Если код запускается в любой другой день, то программа должна аварийно завершить работу.

Это Code-Golf, поэтому выигрывает ответ с наименьшим количеством байтов.

Счастливого Рождества!

Лео
источник
5
Да, это было ммммм. .. да 25-ый извините
Лев
3
Golfy Codemas ! :)
Луис Мендо
1
Нет, это должно быть крушение. Вы не можете выйти из приложения
Лев
2
@PhiNotPi Эти проблемы разные. Это не требует обратного отсчета и не требует ожидания, чтобы дать вывод
Лев

Ответы:

8

Пайк, 21 байт

.dↄґ6C65h*325q/Al

Попробуй это здесь!

     C65h*        -   multiply the day by the (current month + 1)
          325q    -  ^ == 325
    6         /   - 6 / ^
.dↄґ              -  load "merry christmas"
               Al - ^.capwords()

Или 18 байтов неконкурентоспособны.

.dↄґ6Cs6Y1q/Al

Точно так же, за исключением этого раздела:

Cs6Y1q 
C      -    get_time()
 s6    -   add 1 week
   Y   -  get day of the year
    1q - ^ == 1

Попробуй это здесь!

синий
источник
Это не удастся, если это 30 октября, не так ли?
Волшебная Осьминог Урна
1
@carusocomputing 30 * (10+1)= 330, а не 325
Blue
6

JavaScript, 55 53 46 байт

Примечание: это было проверено только в Google Chrome, программа может вести себя по-разному от браузера к браузеру (или от устройства к устройству)

2 байта сохранены благодаря @ ConorO'Brien

7 байтов сохранено благодаря @ETHProductions

alert(/c 25/.test(Date())?"Merry Christmas":a)

Выход с, Uncaught ReferenceError: a is not definedесли дата не Dec 25. Я не совсем уверен, если это считается сбой

alert(/c 25/.test(Date())?"Merry Christmas":a)

Kritixi Lithos
источник
Как насчет .slice(6,10)=="c 25"?
Конор О'Брайен
@ ConorO'Brien Спасибо! Это умно :)
Kritixi Lithos
@ETHproductions Я не могу вспомнить ни один день или месяц, который заканчивается c( Octподходит близко, но все еще не удовлетворяет регулярному выражению). Спасибо за совет!
Критиси Литос
Результат Date()полностью зависит от реализации. Например, я ожидаю, что это будет зависеть от языка и местоположения машины.
Oriol
@Oriol Тогда я укажу браузер в своем ответе
Kritixi Lithos
5

Python 3, 66 63 байта

Благодаря идеям из ответов JavaScript / ES здесь мне удалось сжать несколько байтов. Индексируйте словарь - несуществующие ключи будут вызывать KeyError. Следующий код работает в местном часовом поясе

import time;print({1:'Merry Christmas'}['c 25'in time.ctime()])

Выходной формат для ctimeне зависит от локали - формат всегда ~ 'Sun Dec 25 19:23:05 2016'. Поскольку только в декабре заканчивается трехбуквенное сокращение c, его можно использовать 'c 25'in time.ctime()здесь.


Предыдущая версия:

Это работает в часовом поясе UTC. Для местного часового пояса требуется еще s/gm/local3 байта. Для Python 2 можно удалить круглые скобки из- printза 65 байтов.

import time;print({(12,25):'Merry Christmas'}[time.gmtime()[1:3]])

Конструкция выбрасывает KeyErrorна другие даты:

>>> import time;print({(1,1):'Happy New Year'}[time.gmtime()[1:3]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (12, 25)
Антти Хаапала
источник
Это сбой в другие дни (он должен)?
Erresen
2
Я не могу заставить его работать, так как он возражает против кортежа как ключа Попробуйте онлайн! , Если вы измените его import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]и пометите его как Python 2, он все равно будет 66 байтов и вылетает с KeyError в даты, отличные от 25 декабря
ElPedro
@ElPedro упс: D должно было быть 1:3, я случайно скопировал свой тестовый код
Антти Хаапала
Поднял это, когда я позаимствовал твою gmtime()идею для моего ответа. Надеюсь, вы не возражаете :-)
ElPedro
5

PHP, 39 38 байт, не конкурирует (не вылетает)

<?=date(md)-1225?"":"Merry Christmas";

или

<?date(md)-1225?die:0?>Merry Christmas

или

<?=["Merry Christmas"][date(md)-1225];
Titus
источник
Кто-нибудь может играть в гольф на 4 байта date(Lz)%1001-358? : D
Тит
3
Это сбой?
edc65
Вы можете оставить ""в первом коде, который экономит 2 байта. Если бы не было чертовски високосных лет, вы могли бы сэкономить 2 байта больше, заменив mdна zи 1225по количеству день года 25 декабря.
UTF-8
1
Альтернатива: eval((date(md)^TQZZ).'"Merry Christmas";');(43 байта)
Исмаэль Мигель
1
@ UTF-8: Ты прав. Я в основном использую Элвиса для логических значений; и это напечатало бы 1. Это напечатало бы результат вычисления. и 0104-12251121.
Тит
4

Python 2 , 68 67 65 байт

-1 благодаря @muddyfish

Спасибо @AnttiHaapala за идею, которая спасла еще одну пару.

import time;print['Merry Christmas'][(12,25)!=time.gmtime()[1:3]]

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

Выдает ошибку IndexEr, если не 25 декабря

Неконкурентная версия для 59 байт, так как она работает только для високосных лет (использует день года, который в этом году равен 360, а в високосных - 361)

import time;print['Merry Christmas'][360!=time.gmtime()[7]]
ElPedro
источник
Вы не можете сохранить байт, используя список вместо кортежа?
Голубой
@muddyfish Спасибо, хороший улов.
ElPedro
Хороший, моя идея была 2 дополнительных байта : P
FlipTack
Спасибо. Это была также моя 67-байтовая версия, пока я не прокомментировал ответ от @AnttiHaapala и подумал о том, gmtime()чтобы сбрить пару. Я должен признать, я хотел бы, чтобы было больше, что я мог сделать с идеей дня года, хотя.
ElPedro
Вы можете сохранить 1 байт с помощью: time.ctime () [6:10]! = 'C 25'
Макс.
4

R, 52 61 58 байт

`if`(format(Sys.Date(),"%m%d")=="1225","Merry Christmas",)

Если текущая дата не 25 декабря, возвращается ошибка, поскольку третий аргумент не передается if.

Редактировать: Исправлена ​​глупая ошибка

Billywob
источник
Извините за мою маленькую опечатку. Я хотел сказать 25тг
Лев
Это работает только в этом году!
Erresen
@Erresen Ах да, глупая ошибка. Исправлено сейчас, хотя.
Billywob
4

Мой первый раз здесь ... Начатый с лучшим языком для этой работы:

Java, 200 188 байт (благодаря @Daniel Grey), 186 байт, удаляющих «ln» из печати.

import java.util.*;public class a{public static void main(String[]r){Calendar c=Calendar.getInstance();if(!(c.get(2)==11&&c.get(5)==25)){int i=1/0;}System.out.print("Merry Christmas");}}

Попробуй это здесь!

Бонифачо
источник
1
Добро пожаловать в PPCG! Хороший первый пост, хотя ява не совсем короткая.
Rɪᴋᴇʀ
1
Вы можете изменить Calendarдля *и сохранить несколько байтов. Вы также можете сократить имя argsпараметра в основном методе, я думаю ...
Дэниел Грей,
@ Даниэль Грей, Вы абсолютно правы, спасибо!
Бонифачо
1
Добро пожаловать! Вы можете сэкономить 10 байт, если вы замените «public class» на «interface» и удалите открытый модификатор из main, сделав его «interface a {static void main ...». Это, однако, не позволит Compilejava его запустить. онлайн.
Завада

3

MATL , 34 33 байта

'Merry Christmas'IHh&Z'5U12h=?}Yl

Это работает в текущей версии (19.7.0) языка. Чтобы вызвать ошибку, следующий код использует тот факт, что логарифм строки дает ошибку (это может измениться в будущих версиях).

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

объяснение

'Merry Christmas'  % Push this string
IHh                % Push 3, then 2, concatenate: gives array [3 2]
&Z'                % Get 3rd and 2nd outputs of clock vector: current day and month
5U12h              % Push 5, square, push 12, concatenate: gives [25 12]
=                  % Compare if corresponding entries are equal in the two arrays
?                  % If all entries are equal: do nothing
}                  % Else
  Yl               %   Logarithm. Gives an error when applied on a string
                   % End (implicit). Display (implicit)

3

QBIC , 48 байтов

~left$$|(_D,5)=@12-25||?@Merry Christmas|\?a(12)

Объяснение:

~             IF
left$$|(_D,5) the date string starts with
=@12-25|      the string "12-25"
|             THEN
?@Me..as|     PRINT "Merry Christmas"
\             ELSE
?a(12)        Print the twelfth index of an undefined array. 
              Since there are only 11 elements in undefined arrays, this 
              results in an index-out-of-bounds error.    
The the IF statement is auto-closed by QBIC.

Это предполагает американскую MM-DDзапись даты. Это было бы короче, если бы я наконец сделал функцию Substring в QBIC.


Что происходит в дни, которые не Рождество? Это терпит крах, как это должно?
Erresen

@Erresen это делает сейчас.
Стинберг

3

05AB1E ,32 21 байт

Сохранено 11 байт благодаря сжатию строк Аднана :).

1žfže‚12D·>‚Q÷”ÞٌΔ×

объяснение

 žfže‚                Push [current month, current day]
      12D·>‚          Push [12, 25]
            Q         Push tmp = 1 if the two arrays are equal, tmp = 0 otherwise
1            ÷        Evaluate x = 1/tmp. If tmp = 0 a division by 0 exception is thrown
              ”ÞÙŒÎ”× Implicitly display "Merry Christmas" x times

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

Сначала я сделал то, что пришло в голову, так что, возможно, для этого найдутся лучшие подходы. Но PPCG заслуживает Счастливого Рождества и в 05AB1E;).


Кроме того, xэто сокращение от дубликатов и двойных :).
Аднан

3

C # / CS Script 106 100 99 байт

99-байтовое решение

using System;int i;Console.WriteLine(DateTime.Now.ToString("dM")=="2512"?"Merry Christmas":i/0+"");

Попробуй это здесь!

100-байтовое решение (предпочитаю это ... немного другое)

using System;int i;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":i/0+"");

Разъяснение:

using System;
int i;

// if today plus 7 days is the first day of the year, then it's xmas!
Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1
    ? "Merry Christmas"

// otherwise divide i by 0
    : i/0+"");

DateTime.Now.AddDays(7).DayOfYear==1на один байт короче, DateTime.Now.ToString("ddMM")=="2512"но на 1 байт длиннееDateTime.Now.ToString("dM")=="2512"


1
Вы можете использовать $"{DateTime.Now:dM}"=="2512". dMнеоднозначно, но не для "2512".
Коби

@Kobi Я не могу использовать интерполяцию строк для
скрипта

1
Вы можете, если вы используете LinqPad (например, $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 байт) =)
Кеннет К.

Почему int iи не справедливо 1/0?
NoOneIsHere

1
@Erresen Ах, моя ошибка. Я не проверил достаточно тщательно. Настроен: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 байт)
Кеннет К.

2

C # / CS Script, 96 байт, в основном плагиат от Erresen

using System;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":1/0+"");

Удаляет int iдекларацию в пользу жесткого кодирования деления. Я бы оставил это как комментарий, но у меня нет репутации.


Добро пожаловать в PPCG! Хороший первый пост! Не беспокойтесь о комментариях / ответах, это не имеет большого значения.
Rɪᴋᴇʀ

2

утилиты bash + Unix, 51 49 47 байт

((`date +%m%d`-1225))&&${};echo Merry Christmas

* Спасибо @ KenY-N за указание на то, что кавычки в эхе могут быть удалены, и @IporSircer за уменьшение размера условия на 2 байта.


Это дает мне bash: ${}: bad substitutionошибку. Также вы можете сбросить цитаты с Рождеством, чтобы сохранить два байта. Кроме того, [ `date +%m%d` = 1225 ]&&echo Merry Christmasу меня работает, равный моим 45 байтов .
Кен YN

1
@ KenY-N Ошибка преднамеренная: программа должна аварийно завершить работу в другие дни, кроме Рождества. Спасибо за упоминание о том, что кавычки в эхо могут быть отброшены; Я пропустил это.
Митчелл Спектор

Упс, пропустил это требование! Протестировано путем изменения строки даты, и теперь я вижу, что она не падает. Удален мой ответ ... Но у меня есть альтернатива, поэтому позвольте мне обновить ее.
Кен YN

Попробуйте заменить ${}с !-меня бить на один байт. Я буду голосовать за тебя, когда ты выиграешь.
Кен YN

1
@ KenY-N Спасибо, но я не собираюсь менять $ {} на! - поскольку я думаю, что последний будет корректно работать только в командной строке, а не в скрипте (если вы не включите подстановку истории, что потребует дополнительных символы).
Митчелл Спектор
1

Groovy, 57 байт

print new Date().format("Md")=="1225"?"Merry Christmas":b

Сбои в даты, отличные от 25.12. с groovy.lang.MissingPropertyExceptionпотому что bне определено.

chrki
источник
1

С накоплением , 42 байта

Попробуй это здесь!

('Merry Christmas')'MMDD'date'1225'=¬#out

Это создает одноэлементный массив, содержащий именно 'Merry Christmas!'. После этого он помещает дату в строку с месяцем, за которым следует день. Он проверяет равенство с '1225'(Рождество), инвертирует его ¬, затем получает этот член из предыдущего массива. Если это не Рождество, это приведет к ошибке индексации. В противном случае он печатает Merry Christmas. (Измените дату в строке, чтобы увидеть, как она работает в другие дни.)

Конор О'Брайен
источник
1

Пакетный, 66 байт

@echo off
if %date:~0,5%==25/12 echo Merry Christmas&exit/b
if

Конечный символ новой строки важен, так как он приводит ifк сбою оператора. Возможно, вам придется настроить проверку даты в соответствии с вашим локальным форматом даты.

Нил
источник
1

Python 2, 69 77 75 или 72 70 байт

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
else:1/0

Если это не имеет значения, если он выходит с ошибкой, когда это Рождество, то:

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
1/0

РЕДАКТИРОВАТЬ:

Спасибо @ Flp.Tkc за указание на то, что мне нужно поднять ошибку

-2 байта из @Max для указания на удаление двоеточий из функции strftime

sonrad10
источник
1
It's meant to crash if it's not Christmas, this just exits normally.
FlipTack
Вы можете сэкономить 2 байта, удаляя двоеточия -> '% d% m' == '2512'
Макс.
@ Макс хорошо, спасибо за совет. Я не использовал эту функцию раньше, поэтому я не думал об этом
sonrad10
сохраните еще 3 байта с помощью: time.ctime () [6:10] == 'c 25'
Макс
1

CJam, 28

et[C25]#1="Merry Christmas"/

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

Объяснение:

et                   push an array of current [year month day hour ...]
[C25]                push the array [12 25] (C=12)
#                    find the position of the 2nd array within the first one
1=                   compare it with 1, resulting in 1 for 1 and 0 otherwise
"Merry Christmas"/   split "Merry Christmas" into pieces of that length
                      (it crashes if the length is 0)
                     at the end, all the pieces are concatenated
                      and printed automatically
aditsu
источник
0

C # .NET, 180 172 171 байт

Сохранено 8 байт благодаря Kritixi Lithos

Сохранено 1 байт благодаря Kritixi Lithos, опять же;)

namespace System{class P{static void Main(string[] args){var d=DateTime.Today;if(d.Day==25)if(d.Month>11){Console.Write("Merry Christmas!");return;}throw new Exception();}}}

Альтернативный, негольфированный вариант:

namespace System //In System, so we don't have to use system.
{
    class Program
    {
        static void Main(string[] args) //Main function.
        {
            var d = DateTime.Today; //Get Today.
            if (d.Day == 25) if (d.Month == 12) //Day has to be 25th, Month has to be 12nd.
                {
                    Console.Write("Merry Christmas!"); return; //Prints.
                }
            throw new NotChristmasException(); //Errors/Crashes the program.
        }
    }
    class NotChristmasException : Exception { } //Holiday exception, hooray!
}
devRicher
источник
Не можете ли вы дать программе более короткое имя класса?
Kritixi Lithos
Вы можете удалить некоторые байты, изменив NotChristmasException на более короткий.
Лев
@FishProHD Это NotChristmasExceptionтолько в негольфированном варианте.
devRicher
@KritixiLithos Спасибо, изменил это.
devRicher
1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()Обратите внимание, если заявление и удаление скобок вокруг Console.Writeи заменить returnна else. Кроме того, var d=DateTime.Nowвы можете избавиться от броска исключения, возможно, args[-1];после переименования аргументов в aso a[-1];(это не идентично делению на нули, используемые в других местах)
pinkfloydx33
0

Mathematica, 46 байтов

If[Today[[1,2;;]]=={12,25},"Merry Christmas!"]
Юнг Хван Мин
источник
Nowэкономит 2 байта большеToday
Келли Лоудер
Кроме того, вам нужен сбой в ложном исходе, поэтому я думаю, что-то вроде Quit[]или 1/0должно быть достаточно.
Келли Лоудер,
0

Common Lisp, 140

(let((m(multiple-value-list(decode-universal-time(get-universal-time)))))(if(and(eq(nth 3 m)25)(eq(nth 4 m)12))(write"Merry Christmas")(c)))

Сбой с неопределенной функцией, если дата не верна.

Гарри
источник
0

awk, 29 байт (+ длина ("веселое рождество"))

v=1225==strftime("%m%d")||1/0

Запуск это:

$ echo Merry xmas | awk 'v=1225==strftime("%m%d")||1/0'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: division by zero attempted

Приветствие сезона передается по трубопроводу awk. strftimeвозвращает месяц + день (например 1226), и если он совпадает, 1225 $0запись выводится. Результат сравнения 1225==1226помещается в vпеременную, которая используется для деления 1 в случае неудачного сравнения дат.

Джеймс Браун
источник
0

Хаскелл, 116

Сбой с «Неисчерпывающими шаблонами в функции f», если это не Рождество.

import Data.Time
f(_,12,25)="Merry Christmas"
main=getZonedTime>>=print.f.toGregorian.localDay.zonedTimeToLocalTime

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

Эйвери Глюк
источник
0

C #, 122 104 байта

18 байтов сохранено благодаря @raznagul

using System;i=>{if(DateTime.Now.AddDays(7).DayOfYear==1)Console.Write("Merry Christmas");else{i/=0;};};

Он добавляет 7 дней к текущему дню и проверяет, является ли это первым днем ​​года, если да, он отображает «Счастливого Рождества», в противном случае он делится на ноль.

Хорват Давид
источник
Это returnне обязательно. Используйте iвместо ().
Разнагул
0

Рубин, 69 байт

if Time.now.strftime("%j")=="360";puts "Merry Christmas";else 0/0;end

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

dkudriavtsev
источник
0

ForceLang, 180 байт

set s datetime.toDateString datetime.now()
set t "Dec 25"
def c s.charAt i
def d t.charAt i
set i -1
label 1
set i 1+i
if i=6
 io.write "Merry Christmas!"
 exit()
if c=d
goto 1
z.z

(Помните, что datetime.toDateStringэто зависит от локали, поэтому это может не работать в зависимости от вашей локали)

SuperJedi224
источник
0

командная строка bash, 45 48 49 48 байт

date +%m%d|grep -q 1225&&echo Merry Christmas||!-
date +%m%d|grep -q 1225||!-;echo Merry Christmas

Аналогичен Митчеллу Спектору , но используется grepв режиме без вывода сообщений для проверки на совпадение, затем &&гарантирует, что он печатает только при успехе, и ||заставляет его просматривать историю !-, что дает мне следующее:

-bash: !-: event not found

И это останавливает выполнение, как !- ; echo fooдемонстрирует. В bashдокументации говорится, что это !-nотносится к текущей команде минус n, поэтому, возможно, она интерпретируется как !-0, которая выдает идентичное (и не локализованное) сообщение об ошибке.

Кен Я.Н.
источник
Good idea, but this doesn't crash on days other than Christmas, like it's supposed to, does it?
Mitchell Spector
It now gives an error on failure.
Ken Y-N
1
This prints an error message but it continues; it doesn't actually crash. If you replace the . with ${} then it will actually crash rather simply printing an error message and going on. I think crashing requires that the program be terminated at that point. You can tell that yours doesn't terminate by putting an extra ";echo x" at the end and seeing that it gets executed. (That's why I used ${} instead of . in my answer.) I don't know if there's some 1- or 2-character sequence you can use that will cause an actual crash.
Mitchell Spector
@MitchellSpector: I found a 2 character sequence!
Ken Y-N
And now back to 48 by switching the logic so I can use ; instead of ||.
Ken Y-N