Это Рождество?

33

Вызов

Учитывая, что Рождество это:

  • Декабрь
  • Месяц 12
  • 25 день

Каждый год определяйте сегодняшнюю дату, и будет ли сегодня Рождество. Если это Рождество, вы должны напечатать "It's Christmas". Если это не Рождество, вы должны как-то подождать до Рождества, а затем распечатать "It's Christmas".

пример

Из этого вопроса о переполнении стека

import time
while time.strftime("%b, %d", time.localtime()) != "Dec, 25":
    time.sleep(60)
print "It's Christmas"

Питон в 115 символов

правила

Вот правила:

  • Предположим, что часы компьютера всегда правильные.
  • Ваш код должен быть запущен в любое время.
  • Ваш код должен напечатать "It's Christmas"на Рождество.
  • Циклы, конечно, не нужны, но после запуска ваш код не должен останавливаться, пока не будет напечатан.
  • Самый короткий код выигрывает.
Патрик Перини
источник
Я думал, что ввод в юлианской дате, прежде чем я прочитал этот пост
Ming-Tang

Ответы:

18

Perl + Unix, 40 символов

1until`date`=~/c 25/;say"It's Christmas"

Это то же самое, что и решение Perl от JB , за исключением того, что я сохраняю несколько символов, используя внешнюю dateкоманду вместо Perl localtime.

Илмари Каронен
источник
143

Баш, 39

Для тех, кто просто не может ждать:

sudo date 12250000
echo It\'s Christmas

Это следует всем правилам, особенно первому.

Джои Адамс
источник
11
Умная. Не то, что я имел в виду, но чертовски умный.
Патрик Перини
8
«... и если часы компьютера не всегда правильные, сделайте это». Хорошее шоу!
JB
13
Вы можете сохранить 5 символов, если вы root. : D
Wug
29

Unix, 39 байт

echo{,} "It\'s christmas"|at -t12252359

С помощью Денниса, спасибо за это.

неизвестный пользователь
источник
Это нарушает »Зацикливание определенно не обязательно, но после запуска ваш код не должен останавливаться, пока он не будет напечатан.«
Джои
Я не понимаю вашу критику. Вы утверждаете, что это зацикливание? Что останавливается перед печатью?
пользователь неизвестен
2
Используя echo{,} "It\'s Christmas"|at -t12252359, это короче принятого ответа. (Кстати, обратный слеш требуется.)
Деннис
1
@Dennis: Хорошее использование расширения скобки.
Джои Адамс
18

PowerShell, 45 46 символов

for(;(date).date-ne'12/25'){}"It's Christmas"

Это, конечно, не очень энергоэффективно, поэтому батарея ноутбука может погибнуть до Рождества (возможно, повод пожелать нового). Но не спать определенно короче .

Это также не зависит от региона. И спасибо Jaykul за хороший трюк в сокращении этого в дальнейшем.

Немного нарушая правила, 45 символов

for(){"It's Christmas"*((date)-like'12/25*')}

Это будет печатать пустые строки до Рождества, на котором будет напечатано «Это Рождество».

Это ...

  • ... можно запустить в любое время.
  • ... печатает «Это Рождество» на Рождество. Несколько раз. Целый день (В правилах ничего не сказано о том, как часто это может быть напечатано.)
  • ... не печатает «Это Рождество» в не-Рождество (хотя в этом случае печатается пустая строка; это можно исправить, пожертвовав другим персонажем, но тогда это ничего не даст по сравнению с более вменяемым решением выше).
  • ... никогда не останавливается (даже после того, как напечатано «Это Рождество», но определенно не раньше).
детеныш
источник
2
для (; (дата) .date-ne "12/25") {} "Это Рождество" # 45 символов
Jaykul
Jaykul: Спасибо ... это то, что я никогда бы не подумал, что буду работать.
Джои
«Оскорбительный» сценарий также может использовать -matchи обходиться без подстановочного знака, чтобы не получать прибыль / убыток в символах.
Изи
Вы можете удалить злоупотребление сейчас, это не нужно.
Эрик Outgolfer
@EriktheGolfer: как так? Он по-прежнему предлагает интересный альтернативный подход, хотя и не короче.
Джои,
13

Питон (36 символов)

В духе злоупотребления правилами:

  • Определенно печатает "Это Рождество" на Рождество

  • Если это не Рождество, проведите время, напечатав «Это Рождество»

    while True:
        print "It's Christmas"
    
Попытка
источник
2
29 байт: while 1:print"It's Christmas".
Эрик Outgolfer
11

PostScript, 90

(%Calendar%)currentdevparams begin{Month 12 eq Day 25 eq and{exit}if}loop(It's Christmas)=

Don't run on a printer, it doesn't print a page, and it will only DoS your printer until Christmas day. Then again, getting your printer back would be a nice present.

MrMRDubya
источник
4
Don't forget to tape a sign to the printer saying: DO NOT KILL JOB UNTIL CHRISTMAS!
Joey Adams
I guess most printers won't even have a working hardware clock as that's an optional feature. Very nice, though :)
Joey
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Mr.Wizard
источник
5

Perl, 44 45

perl -E'1until localtime=~/c 25/;say"It's Christmas"'

Wouldn't GMT time be sufficient? (3 characters off ;-)

J B
источник
1until localtime=~/c 25/; would save you one char. :)
Ilmari Karonen
I thought I'd already tried that and it failed, but it turns out I actually forgot -E at the time. Thanks!
J B
No problem. (Ps. I just posted a version of your solution using backticks instead of localtime below. Feel free to steal it if you like, but I felt the extra dependency justified a separate answer.)
Ilmari Karonen
Naaaw, shame's on me for not thinking of it again. The separate answer is perfectly justified IMO (and upvoted).
J B
5

Perl, 45

{localtime=~/c 25/&&die"It's Christmas";redo}

Perl, 44

using ternary operator (Thanks to Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
источник
? : instead of && ; would save you one char too. (And I'd use say instead of die for prettier output.)
Ilmari Karonen
@Ilmari Karonen: thanks. But by using say instead of die, the script never finish.
Toto
It will, if you use the ternary operator.
Ilmari Karonen
@Ilmari Karonen: yes, of course. May be i'm too tired !!!
Toto
5

Javascript, 51 chars

It's a CPU killer:

while(!/c 25/.test(Date()));alert("It's Christmas")
David Murdoch
источник
4

I wanted to do this without parsing strings. Subsequently, there's a lot of magic numbers in my code.

I did some approximation to account for leap years. No one said that it had to print it out right on 00:00:00, Dec. 25!

Perl, 80 69 57 characters

{(time-30931200)%31557600<86399?die"It's Christmas":redo}

Edited for more concise looping!

Ben Richards
источник
4

R (47)

while(!grepl("c 25",date())){};"It's Christmas"
zx8754
источник
3

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
источник
That 1 at the end of the second line looks quite suspicious to me. :P
cjfaure
@Trimsty: The 1 provides a body for the while-loop. It's basically a busy wait until December 25. It has the similar effect to while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, okay, thanks for clearing that up.
cjfaure
I think time.ctime() would do.
gnibbler
@gnibbler: Indeed it would. Nice catch.
Steven Rumbalski
3

TI-BASIC, 42 38

Repeat 769=sum(getDate²,2
End
"It's Christmas

Expects the date format to be YYYY/MM/DD.

getDate creates a three-element list {year,month,day}; only on Christmas is month^2 + day^2 equal to 769.

23 bytes are used for the string because lowercase letters are two bytes each, except for i which is displayed as the imaginary unit token.

lirtosiast
источник
2

Batch file, 68 chars

:l
@date/t|findstr/c:"-12-25">nul&&echo It's Christmas&&exit
@goto l

Not usable interactively, as it kills the session. Solving that would require 5 more characters.

Also locale-sensitive. This works on my locale which uses ISO 8601 date format.

But hey, it's a batch file (by most not even regarded as a programming language). And shorter than Javascript (and on par with Python).

Joey
источник
2

Groovy, 55

while(!new Date()==~/.*c 25.*/);
println"It's Christmas"

Think it works, but still waiting for output.

Armand
источник
If Groovy's regexps are anything like in most other languages, those .* are entirely unnecessary. (Ps. You can test it by waiting for Dec 5 instead of 25.)
Ilmari Karonen
1
Ilmari, Groovy is a JVM language and Java's regexes are anchored by default.
Joey
1
Ilmari, I'd check but my program is still running
Armand
2

(pdf)eTeX - 180 chars only December 1-25.

\lccode`m`~\let\e\expandafter\def~{\ifdim900pt<\pdfelapsedtime
sp\pdfresettimer\else\e~\fi}\lowercase\e{\e\scantokens\e
{\romannumeral\numexpr (25 - \day)*96000}}It's Christmas!\bye

TeX only has a way to access the date when the program starts, and the time elapsed since the start, capped at 32768 seconds, so I need to compute the number of seconds to wait, and for each second do a loop which waits for the elapsed time to reach 1s and reset the time. (Precisely, I'm doing blocks of 900 seconds.)

Working for any month requires more work: 355 chars.

\lccode`m=`~\let\o\or\let\y\year\let\n\numexpr\let\e\expandafter
\def\b#1{\ifnum#1=\n(#1/4)*4\relax+1\fi}\def~{\ifdim
900pt<\pdfelapsedtime sp\pdfresettimer\else\e~\fi}\lowercase
\e{\e\scantokens\e{\romannumeral\n(25-\day+\ifcase\month\o334\b\y
\o303\b\y\o275\o244\o214\o183\o153\o122\o91\o61\o30\o0\ifnum25<\day
365\b{\n\y+1}\fi\fi)*96000}}It's Christmas!\bye
Bruno Le Floch
источник
2

MySQL, 180 chars

Because what are you using your database engine for, anyway?

DELIMITER $$
CREATE FUNCTION c() RETURNS CHAR(14) BEGIN a: LOOP IF DAY(NOW())=25 && MONTH(NOW())=12 THEN RETURN 'It\'s Christmas'; END IF; END LOOP a; END$$
DELIMITER ;
SELECT c();

Not very competitive lengthwise, but hey, it's doable!

TehShrike
источник
Try DELIMITER /, RETURNS TEXT and CURDATE()LIKE'%12-25'; and try to remove some whitespace.
Titus
2

Ruby, 53

until Time.now.to_s=~/c 25/
end
puts"It's Christmas!"
Steven Rumbalski
источник
2

PHP, 40 bytes

<?while(date(dm)-1225);?>It´s Christmas;

Loop until 25th of December; then exit to plain mode and print.

Run with default settings (don´t display notices).

Titus
источник
2

8086 machine code, 33 bytes

00000000  b4 2a cd 21 81 fa 19 0c  75 f6 b4 09 ba 12 01 cd  |.*.!....u.......|
00000010  21 c3 49 74 27 73 20 43  68 72 69 73 74 6d 61 73  |!.It's Christmas|
00000020  24                                                |$|
00000021
user5434231
источник
1

Javascript, 93 89 78 77 chars

function x(){Date().match("c 25")?alert("It's Christmas"):setTimeout(x,1)}x()

JiminP
источник
@Joey Thanks! I forgot about that.
JiminP
2
Another non-blocking version: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9) at 61 chars ... the only drawback is that it will alert() all day on Christmas.
David Murdoch
Why setInterval to 1? setInveral to 1000*60*60*24 and it both won't make the process suffer and will notify only once on christmas.
George Mauer
1

D, 130

import std.datetime,std.stdio;
main(){
do{
auto t = Clock.currTime();
}while(t.month!=12||t.day!=25);
writeln("It's Christmas");
}
ratchet freak
источник
You can probably save two characters in the assignment. And a few more by reducing the number of lines.
Joey
I can also save some by using t.month^12|t.day^25 (if I get my priorities right)
ratchet freak
1

Q, 63 chars

system"t 1000";.z.ts:{$["12.25"~-5#-3!.z.d;1"It's Christmas";]}

will work for christmas day on every year

tmartin
источник
1

SQL*Plus + PL/SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Assuming SERVEROUTPUT ON
  • Shorter then the MySql solution (eat that, MySql!)
  • Too late for last year, but in time for this year
  • Tried DBMS_OUTPUT.put instead of DBMS_OUTPUT.put_line but that doesn't print anything.
SQB
источник
1

C# (126)

using System;class P{static void Main(){while(DateTime.Now.Date.ToString("Md")!="1225");Console.WriteLine("It's Christmas");}}

Nicer for your battery:

C# (163)

using s=System;class P{static void Main(){s.Threading.Thread.Sleep(s.DateTime.ParseExact("1225","Md",null)-s.DateTime.Now);s.Console.WriteLine("It's Christmas");}}

edit

The second ("nicer for your battery") version does have a bit of an issue dec. 26th to dec. 31st I just thought of :P

Both versions can probably be shortened a bit more.

RobIII
источник
1

Japt, 27 bytes (non-competing)

Ks f"c 25" ?`It's CËItµs`:P

To test against today's date : Replace c 25 with this month's last letter (shorthand) + space + day of the month. Feb 02 == b 02

Try it online! Non-competing because Japt is far newer than this challenge.

Oliver
источник
1

VBA, 58 Bytes

Anonymous VBE immediates window function that takes no input and runs until it's Christmas day, at which time it outputs It's Christmas to the VBE immediates window.

While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"
Taylor Scott
источник
0

bash-n-date: 69 chars:

sleep $(($(date -d"12/25" +%s)-$(date +%s))) && echo "It's X-Ray    "

But it will fail on Dec. 26th to Dec. 31th.

user unknown
источник
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
источник
> If it is not Christmas, you must somehow wait until Christmas and then print "It's Christmas".
skeevey
My apologies, corrected to check every second if it's Christmas...so this will print "It's Christmas" 86,400 times every 25th December. Obviously you can alter this by increasing the timer, which is in milliseconds.
sinedcm