Mã hóa ngày ở định dạng đêm Giáng sinh


51

Ngày bài viết này được xuất bản là đêm Giáng sinh. Ngày mai sẽ là Giáng sinh. Hôm qua là đêm Giáng sinh. Hai ngày nữa thôi

Christmas Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve Eve

.

Công việc của bạn là lấy ngày chương trình được chạy và mã hóa nó theo định dạng đêm Giáng sinh.

  • Nếu chương trình của bạn được chạy vào Giáng sinh, chương trình sẽ xuất chuỗi "Giáng sinh".
  • Nếu chương trình của bạn không chạy vào Giáng sinh, chương trình sẽ xuất chuỗi "Giáng sinh", theo sau là chuỗi lặp lại "Giao thừa" n, trong đó nsố ngày cho đến Giáng sinh.
    • Lưu ý rằng điều này phải được dựa trên Giáng sinh tiếp theo . Ví dụ: nếu ngày là ngày 26 tháng 4 năm 2019, bạn phải thực hiện tính toán của mình dựa trên ngày 25 tháng 12 năm 2019, chứ không phải bất kỳ Giáng sinh nào khác.
    • Nhớ đếm ngày nhuận.
  • Giáng sinh là ngày 25 tháng 12 hàng năm.

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng! Lưu ý rằng mục tiêu không phải là tìm chương trình ngắn nhất trong bất kỳ ngôn ngữ nào, mà là tìm chương trình ngắn nhất trong mọi ngôn ngữ cụ thể. Ví dụ: nếu bạn tìm thấy chương trình C ++ ngắn nhất, thì nó sẽ thắng cuộc thi này cho C ++, ngay cả khi ai đó tìm thấy chương trình ngắn hơn trong Python.


7
Bằng cách nào đó tôi biết rằng đây sẽ là một thử thách PPCG ngay khi tôi xem phim hoạt hình - +1 từ tôi
Black Owl Kai

25
Một phim hoạt hình xkcd đã được xuất bản ngày hôm nay. imss.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai

7
@BlackOwlKai LMBO Tôi thậm chí không thấy truyện tranh đó cho đến khi nhận xét của bạn. Tôi đã lên kế hoạch để đăng bài này, và chỉ chờ đêm Giáng sinh. Những bộ óc vĩ đại nghĩ giống nhau, tôi đoán vậy?
PyRulez

1
Ngày có thể là một tham số?
Olivier Grégoire

1
@ OlivierGrégoire uhm, tôi sẽ cho phép nếu ngôn ngữ không có khả năng có được ngày hiện tại theo cách khác.
PyRulez

Câu trả lời:


52

SmileBASIC, 73 71 67 byte

?"Christmas";
@L?" Eve"*(D!=P);
P=D
DTREAD OUT,M,D
IF M/D-.48GOTO@L

Chương trình in "Giáng sinh", sau đó in "Giao thừa" mỗi khi một ngày trôi qua, cho đến ngày 25 tháng 12. (25/11 = 0,48)
Có thể mất tới một năm để chạy.


7
thiên tài thuần túy ...
FlipTack

7
Điều này làm tôi mỉm cười ...
Neil

3
Đẹp! Một trong những giải pháp JavaScript của tôi có cách tiếp cận tương tự. Tuy nhiên, trong JavaScript thời gian chờ đợi chỉ là một nỗ lực tốt nhất. SmileBASIC như thế nào về vấn đề này?
targumon

4
@ 12Me21 rõ ràng sẽ thất bại do bước nhảy vọt, phiên bản này có vẻ tốt hơn nhiều.
Rɪᴋᴇʀ

5
+1 để suy nghĩ bên ngoài hộp và làm tôi cười.
Tom

24

Công thức Excel, 59 byte

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())

4
Tôi nghĩ YEAR(TODAY()+6)luôn luôn trả lại đúng năm, do đó tránh được điều kiện.
Neil

3
Tôi nghĩ rằng YEAR(NOW()+6)hoạt động tốt với 2 byte ít hơn.
Kỹ sư Toast

2
Tôi nghĩ = "Giáng sinh" & REPT ("Đêm giao thừa", NGÀY (NĂM (NOW () + 6), 12,26) -NOW ()) thậm chí còn ngắn hơn và tôi tin rằng nó sẽ hoạt động.
JeroendeK

1
NOW()bao gồm thời gian, vì vậy nó sẽ không phải là số nguyên và tôi không chắc REPTsẽ cho phép điều đó.
12Me21

2
nhưng điều này không cho "Giáng sinh" vào ngày Giáng sinh. Kiểm tra="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony

12

Perl 6 , 61 47 byte

nói 'Giáng sinh' ~ 'đêm giao thừa (Date.today ... ^ {. tháng == 12 &&. day == 25})

say 'Christmas'~' Eve'x(Date.today...^/12\-25/)

Hãy thử trực tuyến!

-14 byte (!) Nhờ Jo King

Date.today ...^ /12\-25/là chuỗi ngày bắt đầu từ hôm nay và kết thúc vào ngày trước Giáng sinh. (Biểu thức chính quy /12\-25/được khớp với biểu diễn chuỗi của ngày.) Chuỗi " Eve"được sao chép một số lần bằng với độ dài của chuỗi đó và được xuất sau chuỗi "Christmas".


Bạn có thể làm "tháng> 11" để lưu một byte không?
chrixbittinx

2
Sẽ /12.25/làm việc?
Kritixi Lithos

2
@Cowsquack không, bởi vì sau đó nó có thể khớp với năm theo ngày như 12025-12-24
Jo King

Tôi nghĩ thật an toàn khi cho rằng điều đó sẽ không bao giờ xảy ra
12Me21

8

R , 112 106 72 byte

Qua @digEmAll và @ J.Doe

x=Sys.Date()-1;cat('Christmas');while(!grepl('12-25',x<-x+1))cat(' Eve')

Hãy thử trực tuyến!

Câu trả lời ban đầu của tôi là trước khi làm rõ rằng mã sẽ lấy ngày mà mã được chạy làm đầu vào. Nó có thể được sửa đổi như trên để tiết kiệm nhiều byte nhưng tôi sẽ không bận tâm.

function(x,z=as.Date(paste0(strtoi(format(x,"%Y"))+0:1,"-12-25"))-x)cat("Christmas",rep("Eve",z[z>=0][1]))

Hãy thử trực tuyến!

Giải thích: mọi người đều ở nhà thờ nên tôi có thời gian để làm việc này. Trích xuất năm, ép buộc thành số nguyên. Tạo vectơ của Xmas năm đó và Xmas năm sau và trừ ngày đầu vào để có được một vectơ có hai điểm khác biệt giữa ngày đầu vào và hai Xmas đó.

Chọn cái không âm và cat "Giáng sinh" với nhiều "Eves" đó.


Bạn chỉ sử dụng ymột lần nên bạn chỉ có thể sử dụng trực tiếp cho 108 byte.
Giuseppe

Cũng sẽ z[z>=0][1]làm việc thay vì min?
Giuseppe

73 byte . Theo bình luận cuối cùng, chương trình phải xuất văn bản dựa trên ngày nó chạy. Chúc mừng giáng sinh BTW! : D
digEmAll

1
Tinh chỉnh của bạn cho 72 byte , @digEmAll. Giáng sinh vui vẻ!
J.Doe

8

Windows PowerShell , 67 64 63 byte

for(;1225-'{0:Md}'-f(date|% *ys $i)){$i++}'Christmas'+' eve'*$i

Hãy thử trực tuyến!

Được quản lý để loại bỏ 3 byte 4 byte (cảm ơn quẻ ) bằng cách sử dụng -ftoán tử ormat thay vì .ToString(), sau đó trừ chuỗi ngày khỏi giá trị số 1225 thay vì so sánh với -ne. Số nguyên kết quả sẽ được hiểu là boolean cho điều kiện trong đó 0(sẽ xảy ra vào Giáng sinh) được hiểu là False(không nhập vòng lặp) và bất kỳ giá trị nào khác được hiểu là True(nhập vòng lặp).

Vì số nguyên ở bên trái bây giờ, chuỗi ngày sẽ được chuyển đổi thành số nguyên và toán học sẽ được thực hiện, trái ngược với phiên bản trước đó nơi 1225số nguyên được chuyển đổi thành chuỗi để so sánh.

Phiên bản gốc


Windows PowerShell , 67 byte

for(;(date|% *ys $i|% tost* Md)-ne1225){$i++};'Christmas'+' eve'*$i

Hãy thử trực tuyến!

Về cơ bản, sử dụng một forvòng lặp như một whilevòng lặp, vì nó ngắn hơn. Trong điều kiện vòng lặp, chúng tôi kiểm tra ngày hiện tại ( date, một dạng rút gọn Get-Date), được chuyển sang ForEach-Objectbí danh %, sử dụng biểu mẫu có thể gọi một phương thức bằng tên ký tự đại diện; trong trường hợp này phương thức là AddDays()trênDateTime đối tượng và giá trị chúng ta đưa ra là $i.

Điều này được chuyển sang ForEach-Objectmột lần nữa để gọi ToString()phương thức, với chuỗi định dạng Md(tháng, sau đó ngày, chữ số tối thiểu vì chúng ta không quan tâm đến những gì tiếp theo). Chuỗi này sau đó được kiểm tra để xem nếu nó không bằng -nesố1225 , chuỗi này sẽ được chuyển đổi thành chuỗi để so sánh, tiết kiệm cho tôi các trích dẫn.

Đây là lý do tại sao các tháng và ngày không phải là một chữ số, nó sẽ không bao giờ mơ hồ bởi vì không có ngày nào khác trong năm sẽ xâu chuỗi 1225 .

Vòng lặp tiếp tục cho đến khi chuỗi 1225 . Khi bắt đầu chương trình, $isẽ là 0 nên sẽ so sánh ngày hôm nay và vòng lặp sẽ không bao giờ thực hiện, nhưng đối với bất kỳ ngày nào khác $isẽ được tăng lên trong thân vòng lặp, do đó chúng tôi sẽ đếm được bao nhiêu ngày cho đến khi Giáng sinh tới, tự động chiếm năm nhuận và liệu Giáng sinh có vượt qua năm nay hay không.

Sau vòng lặp, chúng ta chỉ xuất chuỗi được Christmasnối với kết quả nhân chuỗi nhân evevới giá trị của $i(mà vào ngày Giáng sinh sẽ có 0kết quả là không có eves).


Rõ ràng ;sau {$i++}này là dư thừa? (cũng wow bạn đã dẫn đầu bash một lần nữa)
Kritixi Lithos

@Cowsquack đẹp! Làm thế nào mà tôi không nhận thấy điều đó?!
nghĩa sáng suốt

7

C # (Trình biên dịch tương tác Visual C #) , 89 byte

Write("Christmas");for(var t=DateTime.Now;$"{t:Md}"!="1225";t=t.AddDays(1))Write(" Eve");

Hãy thử trực tuyến!

-3 byte nhờ @JeppeStigNielsen!

Chiến lược của tôi khá đơn giản:

  1. Khởi tạo biến vòng lặp tcho ngày hiện tại
  2. In Evenếu tkhông phải là Giáng sinh
  3. Thêm một ngày tvà lặp lại

Tôi đã thử một số thứ lạ hơn, nhưng cách này đòi hỏi ít byte nhất.


... bạn có cần gán t cho chính nó trong phần tăng không? Tôi không có tài liệu trước mặt tôi, nhưng nếu không, bạn có thể tiết kiệm thêm hai byte.
Stackstuck

1
oh, nó là một cấu trúc. Tất nhiên là thế rồi. Đừng bận tâm.
Stackstuck

1
Bạn có thể thay thế t.Month<12|t.Day!=25bằng ngắn hơn $"{t:Md}"!="1225". Nó sử dụng một chuỗi nội suy và một chuỗi định dạng DateTime tùy chỉnh.
Jeppe Stig Nielsen

6

T-SQL, 92 88 byte

PRINT'Christmas'+REPLICATE(' Eve',DATEDIFF(D,GETDATE(),STR(YEAR(GETDATE()+6))+'-12-25'))

Chỉnh sửa: Đã lưu 4 byte nhờ @BradC.


Công việc tốt đẹp. Tiết kiệm 2 với PRINT'Christmas'+...và 2 lần nữa bằng cách sử dụng DATEDIFF(D,thay vìDATEDIFF(DAY,
BradC

@BradC Rất vui, cảm ơn!
Neil

5

APL (Dyalog Unicode) , 76 63 byte SBCS

Chương trình đầy đủ. Giả định ⎕IO←0(không lập chỉ mục).

⎕CY'dfns'
'Christmas',' Eve'⍴⍨4×12 25⍳⍨⍉2↑1↓⍉date(⍳366)+days⎕TS

Hãy thử trực tuyến!

⎕CY'dfns'c o p y trong thư viện dfns

⎕TS hiện tại t ime s TAMP như [năm, tháng, ngày, giờ, phút, giây, ms]
days[c]  tìm số ngày [n] từ 1899/12/31 00: 00: 00.000
(⍳366) thêm 366 số nguyên đầu tiên (0 ... 365) cho rằng
date[c]  tìm ra ngày [n] mà tương ứng với những con số (366 × 7 bảng; một cột trên một đơn vị)
 transpose (7 × 366 bảng; một hàng cho mỗi đơn vị)
1↓ thả một hàng (các năm)
2↑ mất hai hàng đầu tiên (tháng và ngày)
12 25⍳⍨ tìm chỉ mục của Giáng sinh đầu tiên
 nhân với bốn lần
' Eve'⍴⍨ sử dụng để định hình lại danh sách nhân vật
'Christmas ', nối thêm vào đó

[c]  mã của hàm đó
[n]  ghi chú cho hàm đó


5

Python 2 , 111 103 byte

from datetime import*
d=date.today()
print"Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days

Hãy thử trực tuyến!

Cập nhật lấy cảm hứng từ câu trả lời của Richard Crossley .

Giải trình:

from datetime import*
# get today as a date, so we don't have to worry about rounding errors due to time
d=date.today()
                              # get the year of the Christmas to compare to
                              # if the current date is after this year's Christmas, the 6 day offset will give the next year
                              # otherwise, returns this year
                              (d+timedelta(6)).year
                         # next Christmas minus the current date
                         date(.....................,12,25)-d
# Christmas, plus (number of days until next Christmas) " Eve"s
print"Christmas"+" Eve"*(...................................).days



4

JavaScript, 135 131 121 92 88 byte

Giải pháp đầu tiên (ngây thơ) của tôi ( 135b ):

t=new Date();n=new Date();n.setMonth(11);n.setDate(25);'Christmas'+' Eve'.repeat((n>=t?n-t:(n.setFullYear(n.getFullYear()+1)-t))/864e5)

Nó đặt 2 ngày: bây giờ và Xmas của năm nay. Nếu cái sau chưa được thông qua, nó chỉ khác họ, nếu nó đã qua, khác với Xmas năm sau. Sử dụng hoặc khác cho số lần lặp lại.

(Đang cố gắng) Nghĩ bên ngoài chiếc hộp ( 131b ):

i=0;f=_=>{t=new Date();if(t.getMonth()!=11||t.getDate()!=25){i++;setTimeout(f,864e5)}else{alert('Christmas'+' Eve'.repeat(i))}};f()

Challange chỉ định đầu ra WHICH là bắt buộc khi chạy chương trình vào một ngày nhất định, nhưng không chỉ định KHI trả lại ...

Điều này sẽ chỉ 'ngủ' trong một ngày, tăng bộ đếm lên 1 và lặp lại cho đến khi Xmas để cung cấp đầu ra.

Vì JavaScript không đảm bảo thời gian 'ngủ', kết quả thực tế có thể bị tắt.

Nó cũng xấu khi sử dụng alerthàm, điều đó có nghĩa là thực tế không phải là đối phó với JavaScript thuần túy, mà còn với API trình duyệt (chúng ta có thể sử dụng console.logvới chi phí là 6 byte thêm).

Cách tiếp cận tốt hơn ( 121b ):

t=new Date();i=0;while(t.getMonth()!=11||t.getDate()!=25){t=new Date(t.valueOf()+864e5);i++};'Christmas'+' Eve'.repeat(i)

Bắt đầu từ hôm nay, tăng ngày theo ngày cho đến khi Xmas, sau đó sử dụng bộ đếm của vòng lặp đó cho số lần lặp lại cần thiết.

Cải thiện (bao gồm cả việc thông qua một công cụ khai thác và sử dụng thủ thuật của 12Me21 để cạo thêm 5b) ( 92b ):

for(s='Christmas',t=new Date;t.getMonth()/t.getDate()-.44;)t=new Date(t*1+864e5),s+=' Eve';s

Cú chạm cuối cùng ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Đối với tất cả các bên trên, REPL được giả định.
  • Xem bài nộp của Vadim - tốt hơn nhiều so với của tôi!

1
Tôi nghĩ bạn có thể sử dụng t.getMonth()/t.getDate-.48để kiểm tra xem ngày không phải là ngày 25 tháng 12
12Me21

1
Chào mừng đến với trang web! Bạn có thể sử dụng thụt lề 4 không gian để làm cho khối mã của bạn trông đẹp hơn.
Thuật sĩ lúa mì

1
Chào mừng đến với PPCG!
Xù xì

1
98 , printlà cần thiết vì đây là chương trình không phải là một chức năng, trừ khi 1. bạn biến nó thành lambda hoặc 2. bạn nói rằng bạn đang sử dụng REPL
ASCII - chỉ

1
t=new Date(+t+864e5)ngắn hơn 1 byte.
Andrew Svietlichnyy

3

VBA (Excel), 108 byte

Sao chép trong một mô-đun trống. In ra cửa sổ Ngay lập tức:

Sub X:s="Christmas":d=Now:For t=1 To (DateSerial(Year(d+6),12,25)-d):s=s &" Eve":Next:Debug.Print s:End Sub

Lưu ý: Sử dụng :thay vì ngắt dòng sẽ tiết kiệm hai byte trên mỗi dòng.

Lưu ý rằng trình soạn thảo VBA sẽ chèn thêm khoảng trắng giữa các từ khóa, toán tử, v.v ... và dấu ngoặc đơn sau định nghĩa phụ, nhưng nếu bạn sao chép và dán mã này, nó sẽ hoạt động (tôi không thể thoát khỏi khoảng trắng đó trước &).

Không tệ cho VBA (một lần).


1
* Christmas: |
ASCII chỉ

@ ASCII-only: xóa khoảng trống trước khi &ném lỗi
Barranka

-1 byte. Cảm ơn @ ASCII - chỉ bắt lỗi đánh máy
Barranka

1
Bạn có thể cắt nó xuống còn 71 ký tự bằng cách chuyển đổi nó thành hàm cửa sổ ngay lập tức và loại bỏ biến tạm thời cho now. Khi bạn làm điều đó, nó sẽ trông giống như?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott

3

Ngày Bash + GNU, 72 73 byte

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • một byte được lưu thay thế !=bằng-
  • khác loại bỏ không gian thêm
  • sửa lỗi -3 byte d=0, vì date -ddaylà ngày + 1 và không hoạt động vào ngày 25/12

Dùng thử trực tuyến


Hmmm, tại sao =~không hoạt động trong điều kiện for-loop?
Kritixi Lithos

bởi vì điều kiện vòng lặp for là một biểu thức số học, các từ được ép buộc thành số nguyên cũng bắt đầu bằng số 0 được giả sử trong bát phân, đó là lý do tại sao 1 được đặt trước
Nahuel Fouilleul


3

Bash , 68 65 61 byte

Chơi gôn 4 byte nhờ Nahuel Fouilleul bằng cách sử dụng ``thay thế lệnh và evalthay cho sed exargs

echo Christmas `eval date\ -d{0..366}day\;|sed /c.25/Q\;cEve`

Hãy thử trực tuyến!

Bên trong `` thay thế lệnh , chúng ta có

eval chạy chuỗi sau dưới dạng lệnh shell

  • date\ -d{0..366}day\;dưới sự mở rộng của niềng răng{0..366} , điều này dẫn đến chuỗi date -d0day; date -d1day; date -d2day; ... date -d366day;, mỗi lệnh trong chuỗi này tính toán ngày từ 0 đến 366 ngày kể từ hiện tại dẫn đến đầu ra của định dạng Wed Dec 26 18:22:33 UTC 2018, với mỗi dòng trong dòng riêng của nó

|sed trên đó, gọi các lệnh sed sau

  • /c.25/Qnếu regex /c.25/được khớp, Quit mà không in

  • \;cEve mặt khác thay đổi dòng thành Eve

Tất cả số Eves yêu cầu được sản xuất trên mỗi dòng riêng của nó. Đầu ra này được ghi lại ``và có thể phân tách từ trong đó các từ được phân chia trên dòng mới. Mỗi từ được cho ăn như một đối số echo.

echo Christmas ...

Mỗi đối số echođược in bằng cách được phân tách bằng dấu cách, dẫn đến đầu ra mong muốn.


Không có gì thực sự bashcụ thể về giải pháp này. Nó đòi hỏi GNU date, sedseqmặc dù.
Kusalananda


@NahuelFouilleul Cảm ơn, thủ thuật hay của việc sử dụng thay thế lệnh backtick để tránh xargs và sử dụng eval để bỏ qua seq
Kritixi Lithos

2

C (gcc) , 157 byte

Tôi nghĩ rằng tôi sẽ có thể tránh bao gồm time.hnhưng điều đó chỉ đưa ra lỗi phân khúc.

#include <time.h>
*t,u;f(){time(&u);t=localtime(&u);t[5]+=t[4]>10&t[3]>25;t[4]=11;t[3]=25;u-=mktime(t);printf("Christmas");for(u/=86400;u++;printf(" Eve"));}

Hãy thử trực tuyến!


IMO bạn nên bỏ qua #include <stdlib.h>, không giống như nó làm bất cứ điều gì ở đây
ASCII chỉ

Đề xuất *t;f(u)thay vì *t,u;f()#import<time.h>thay vì #include <time.h>5[t=localtime(&u)]thay vìt=localtime(&u);t[5]
trần mèo


2

Python 3, 106 byte

from datetime import*
d=date.today()
print("Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days)

2

Scala , 116 113 byte

var d=new java.util.Date
print("Christmas")
while(!(""+d).contains("c 25")){print(" Eve");d.setDate(d.getDate+1)}

Hãy thử trực tuyến!

Nơi nào c 25là viết tắt của Dec 25.


1
Tôi nghĩ bạn có thể sử dụng contains("c 25")thay vìmatches(".*c 25.*")
12Me21

Cảm ơn, ba byte ít hơn!
Kjetil S.

wow, được thực hiện tốt, toString of date thật tuyệt
V. Courtois

2

JavaScript, 86 77 byte

Sử dụng REPL nó sẽ là

for(c='Christmas',d=new Date;!/c 25/.test(d);d=new Date(+d+864e5))c+=' Eve';c

Kudos sang ASCII chỉ cho -9 byte



Bravo! Bạn đã làm tốt hơn tôi nhiều. Tôi có thể đề nghị cạo thêm một byte không? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c hoặc biến thể này: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s cả hai đều là 76 byte.
targumon

2

Lua , 137 118 byte.

118 byte

t,d,month,day=os.time,os.date,1,-6year=d"%Y"+(d"%D">"12/25"and 2or 1)print("Christmas",d" Eve":rep(d("%j",t(_G)-t())))

137 byte (trước đó)

t,d=os.time,os.date a=d"*t"a.year,a.month,a.day=a.year+(d"%m%d">"1225"and 1 or 0),12,25 print("Christmas",("Eve "):rep((t(a)-t())/86400))

Điều đáng chú ý là nó không hoạt động trong LuaJIT (lỗi cú pháp)


Chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ


1

MATLAB, 91 byte

n=datetime
x=datetime(year(n+6),12,25)
s='Christmas'
while days(x-n)>=1 n=n+1 s=[s,' Eve'] end

MATLAB Không looper, 100 byte

x=datenum(datetime(floor((now+5)/365.2425),12,25))
d=x-now
['Christmas' repmat(' Eve',1,min(d(d>=0)))]

1

Scala , 123 byte

Nhờ công việc của ASCII.

print("Christmas")
var d=new java.util.Date
while(d.getMonth()<11||d.getDate()!=25){print(" Eve");d.setDate(d.getDate()+1)}

Hãy thử trực tuyến!

Scala + Joda-Time , 140 byte

import org.joda.time._
var s="Christmas"
var d=DateTime.now
while(d!=d.withDate(d.year().get(),12,25)){d=d.plusDays(1);s+=" Eve"};println(s)

Không chạy trong TIO vì nó yêu cầu thư viện Joda-Time.


không có joda, 154 . thật đáng buồn khi không thể java.util.Datelàm việc ở đây: /
ASCII


Ah @ ASCII - chỉ tôi không đếm số object Main extends App{}ký tự trong số đếm của mình (vì tôi cũng không có trong các câu trả lời Scala khác của mình). Nếu chúng tôi lấy ra điều đó, bạn sẽ đánh bại tôi ^^
V. Courtois

Cuộc withDate()gọi quá đắt ...
V. Courtois

1. hãy nhớ rằng bạn cần chỉ định ngôn ngữ là "Scala + Joda-Time" vì bạn sử dụng thư viện bên ngoài và 2. sẽ không sử dụng các thay đổi của tôi? nó ngắn hơn cộng với không cần thư viện: P
ASCII - chỉ

1

05AB1E , 93 89 byte

žežfžg)V'ŒÎ[Y¨JŽ9ÚQ#Y`2ô0Kθ4ÖUD2Qi\28X+ë31s<7%É-}‹iY¬>0ëYT`ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVð'»ˆ}J™

Dùng thử trực tuyến hoặc Dùng thử trực tuyến với ngày tự xác định là 'hôm nay' .

Giải trình:

05AB1E không có bất kỳ nội dung nào cho ngày, ngoại trừ việc nhận năm / tháng / ngày / giờ / phút / giây / giây / giây hiện tại, do đó, hầu hết các byte được sử dụng để tính toán thủ công.

žežfžg)V   # Get the current date and save it in variable `Y`
'ŒÎ       '# Push compressed string "christmas"
[          # Start an infinite loop
 Y¨JŽ9ÚQ   #  If the current date is December 25th:
        #  #   Stop the infinite loop
 Y`2ô0Kθ4ÖUD2Qi\28X31s<7%É-}‹iY¬>0ëYTDÅsD12i>1ë\1Dǝ¤>2}}ǝV
           #  Go to the next day, and set `Y` to it
 ð         #  Push a space " "
 '»ˆ      '#  Push compressed string "eve"
}          # After the infinite loop:
 J         # Join everything on the stack together
          # And make every word title-case (and output the result implicitly)

Xem câu trả lời này của tôi để hiểu làm thế nào chúng ta đi đến ngày hôm sau. (PS: 1¾ǝđã được thay thế bằng T`ǝ, vì chúng tôi cũng sử dụng counter_variableở một nơi khác.)

Xem 05AB1E mẹo này của tôi (phần Làm thế nào để sử dụng từ điển?Làm thế nào để nén các số nguyên lớn? ) Để hiểu tại sao '»ˆ"eve"; 'ŒÎ"christmas"; và Ž9Ú1225.


Chơi golf thông minh!
MilkyWay90

0

C # (Trình biên dịch tương tác Visual C #) , 141 byte

var g=DateTime.Now;Write("Christmas"+string.Concat(Enumerable.Repeat(" Eve",(new DateTime(g.Year+(g.Day>25&g.Month>11?1:0),12,25)-g).Days)));

Hãy thử trực tuyến!


1
Tôi không nghĩ rằng nó hoạt động vào ngày 30 tháng 11 ...
Neil

Đã sửa bây giờ, tôi quên thêm một kiểm tra xem đó có phải là tháng 12 hay không
Hiện thân của sự thiếu hiểu biết

Bạn có chắc chắn về Tháng> 25?
Neil

Đã sửa nó ngay bây giờ ...
Hiện thân của sự thiếu hiểu biết

Là 1: 0 không cần thiết? không & trả về một số nguyên?
12Me21

0

Đỏ , 89 86 84 78 76 byte

-10 byte chỉ nhờ ASCII!

does[a: now prin"Christmas"while[a/3 * 31 + a/4 <> 397][prin" Eve"a: a + 1]]

Hãy thử trực tuyến!



@ ASCII - chỉ Hmm, tất nhiên! Cảm ơn bạn!
Galen Ivanov



@ ASCII-only Phiên bản 76 byte của bạn không cho kết quả chính xác khi chạy vào Giáng sinh: Ngày như một đối số Tôi cảm thấy ngu ngốc vì không chỉ sử dụng nowvà không sử dụng now/date. Cảm ơn bạn đã cải thiện!
Galen Ivanov

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.