มันเป็นคริสมาสต์?


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"

Python จำนวน 115 ตัวอักษร

กฎระเบียบ

นี่คือกฎ:

  • สมมติว่านาฬิกาของคอมพิวเตอร์นั้นถูกต้องเสมอ
  • รหัสของคุณจะต้องสามารถเริ่มต้นได้ตลอดเวลา
  • รหัสของคุณจะต้องพิมพ์"It's Christmas"ในวันคริสต์มาส
  • การวนซ้ำนั้นไม่จำเป็น แต่เมื่อเริ่มรหัสของคุณแล้วไม่ควรหยุดจนกว่าจะพิมพ์ออกมา
  • รหัสที่สั้นที่สุดชนะ

ฉันคิดว่าอินพุตอยู่ในวันที่จูเลียนก่อนที่ฉันจะอ่านโพสต์นี้
Ming-Tang

คำตอบ:



143

Bash, 39

สำหรับผู้ที่รอไม่ไหว:

sudo date 12250000
echo It\'s Christmas

สิ่งนี้เป็นไปตามกฎทั้งหมดโดยเฉพาะกฎข้อแรก


11
ฉลาด. ไม่ใช่สิ่งที่ฉันหมายถึง แต่เป็นคนฉลาด
Patrick Perini

8
“ ... และถ้านาฬิกาของคอมพิวเตอร์ยังไม่เพียงพอให้ทำเลย” โชว์ดีมาก!
JB

13
คุณสามารถบันทึกได้ 5 ตัวอักษรหากคุณรูท : D
Wug

29

Unix, 39 ไบต์

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

ด้วยความช่วยเหลือจาก Dennis ขอขอบคุณสำหรับสิ่งนั้น


การกระทำนี้เป็นการละเมิด»การวนรอบนั้นไม่จำเป็นอย่างแน่นอน แต่เมื่อเริ่มต้นรหัสของคุณแล้วไม่ควรหยุดจนกว่าจะได้มีการพิมพ์«แม้ว่า
Joey

ฉันไม่เข้าใจคำวิจารณ์ของคุณ คุณอ้างว่านี่เป็นการวนซ้ำหรือไม่? หยุดก่อนที่จะพิมพ์หรือไม่
ผู้ใช้ไม่รู้จัก

2
ใช้echo{,} "It\'s Christmas"|at -t12252359นี่สั้นกว่าคำตอบที่ยอมรับ (ต้องใช้แบ็กสแลชตามวิธี)
Dennis

1
@Dennis: การใช้การขยายรั้งดี
Joey Adams

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
สำหรับ (; (วันที่) .date-ne "12/25") {} "It's Christmas" # 45 chars
Jaykul

Jaykul: ขอบคุณ ... นั่นเป็นสิ่งที่ฉันไม่เคยคิดจะได้ทำงานมาก่อน
Joey

สคริปต์ "ที่ไม่เหมาะสม" สามารถใช้-matchและทำได้โดยไม่ต้องใช้สัญลักษณ์แทนเพื่อไม่ให้ได้รับ / สูญเสียอักขระ
Iszi

คุณสามารถลบการละเมิดได้ในตอนนี้มันไม่จำเป็น
Erik the Outgolfer

@EriktheGolfer: เป็นอย่างไร มันยังคงเสนอวิธีการทางเลือกที่น่าสนใจแม้ว่ามันจะไม่สั้น
Joey

13

Python (36 ตัวอักษร)

ด้วยจิตวิญญาณแห่งการใช้กฎที่ไม่เหมาะสม:

  • พิมพ์ "It's Christmas" อย่างแน่นอนในวันคริสต์มาส

  • หากไม่ใช่คริสต์มาสให้ผ่านเวลาโดยพิมพ์ "It's Christmas"

    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 Adams

ฉันเดาว่าเครื่องพิมพ์ส่วนใหญ่จะไม่มีนาฬิกาฮาร์ดแวร์ที่ใช้งานได้เนื่องจากเป็นคุณสมบัติเสริม แม้ว่าจะดีมาก :)
Joey


5

Perl, 44 45

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

เวลา GMT จะไม่เพียงพอหรือไม่ (ปิด 3 ตัว ;-)


1until localtime=~/c 25/;จะช่วยคุณประหยัดหนึ่งคน :)
Ilmari Karonen

ฉันคิดว่าฉันได้ลองไปแล้วและมันก็ล้มเหลว แต่มันกลับกลายเป็นว่าฉันลืมไป-Eแล้ว ขอบคุณ!
JB

ไม่มีปัญหา. (สดุดีฉันเพิ่งโพสต์รุ่นโซลูชันของคุณโดยใช้ backticks แทนlocaltimeด้านล่างอย่าลังเลที่จะขโมยถ้าคุณชอบ แต่ฉันรู้สึกว่าการพึ่งพาพิเศษเป็นเหตุผลที่เหมาะสมสำหรับคำตอบที่แยกต่างหาก)
Ilmari Karonen

Naaaw อับอายเป็นอยู่ที่ผมไม่ได้คิดว่ามันอีกครั้ง คำตอบที่แยกต่างหากนั้นเป็นธรรม IMO อย่างสมบูรณ์ (และ upvoted)
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

@Ilmari Karonen: ใช่แน่นอน อาจจะเหนื่อยเกินไป !!!
โตโต้


4

ฉันต้องการทำสิ่งนี้โดยไม่ต้องแยกสตริง ต่อจากนั้นมีจำนวนเวทย์มนตร์จำนวนมากในรหัสของฉัน

ฉันได้ประมาณบางบัญชีสำหรับปีอธิกสุรทิน ไม่มีใครพูดว่ามันต้องพิมพ์ออกมาตอน 00:00:00 น. วันที่ 25 ธันวาคม!

Perl, 80 69 57 ตัวอักษร

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

แก้ไขเพื่อการวนซ้ำที่กระชับยิ่งขึ้น!



3

Python, 66 68

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

ว่า1ที่ท้ายบรรทัดที่สองมีลักษณะค่อนข้างน่าสงสัยให้ฉัน : P
cjfaure

@Trimsty: การ1จัดเตรียมเนื้อหาสำหรับ while-loop มันเป็นพื้นรอว่างจนถึงวันที่ 25 while 1:if'c 25'in time.asctime():breakธันวาคมจะมีผลคล้ายกับ
Steven Rumbalski

อ่าโอเคขอบคุณสำหรับการล้างข้อมูล
cjfaure

ฉันคิดว่าtime.ctime()จะทำ
gnibbler

@gnibbler: แน่นอนมันจะ รับได้สวย.
Steven Rumbalski

3

TI-BASIC, 42 38

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

คาดว่ารูปแบบวันที่จะเป็น YYYY / MM / DD

getDate สร้างรายการสามองค์ประกอบ{year,month,day}; เฉพาะวันคริสต์มาสคือเดือน ^ 2 + วัน ^ 2 เท่ากับ 769

23 ไบต์ใช้สำหรับสตริงเนื่องจากตัวอักษรพิมพ์เล็กมีสองไบต์แต่ละตัวยกเว้น 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"

คิดว่ามันใช้งานได้ แต่ยังคงรอผลลัพธ์


หาก regexps ของ Groovy นั้นเป็นภาษาอื่น ๆ ส่วนใหญ่.*จะไม่จำเป็นเลย (สดุดีคุณสามารถทดสอบโดยรอ 5 ธ.ค. แทน 25)
Ilmari Karonen

1
Ilmari, Groovy เป็นภาษา JVM และ regexes ของ Java จะถูกยึดตามค่าเริ่มต้น
Joey

1
สวัสดีฉันต้องการตรวจสอบ แต่โปรแกรมของฉันยังคงทำงานอยู่
Armand

2

(pdf) eTeX - 180 ตัวอักษรเท่านั้นวันที่ 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 มีวิธีเข้าถึงวันที่เมื่อโปรแกรมเริ่มทำงานเท่านั้นและเวลาที่ผ่านไปนับตั้งแต่เริ่มต้นถูก จำกัด ที่ 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();

ไม่ใช่การแข่งขันที่ยาวมากนัก แต่เดี๋ยวก่อนมันทำได้!


Try DELIMITER /, RETURNS TEXT and CURDATE()LIKE'%12-25'; and try to remove some whitespace.
Titus


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


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

1

Javascript, 93 89 78 77 chars

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


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

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

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.

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.


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.


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"


0

Q (60)

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

> 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.