是圣诞节吗?


33

挑战

鉴于圣诞节是:

  • 十二月
  • 第十二个月
  • 第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个字符的Python

规则

规则如下:

  • 假设计算机的时钟总是正确的。
  • 您的代码必须能够随时启动。
  • 您的代码必须"It's Christmas"在圣诞节打印。
  • 循环当然不是必需的,但是一旦开始,您的代码就应该在打印之前停止。
  • 最短的代码胜出。

我想输入的是在公历日期之前,我看到这篇文章
明堂

Answers:



143

Bash,39岁

对于那些等不及的人:

sudo date 12250000
echo It\'s Christmas

这遵循所有规则,尤其是第一个规则。


11
聪明。不是我的意思,而是该死的聪明。
帕特里克·佩里尼

8
“ ...而且,如果计算机的时钟不总是足够正确,请制造它。”好秀!
JB

13
如果您是root用户,则可以保存5个字符。:D
Wug 2012年

29

Unix,39个字节

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

在丹尼斯的帮助下,谢谢您。


这违反了»循环当然不是必需的,但是一旦启动,您的代码就应该在打印之前停止。
乔伊,

我不理解你的批评。您是否声称这是循环?在打印之前就停止了吗?
用户未知

2
使用echo{,} "It\'s Christmas"|at -t12252359,比接受的答案短。(顺便说一下,必须使用反斜杠。)
丹尼斯(Dennis

1
@丹尼斯:大括号扩展很好用。
Joey Adams 2015年

18

PowerShell,45 46个字符

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

它肯定不是很省电,因此笔记本电脑的电池可能会在圣诞节之前就没电了(也许是因为希望有一个新电池)。但是不睡觉肯定会更短

这也是与地区无关的。感谢Jaykul为进一步减少这种情况提供了一个不错的技巧。

稍微滥用规则,45个字符

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

这将打印空白行,直到圣诞节,然后再打印“圣诞节”。

它...

  • ...可以随时启动。
  • ...在圣诞节打印“这是圣诞节”。几次。一整天。(规则没有说明打印频率。)
  • ......不打印“这是圣诞节”上没有圣诞节(虽然它打印在这种情况下,一个空行,可以通过牺牲其他角色进行纠正,但随后这个收益没有在更理智的解决方案上面)。
  • ...永远不会停止(甚至在印有“ It's Christmas”之后,但绝对不会之前)。

2
for(;(date).date-ne“ 12/25”){}“这是圣诞节”#45个字符
Jaykul 2011年

Jaykul:谢谢……这是我从未想过的事情。
乔伊

“滥用”脚本也可以使用-match,并且不使用通配符,以免字符增减。
Iszi 2013年

您可以立即删除滥用行为,这是不必要的。
暴民埃里克

@EriktheGolfer:怎么样?即使它并不短,它仍然提供了一种有趣的替代方法。
乔伊(Joey)2013年

13

Python(36个字符)

本着滥用规则的精神:

  • 绝对在圣诞节打印“这是圣诞节”

  • 如果不是圣诞节,则通过打印“这是圣诞节”来打发时间

    while True:
        print "It's Christmas"
    

2
29个字节:while 1:print"It's Christmas"
Erik the Outgolfer

11

PostScript,90岁

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

不要在打印机上运行,​​它不会打印页面,它只会在圣诞节前对打印机进行DoS处理。再说一次,找回打印机将是一件很不错的礼物。


4
不要忘记在打印机上贴上
乔伊·亚当斯

我想大多数打印机甚至都没有可用的硬件时钟,因为这是一项可选功能。不过非常好:)
Joey


5

Perl,44 岁45

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

GMT时间还不够吗?(关闭3个字符;-)


1until localtime=~/c 25/;会为您节省一个字符。:)
Ilmari Karonen 2011年

我以为我已经尝试过了,但失败了,但事实证明我-E当时确实忘记了。谢谢!
JB

没问题。(请注意,我只是使用反引号而不是localtime下面的方式发布了您的解决方案的一个版本。您可以随意窃取它,但是我认为额外的依赖关系是一个单独的答案。)
Ilmari Karonen 2011年

Naaaw,羞愧对我没有想到的它再次。单独的答案是完全合理的IMO(并赞成)。
JB

5

Perl,45岁

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

Perl,44岁

使用三元运算符(感谢Ilmari Karonen)。

{localtime=~/c 25/?say"It's Christmas":redo}

? :而不是&& ;会节省您一个字符。(而且我会用它say代替die更漂亮的输出。)
Ilmari Karonen

@Ilmari Karonen:谢谢。但是,通过使用say而不是死,脚本永远无法完成。
多托

如果您使用三元运算符,它将成功。
Ilmari Karonen 2011年

@Ilmari Karonen:是的,当然。可能是我太累了!
Toto

5

Javascript,51个字符

这是CPU杀手::

while(!/c 25/.test(Date()));alert("It's Christmas")

4

我想这样做而不解析字符串。随后,我的代码中有很多幻数。

我做了一些近似计算来说明years年。没有人说它必须在12月25日00:00:00正确打印出来!

Perl,80 69 57个字符

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

编辑更简洁的循环!


4

R(47)

while(!grepl("c 25",date())){};"It's Christmas"

3

蟒蛇,66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"

1在第二行的末尾看起来相当可疑我。:P
cjfaure 2014年

@Trimsty:1提供了while循环的主体。基本上是等到12月25日才忙。它的作用与相似while 1:if'c 25'in time.asctime():break
Steven Rumbalski 2014年

嗯,好的,谢谢您的清理。
cjfaure

我想time.ctime()会的。
gnibbler 2014年

@gnibbler:确实会。不错的收获。
Steven Rumbalski 2014年

3

TI-BASIC,42 38

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

期望日期格式为YYYY / MM / DD。

getDate创建一个三元素列表{year,month,day};仅圣诞节时,month ^ 2 + day ^ 2等于769。

字符串使用23个字节,因为小写字母每个都是2个字节,但i作为虚数单位标记显示。


2

批处理文件,共68个字符

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

不能交互式使用,因为它会终止会话。要解决这个问题,还需要5个字符。

也对语言环境敏感。这适用于使用ISO 8601日期格式的语言环境。

但是,嘿,这是一个批处理文件(大多数人甚至都不认为这是一种编程语言)。并且比Javascript短(与Python相当)。


2

Groovy,55岁

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

认为它可行,但仍在等待输出。


如果Groovy的正则表达式与大多数其他语言一样,.*则完全没有必要。(请注意,您可以通过等待12月5日而不是25日来进行测试。)
Ilmari Karonen

1
Ilmari,Groovy是一种JVM语言,默认情况下锚定Java的正则表达式。
乔伊,

1
Ilmari,我会检查一下,但我的程序仍在运行
Armand

2

(pdf)eTeX-仅12月1日至25日为180个字符。

\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只有一种方法可以访问程序启动时的日期以及自启动以来所经过的时间,上限为32768秒,因此我需要计算要等待的秒数,并每秒进行一次循环,等待到达1s并重置时间所用的时间。(准确地说,我正在执行900秒的代码块。)

工作任何一个月都需要更多工作:355个字符。

\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

2

MySQL,180个字符

因为无论如何,您将数据库引擎用于什么?

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();

纵向上竞争不是很好,但是,这是可行的!


尝试DELIMITER /RETURNS TEXTCURDATE()LIKE'%12-25'; 并尝试删除一些空格。
泰特斯


2

PHP,40个字节

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

循环播放至12月25日;然后退出到普通模式并打印。

使用默认设置运行(不显示通知)。


2

8086机器代码,33字节

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

1

Javascript 93 89 78 77个字符

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


@乔伊谢谢!我忘记了。
JiminP 2011年

2
另一个非阻塞版本:setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)61个字符...唯一的缺点是它将alert()在圣诞节全天开放。
大卫·默多克

为什么setInterval要1?setInveral1000*60*60*24这两者都不会使该过程受到影响,并且只会在圣诞节通知一次。
George Mauer 2014年

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");
}

您可能可以在任务中保存两个字符。并通过减少行数来增加数量。
乔伊

我也可以通过使用t.month^12|t.day^25(如果我的优先
棘手怪胎

1

Q,63个字符

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

每年圣诞节都会上班


1

SQL * Plus + PL / SQL-100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • 假设 SERVEROUTPUT ON
  • 比MySql解决方案短(请吃,MySql!)
  • 去年太迟了,但今年赶不上
  • 尝试DBMS_OUTPUT.put代替,DBMS_OUTPUT.put_line但不会打印任何内容。

1

C#(126)

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

为您的电池更好:

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");}}

编辑

第二个版本(“为您的电池充电的尼科尔”)的确存在问题。12月26日至12月 31日我刚想到:P

这两个版本可能会缩短一些。


1

Japt,27字节(非竞争)

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

要测试今天的日期:用c 25本月的最后一个字母(速记)+空格+月中的某天代替。Feb 02==b 02

在线尝试!不竞争是因为Japt比这项挑战要新得多。


1

VBA,58字节

匿名VBE立即窗口功能,无需输入即可运行,直到圣诞节结束,然后输出It's Christmas到VBE立即窗口。

While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"

0

bash-n-date:69个字符:

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

但是它将在12月26日至12月31日失败。


0

Q(60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}

>如果不是圣诞节,则必须以某种方式等到圣诞节,然后打印“这是圣诞节”。
skeevey 2012年

我很抱歉,更正了每秒检查圣诞节的情况。因此,这将在12月25日打印“圣诞节” 86,400次。显然,您可以通过增加计时器(以毫秒为单位)来更改此设置。
sinedcm 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.