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


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)


Как насчет .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];

Кто-нибудь может играть в гольф на 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]]

Вы не можете сохранить байт, используя список вместо кортежа?
— Голубой

@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.

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


Извините за мою маленькую опечатку. Я хотел сказать 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не определено.


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


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

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!
}

Не можете ли вы дать программе более короткое имя класса?
— 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

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 году. Не делает различий между нормальными и високосными годами, возможно, потребуется скорректировать для не високосных лет.


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это зависит от локали, поэтому это может не работать в зависимости от вашей локали)



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