Có phải là Giáng sinh?


33

Thử thách

Cho rằng Giáng sinh là:

  • Tháng 12
  • Tháng 12
  • Ngày 25

Hàng năm, xác định ngày hôm nay, và hôm nay có hay không là Giáng sinh. Nếu là Giáng sinh, bạn phải in "It's Christmas". Nếu không phải là Giáng sinh, bằng cách nào đó bạn phải đợi đến Giáng sinh và sau đó in "It's Christmas".

Thí dụ

Từ câu hỏi tràn ngăn xếp này

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

Python trong 115 ký tự

Quy tắc

Đây là các quy tắc:

  • Giả sử rằng đồng hồ của máy tính luôn luôn đúng.
  • Mã của bạn phải có thể được bắt đầu bất cứ lúc nào.
  • Mã của bạn phải in "It's Christmas"vào Giáng sinh.
  • Vòng lặp chắc chắn là không cần thiết, nhưng một khi đã bắt đầu, mã của bạn không nên dừng lại cho đến khi nó được in.
  • Mã ngắn nhất sẽ thắng.

Tôi nghĩ đầu vào là vào ngày Julian trước khi tôi đọc bài đăng này
Ming-Tang

Câu trả lời:


18

Perl + Unix, 40 ký tự

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

Điều này giống như giải pháp Perl của JB , ngoại trừ việc tôi lưu một vài ký tự bằng cách sử dụng datelệnh bên ngoài thay vì của Perl localtime.


143

Bash, 39

Đối với những người không thể chờ đợi:

sudo date 12250000
echo It\'s Christmas

Điều này tuân theo tất cả các quy tắc, đặc biệt là quy tắc đầu tiên.


11
Tài giỏi. Không phải ý tôi, nhưng thông minh chết tiệt.
Patrick Perini

8
Câm ... và nếu đồng hồ của máy tính không phải lúc nào cũng đủ, hãy làm cho nó.
JB

13
Bạn có thể lưu 5 ký tự nếu bạn root. : D
Wug

29

Unix, 39 byte

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

Với sự giúp đỡ từ Dennis, cảm ơn vì điều đó.


Điều này vi phạm »Looping chắc chắn là không cần thiết, nhưng một khi đã bắt đầu, mã của bạn không nên dừng lại cho đến khi nó được in.«, Mặc dù vậy.
Joey

Tôi không hiểu bài phê bình của bạn. Bạn có khẳng định đây là vòng lặp? Rằng nó dừng lại trước khi in?
người dùng không xác định

2
Sử dụng echo{,} "It\'s Christmas"|at -t12252359, điều này ngắn hơn câu trả lời được chấp nhận. (Nhân tiện, dấu gạch chéo ngược được yêu cầu.)
Dennis

1
@Dennis: Đẹp sử dụng mở rộng niềng răng.
Joey Adams

18

PowerShell, 45 46 ký tự

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

Nó chắc chắn không hiệu quả về năng lượng, vì vậy pin máy tính xách tay có thể chết trước Giáng sinh (lý do để ước một cái mới, có thể). Nhưng không ngủ là chắc chắn ngắn hơn .

Đây cũng là thuyết địa phương. Và cảm ơn Jaykul vì một mẹo hay trong việc giảm điều này hơn nữa.

Lạm dụng các quy tắc một chút, 45 ký tự

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

Điều này sẽ in các dòng trống cho đến Giáng sinh, sau đó nó sẽ in ra Đó là Giáng Sinh.

Nó ...

  • ... Có thể được bắt đầu bất cứ lúc nào.
  • ... In ấn Đó là Giáng Sinh vào ngày Giáng sinh. Vài lần. Cả ngày dài. (Các quy tắc không nói bất cứ điều gì về tần suất có thể được in.)
  • ... không in Giáng Sinh vào Giáng Sinh vào ngày Giáng sinh (mặc dù nó in một dòng trống trong trường hợp đó; có thể được sửa chữa bằng cách hy sinh một nhân vật khác, nhưng sau đó điều này không thu được gì qua giải pháp lành mạnh hơn ở trên).
  • ... không bao giờ dừng lại (ngay cả sau khi nó đã in ra Đây là Giáng Sinh nhưng chắc chắn không phải trước đó).

2
cho (; (ngày) .date-ne "12/25") {} "Đó là Giáng sinh" # 45 ký tự
Jaykul

Jaykul: Cảm ơn ... đó là điều mà tôi chưa bao giờ nghĩ sẽ làm việc.
Joey

Kịch bản "lạm dụng" cũng có thể sử dụng -matchvà thực hiện mà không có ký tự đại diện, không có được / mất ký tự.
Iszi

Bạn có thể loại bỏ lạm dụng ngay bây giờ, nó không cần thiết.
Erik the Outgolfer

@EriktheGolfer: Làm sao vậy? Nó vẫn cung cấp một cách tiếp cận thay thế thú vị, mặc dù nó không ngắn hơn.
Joey

13

Con trăn (36 ký tự)

Trong tinh thần lạm dụng các quy tắc:

  • Chắc chắn in "Đó là Giáng sinh" vào Giáng sinh

  • Nếu không phải là Giáng sinh, hãy dành thời gian bằng cách in "Đó là Giáng sinh"

    while True:
        print "It's Christmas"
    

2
29 byte : 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)=

Đừng chạy trên máy in, nó không in một trang và nó sẽ chỉ làm máy in của bạn cho đến ngày Giáng sinh. Sau đó, một lần nữa, nhận được máy in của bạn trở lại sẽ là một món quà tốt đẹp.


4
Đừng quên ghi một dấu hiệu vào máy in với nội dung: ĐỪNG GIẾT CÔNG VIỆC UNTIL CHRISTMAS!
Joey Adams

Tôi đoán hầu hết các máy in thậm chí sẽ không có đồng hồ phần cứng hoạt động vì đó là một tính năng tùy chọn. Mặc dù vậy, rất tốt :)
Joey


5

Perl, 44 45

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

Thời gian GMT sẽ không đủ? (Tắt 3 ký tự ;-)


1until localtime=~/c 25/;sẽ tiết kiệm cho bạn một char. :)
Ilmari Karonen

Tôi nghĩ rằng tôi đã thử điều đó và nó đã thất bại, nhưng hóa ra lúc đó tôi thực sự đã quên mất -E. Cảm ơn!
JB

Không vấn đề gì. (Ps. Tôi vừa đăng một phiên bản giải pháp của bạn bằng cách sử dụng backticks thay vì localtimebên dưới. Hãy thoải mái ăn cắp nó nếu bạn thích, nhưng tôi cảm thấy sự phụ thuộc thêm đã biện minh cho một câu trả lời riêng biệt.)
Ilmari Karonen

Naaaw, xấu hổ vì tôi đã không nghĩ về nó một lần nữa . Câu trả lời riêng biệt hoàn toàn hợp lý IMO (và được nâng cấp).
JB

5

Perl, 45

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

Perl, 44

sử dụng toán tử ternary (Cảm ơn Ilmari Karonen).

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

? :thay vì && ;sẽ tiết kiệm cho bạn một char quá. (Và tôi sẽ sử dụng saythay vì diecho đầu ra đẹp hơn.)
Ilmari Karonen

@Ilmari Karonen: cảm ơn. Nhưng bằng cách sử dụng saythay vì chết, kịch bản không bao giờ kết thúc.
Toto

Nó sẽ, nếu bạn sử dụng toán tử ternary.
Ilmari Karonen

@Ilmari Karonen: vâng, tất nhiên. Có thể tôi quá mệt mỏi !!!
Toto

5

Javascript, 51 ký tự

Đó là một kẻ giết CPU:

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

4

Tôi muốn làm điều này mà không cần phân tích chuỗi. Sau đó, có rất nhiều số ma thuật trong mã của tôi.

Tôi đã làm một số xấp xỉ để tính cho năm nhuận. Không ai nói rằng nó phải in ra ngay vào 00:00:00, ngày 25/12!

Perl, 80 69 57 ký tự

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

Chỉnh sửa cho vòng lặp ngắn gọn hơn!


4

R (47)

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

3

Con trăn, 66 68

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

Điều đó 1ở cuối dòng thứ hai có vẻ khá đáng ngờ đối với tôi. : P
cjfaure

@Trimsty: 1Cung cấp một cơ thể cho vòng lặp while. Về cơ bản, đó là một sự chờ đợi bận rộn cho đến ngày 25 tháng 12. Nó có tác dụng tương tự while 1:if'c 25'in time.asctime():break.
Steven Rumbalski

À, được rồi, cảm ơn vì đã xóa nó đi.
cjfaure

Tôi nghĩ rằng time.ctime()sẽ làm.
gnibbler

@gnibbler: Thật vậy. Bắt đẹp.
Steven Rumbalski

3

TI-BASIC, 42 38

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

Dự kiến ​​định dạng ngày là YYYY / MM / DD.

getDate tạo danh sách ba yếu tố {year,month,day}; chỉ vào Giáng sinh là tháng ^ 2 + ngày ^ 2 bằng 769.

23 byte được sử dụng cho chuỗi vì các chữ cái thường có hai byte, ngoại trừ i được hiển thị dưới dạng mã thông báo đơn vị tưởng tượng.


2

Tập tin hàng loạt, 68 ký tự

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

Không thể sử dụng tương tác, vì nó giết chết phiên. Việc giải quyết đó sẽ cần thêm 5 ký tự.

Cũng nhạy cảm với miền địa phương. Điều này hoạt động trên ngôn ngữ của tôi sử dụng định dạng ngày ISO 8601.

Nhưng này, đó là một tệp bó (bởi hầu hết thậm chí không được coi là ngôn ngữ lập trình). Và ngắn hơn Javascript (và ngang bằng với Python).


2

Groovy, 55

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

Nghĩ rằng nó hoạt động, nhưng vẫn chờ đầu ra.


Nếu regexps của Groov giống như trong hầu hết các ngôn ngữ khác, thì những ngôn ngữ đó .*hoàn toàn không cần thiết. (Ps. Bạn có thể kiểm tra nó bằng cách đợi ngày 5 tháng 12 thay vì 25.)
Ilmari Karonen

1
Ilmari, Groovy là ngôn ngữ JVM và các biểu thức của Java được neo theo mặc định.
Joey

1
Ilmari, tôi sẽ kiểm tra nhưng chương trình của tôi vẫn đang chạy
Armand

2

(pdf) eTeX - 180 ký tự chỉ từ 1-25 tháng 12.

\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 chỉ có cách truy cập ngày khi chương trình bắt đầu và thời gian trôi qua kể từ khi bắt đầu, giới hạn ở mức 32768 giây, vì vậy tôi cần tính số giây để chờ và cứ mỗi giây lại thực hiện một vòng lặp chờ thời gian trôi qua để đạt 1svà thiết lập lại thời gian. (Chính xác, tôi đang thực hiện các khối 900 giây.)

Làm việc cho bất kỳ tháng nào đòi hỏi nhiều công việc hơn: 355 ký tự.

\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 ký tự

Bởi vì bạn đang sử dụng công cụ cơ sở dữ liệu của bạn để làm gì?

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

Không phải là rất cạnh tranh theo chiều dọc, nhưng hey, nó có thể làm được!


Hãy thử DELIMITER /, RETURNS TEXTCURDATE()LIKE'%12-25'; và cố gắng loại bỏ một số khoảng trắng.
Tít


2

PHP, 40 byte

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

Vòng lặp đến ngày 25 tháng 12; sau đó thoát sang chế độ đơn giản và in.

Chạy với cài đặt mặc định (thông báo hiển thị dont).


2

Mã máy 8086, 33 byte

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 ký tự

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


@ Xin cảm ơn! Tôi quên mất điều đó.
JiminP

2
Một phiên bản không chặn khác: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)ở 61 ký tự ... nhược điểm duy nhất là nó sẽ hoạt động alert()cả ngày vào Giáng sinh.
David Murdoch

Tại sao setIntervalđến 1? setInveralđể 1000*60*60*24và nó cả hai sẽ không làm cho quá trình đau khổ và sẽ thông báo chỉ một lần vào Giáng sinh.
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");
}

Bạn có thể có thể lưu hai ký tự trong bài tập. Và một vài điều nữa bằng cách giảm số lượng dòng.
Joey

Tôi cũng có thể tiết kiệm một số bằng cách sử dụng t.month^12|t.day^25(nếu tôi nhận được các ưu tiên của mình ngay)
ratchet freak

1

Q, 63 ký tự

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

sẽ làm việc cho ngày Giáng sinh hàng năm


1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Giả định SERVEROUTPUT ON
  • Sau đó, giải pháp MySql ngắn hơn (ăn cái đó, MySql!)
  • Quá muộn cho năm ngoái, nhưng trong thời gian cho năm nay
  • Đã thử DBMS_OUTPUT.putthay vì DBMS_OUTPUT.put_linenhưng điều đó không in bất cứ điều gì.

1

C # (126)

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

Nicer cho pin của bạn:

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

chỉnh sửa

Phiên bản thứ hai ("đẹp hơn cho pin của bạn") có một chút vấn đề. Ngày 26 tháng 12 Ngày 31 tôi mới nghĩ đến: P

Cả hai phiên bản có thể được rút ngắn thêm một chút.


1

Japt , 27 byte (không cạnh tranh)

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

Để kiểm tra ngày hôm nay: Thay thế c 25bằng chữ cái cuối cùng của tháng này (tốc ký) + dấu cách + ngày trong tháng. Feb 02==b 02

Hãy thử trực tuyến! Không cạnh tranh vì Japt mới hơn nhiều so với thử thách này.


1

VBA, 58 byte

VBE ẩn danh chức năng cửa sổ không có đầu vào và chạy cho đến ngày Giáng sinh, tại thời điểm nó xuất ra It's Christmascửa sổ VBE ngay lập tức.

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

0

bash-n-date: 69 ký tự:

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

Nhưng nó sẽ thất bại vào ngày 26 tháng 12 đến ngày 31 tháng 12.


0

Q (60)

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

> Nếu không phải là Giáng sinh, bằng cách nào đó bạn phải đợi đến Giáng sinh và sau đó in "Đó là Giáng sinh".
hoài nghi

Tôi xin lỗi, đã sửa để kiểm tra từng giây nếu là Giáng sinh ... vì vậy, điều này sẽ in "Đó là Giáng sinh" 86.400 lần vào mỗi ngày 25 tháng 12. Rõ ràng bạn có thể thay đổi điều này bằng cách tăng bộ đếm thời gian, tính bằng mili giây.
sinedcm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.