Веселі гольфми, всі!


35

Всім Різдво, і ось виклик для гольфу з кодовим колом. Потрібно скласти програму для друку подарунка. Зокрема, слова "З Різдвом Христовим". АЛЕ, є улов: ця програма повинна працювати лише у тому випадку, якщо вона відбудеться 25 грудня. Якщо код запускається в будь-який інший день, програма повинна вийти з ладу.

Це Code-Golf, тому відповідь з найменшою кількістю байтів виграє.

Щасливого Різдва!


5
Так, це було добре. .. так, 25-а шкода
Лев


3
Голфі Кодеми ! :)
Луїс Мендо

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
Синій

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"?
Conor O'Brien

@ ConorO'Brien Дякую! Це розумно :)
Kritixi Lithos

@ETHproductions Я не можу придумати жодного дня чи місяця, який закінчується c( Octнаближається, але все ще не задовольняє регулярний вираз). Дякую за пораду!
Kritixi Lithos

Результат Date()повністю залежить від реалізації. Наприклад, я очікую, що він буде залежати від мови та місця роботи машини.
Оріол

@Oriol Тоді я вкажу браузер у своїй відповіді
Kritixi Lithos

5

Python 3, 66 63 байт

Завдяки ідеям відповідей JavaScript / ES тут мені вдалося видавити кілька байт. Індексуйте словник - неіснуючі ключі піднімуть a KeyError. Наступний код працює в локальному часовому поясі

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

Формат виводу для ctimeне залежить від локалі - формат завжди ~ 'Sun Dec 25 19:23:05 2016'. Оскільки лише в грудні закінчується 3-літерне абревіатурне закінчення c, його тут безпечно використовувати 'c 25'in time.ctime().


Попередня версія:

Це працює в часовому поясі UTC. Для місцевого часового поясу потрібно s/gm/localще 3 байти. Для Python 2 можна видалити дужки з об'ємом print65 байт.

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)

Це аварія в інші дні (це належить)?
Ерресен

2
Я не можу змусити цей запускатись, оскільки він заперечує кортеж як ключ. Спробуйте в Інтернеті! . Якщо змінити його import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]і позначати його Python 2, це ще 66 байт і виходить з ладу з KeyError на інші дати, ніж 25 грудня
ElPedro

@ElPedro oops: 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-1225це 1121.
Тит

4

Python 2 , 68 67 65 байт

-1 завдяки @muddyfish

Дякуємо @AnttiHaapala за ідею, яка врятувала ще одну пару.

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

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

Викидає IndexError, якщо не 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 Ага, правда, нерозумна помилка. Тепер виправлено.
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! Хороший перший пост, хоча Java не зовсім коротка.
Rɪᴋᴇʀ

1
Ви можете змінити Calendarдля *і зберегти кілька байтів. Ви також можете скоротити назву argsпараметра в основному методі, я думаю ...
Даніель Грей

@Daniel Grey, Ви абсолютно праві, дякую!
Боніфасіо

1
Ласкаво просимо! Ви можете зберегти 10 байт, якщо замінити "public class" на "інтерфейс" та видалити загальнодоступний модифікатор з основного, зробивши його "інтерфейсом {статичним недійсним основним ..." Це, однак, не дозволить 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 це робить зараз.
steenbergh

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 Сценарій 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 Я не можу використовувати інтерполяцію рядків для CS Script :(
Erresen

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, 96 байт, в основному плагіат з Ерресена

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 байтам .
Кен ІН

1
@ KenY-N Помилка навмисна: програма повинна виходити з ладу в інші дні, крім Різдва. Дякую за те, що ви згадали, що цитати в луні можна скинути; Я пропустив це.
Мітчелл Спектор

На жаль, пропустили цю вимогу! Перевірено, змінивши рядок дати, і тепер я бачу, що він не виходить з ладу. Видалили свою відповідь ... Але у мене є альтернатива, тому дозвольте її оновити.
Кен ІН

Спробуйте замінити ${}на, !-щоб побити мене одним байтом. Я підтримаю вас, коли ви переможете.
Кен ІН

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

Пітон 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 для вказівки на видалення товстих кольорів з функції стрипінгу


1
Це означає розбитися, якщо це не Різдво, це просто нормально.
FlipTack

Ви можете зберегти 2 байти видалення колонів -> '% d% м' == '2512'
Макс

@Max ОК, дякую за пораду. Я раніше не використовував цю функцію, тому не думав це робити
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 байт завдяки Крітіксі Літос, знову ж таки;)

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];після перейменування аргументів на aтак a[-1];(це так не ідентично ділити на нулі, що використовуються в іншому місці)
pinkfloydx33

0

Математика, 46 байт

If[Today[[1,2;;]]=={12,25},"Merry Christmas!"]

Nowекономить 2 байти більшеToday
Келлі Лоудер

Крім того, вам потрібен збій у помилковому результаті, тому я думаю, що щось подібне Quit[]або 1/0повинно вистачити.
Келлі Лоудер

0

Загальний Лісп, 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розміщується на vvar, який використовується для ділення 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замість ().
raznagul

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, що дає ідентичне (і не локалізоване) повідомлення про помилку.


Гарна ідея, але це не руйнується в інші дні, крім Різдва, як це належить, чи не так?
Мітчелл Спектор

Тепер це дає помилку при відмові.
Кен ІН

1
Це друкує повідомлення про помилку, але воно продовжується; він насправді не виходить з ладу. Якщо ви заміните. з $ {} тоді воно фактично завершиться, а просто надрукує повідомлення про помилку та продовжить роботу. Я думаю, що в результаті краху потрібне припинення програми в цей момент. Ви можете сказати, що ваше не закінчується, поставивши в кінці додатковий "; echo x" і побачивши, що воно виконується. (Ось чому я використовував $ {} замість. У своїй відповіді.) Я не знаю, чи є якась послідовність 1 або 2 символів, яку ви можете використати, що призведе до фактичного збою.
Мітчелл Спектор

@MitchellSpector: Я знайшов послідовність з 2 символів!
Кен ЙН

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