เข้ารหัสวันที่ในรูปแบบวันคริสต์มาสอีฟ


51

วันที่โพสต์นี้เผยแพร่คือ Christmas Eve พรุ่งนี้จะเป็นวันคริสต์มาส เมื่อวานเป็นวันคริสต์มาสอีฟ ในอีกสองวันมันจะเป็น

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

.

งานของคุณคือจดวันที่โปรแกรมทำงานและเข้ารหัสในรูปแบบคริสต์มาสอีฟ

  • หากโปรแกรมของคุณทำงานในวันคริสต์มาสก็ควรส่งออกสตริง "คริสต์มาส"
  • หากโปรแกรมของคุณไม่ทำงานในวันคริสต์มาสก็ควรส่งออกสตริง "คริสต์มาส" ตามด้วยสตริง "อีฟ" ซ้ำหลายnครั้งซึ่งnเป็นจำนวนวันจนถึงวันคริสต์มาส
    • โปรดทราบว่าสิ่งนี้จะต้องเป็นไปตามคริสต์มาสถัดไป ตัวอย่างเช่นหากวันนี้คือวันที่ 26 เมษายน 2019 คุณต้องทำการคำนวณตามวันที่ 25 ธันวาคม 2019 ไม่ใช่วันคริสต์มาสอื่น ๆ
    • อย่าลืมนับก้าวกระโดด
  • คริสมาสต์คือวันที่ 25 ธันวาคมของทุกปี

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ! โปรดทราบว่าเป้าหมายไม่ใช่เพื่อค้นหาโปรแกรมที่สั้นที่สุดในภาษาใด ๆ แต่เพื่อค้นหาโปรแกรมที่สั้นที่สุดในทุกภาษา ตัวอย่างเช่นหากคุณพบโปรแกรม C ++ ที่สั้นที่สุดมันจะชนะการประกวดครั้งนี้สำหรับ C ++ แม้ว่าบางคนจะพบโปรแกรมที่สั้นกว่าใน Python


7
ยังไงก็เถอะฉันรู้ว่านี่จะเป็นความท้าทาย PPCG เมื่อฉันเห็นการ์ตูน - +1 จากฉัน
Black Owl Kai

25
การ์ตูน xkcd ที่เผยแพร่วันนี้ imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai

7
@BlackOwlKai LMBO ฉันไม่ได้เห็นการ์ตูนเรื่องนั้นจนกว่าความคิดเห็นของคุณ ฉันวางแผนไว้แล้วว่าจะโพสต์สิ่งนี้และรอให้ถึงวันคริสต์มาสอีฟ จิตใจที่ดีคิดเหมือนกันฉันเดา?
PyRulez

1
วันที่สามารถเป็นพารามิเตอร์ได้หรือไม่
Olivier Grégoire

1
@ OlivierGrégoireเอ่อฉันจะอนุญาตถ้าภาษานั้นไม่มีความสามารถในการรับวันที่ปัจจุบันในอีกทางหนึ่ง
PyRulez

คำตอบ:


52

SmileBASIC, 73 71 67 ไบต์

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

โปรแกรมจะพิมพ์ "คริสต์มาส" จากนั้นพิมพ์ "Eve" ทุกครั้งที่ผ่านไปจนถึงวันที่ 25 ธันวาคม (12/25 = 0.48)
อาจใช้เวลาถึงหนึ่งปีในการดำเนินการ


7
อัจฉริยะบริสุทธิ์ ...
FlipTack

7
นี่ทำให้ฉันยิ้ม ...
Neil

3
ดี! หนึ่งในโซลูชัน JavaScript ของฉันใช้แนวทางที่คล้ายกัน อย่างไรก็ตามใน JavaScript เวลารอเป็นเพียงความพยายามที่ดีที่สุด SmileBASIC เดินทางในเรื่องนี้อย่างไร
Targumon

4
@ 12Me21 ที่จะล้มเหลวอย่างเห็นได้ชัดเนื่องจากเผ่นวินาทีรุ่นนี้ดูดีขึ้นมาก
Rɪᴋᴇʀ

5
+1 เมื่อคิดนอกกรอบแล้วทำให้ฉันหัวเราะ
Tom

24

สูตร Excel ขนาด 59 ไบต์

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

4
ฉันคิดว่าYEAR(TODAY()+6)คืนปีที่ถูกต้องเสมอดังนั้นหลีกเลี่ยงเงื่อนไข
Neil

3
ฉันคิดว่าYEAR(NOW()+6)ทำงานได้ดีด้วย 2 ไบต์ที่น้อยกว่า
Engineer Toast

2
ฉันคิดว่า = "คริสต์มาส" & REPT ("อีฟ", DATE (ปี (ตอนนี้ () +6), 12,26)) -NOW ()) ยิ่งสั้นและฉันเชื่อว่ามันควรจะใช้ได้
JeroendeK

1
NOW()รวมเวลาดังนั้นมันจะไม่เป็นจำนวนเต็มและฉันไม่แน่ใจว่าREPTจะอนุญาต
12Me21

2
แต่นี่ไม่ได้ให้ "คริสต์มาส" ในวันคริสต์มาส ตรวจสอบ="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
แอนโทนี

12

Perl 6 , 61 47 ไบต์

พูดว่า 'คริสต์มาส' ~ 'Eve'x (Date.today ... ^ {. เดือน == 12 &&. วัน == 25})

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

ลองออนไลน์!

-14 ไบต์ (!) ต้องขอบคุณ Jo King

Date.today ...^ /12\-25/คือลำดับของวันที่เริ่มต้นวันนี้และสิ้นสุดวันก่อนวันคริสต์มาส (การแสดงออกปกติ/12\-25/จะถูกจับคู่กับตัวแทนสายของวันที่.) สตริงเป็นซ้ำหลายครั้งเท่ากับความยาวของลำดับนั้นและเป็นผลลัพธ์หลังจากสตริง" Eve""Christmas"


คุณสามารถทำ "เดือน> 11" เพื่อบันทึกไบต์ได้หรือไม่?
chrixbittinx

2
จะ/12.25/ทำงานอย่างไร
Kritixi Lithos

2
@Cockquack ไม่เพราะมันอาจจะตรงกับปีในวันที่เช่น12025-12-24
Jo King

ฉันคิดว่ามันปลอดภัยที่จะสมมติว่าจะไม่เกิดขึ้น
12Me21

8

R , 112 106 72 72 ไบต์

ผ่าน @digEmAll และ @ J.Doe

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

ลองออนไลน์!

คำตอบเดิมของฉันคือก่อนที่จะชี้แจงว่ารหัสคือวันที่รหัสจะถูกเรียกใช้เป็นอินพุต มันสามารถแก้ไขได้ดังที่กล่าวไว้ข้างต้นเพื่อบันทึกจำนวนมาก แต่ฉันจะไม่รบกวน

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

ลองออนไลน์!

คำอธิบาย: ทุกคนอยู่ในคริสตจักรดังนั้นฉันจึงมีเวลาทำเช่นนี้ แยกปีรวมเป็นจำนวนเต็ม ทำให้เวกเตอร์ของ Xmas ในปีนั้นและ Xmas ในปีถัดไปและลบวันที่ป้อนเข้าเพื่อให้ได้เวกเตอร์ที่มีความแตกต่างสองอย่างระหว่างวันที่ป้อนเข้าและ Xmases ทั้งสองนั้น

เลือกอันที่ไม่เป็นลบและcat"คริสต์มาส" กับ "อีฟ" จำนวนมาก


คุณใช้เพียงyครั้งเดียวเพื่อให้สามารถใช้งานได้โดยตรงเป็น 108 ไบต์
Giuseppe

ยังจะz[z>=0][1]ทำงานแทนminหรือไม่
Giuseppe

73 ไบต์ ตามความคิดเห็นล่าสุดโปรแกรมจะต้องส่งออกข้อความตามวันที่ทำงาน สุขสันต์วันคริสต์มาส BTW! : D
digEmAll

1
ปรับแต่งของคุณเป็น72 ไบต์ @digEmAll สุขสันต์วันคริสต์มาส!
J.Doe

8

Windows PowerShell , 67 64 63 ไบต์

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

ลองออนไลน์!

การจัดการเพื่อการโกน3 ไบต์ 4 ไบต์ (ขอบคุณวัวต้มตุ๋น ) โดยใช้-fประกอบการ ORMAT แทน.ToString()แล้วลบสตริงวันจากค่าตัวเลข 1225 -neแทนการทำเปรียบเทียบกับ จำนวนเต็มผลลัพธ์จะถูกตีความว่าเป็นบูลีนสำหรับเงื่อนไขที่0(ซึ่งจะเกิดขึ้นในวันคริสต์มาส) ถูกตีความว่าเป็นFalse(อย่าเข้าไปในลูป) และค่าอื่น ๆ จะถูกตีความว่าเป็นTrue(ป้อนลูป)

เนื่องจากจำนวนเต็มอยู่ด้านซ้ายในขณะนี้สตริงวันที่จะถูกแปลงเป็นจำนวนเต็มและคณิตศาสตร์จะทำเมื่อเทียบกับรุ่นก่อนหน้าซึ่งมีการ1225แปลงจำนวนเต็มเป็นสตริงสำหรับการเปรียบเทียบ

รุ่นเดิม


Windows PowerShellขนาด 67 ไบต์

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

ลองออนไลน์!

การใช้การforวนซ้ำเป็นแบบwhileวนรอบเนื่องจากสั้นกว่า ในสภาพลูปเราจะตรวจสอบวันที่ปัจจุบัน ( dateซึ่งเป็นรูปแบบย่อของGet-Date), ไพพ์ไปยังForEach-Objectนามแฝงของ%โดยใช้แบบฟอร์มที่สามารถเรียกใช้เมธอดด้วยชื่อตัวแทน ในกรณีนี้วิธีการAddDays()เกี่ยวกับวัตถุและความคุ้มค่าเราจะให้มันเป็นDateTime$i

สิ่งนี้จะถูกไพพ์ไปที่ForEach-Objectอีกครั้งเพื่อเรียกใช้ToString()เมธอดด้วยสตริงรูปแบบMd(เดือนจากนั้นเป็นวันหลักน้อยที่สุดเนื่องจากเราไม่สนใจว่าจะเกิดอะไรขึ้นต่อไป) สตริงนี้จะถูกทดสอบเพื่อดูว่ามันไม่เท่ากับ-neตัวเลข1225ซึ่งจะถูกแปลงเป็นสตริงสำหรับการเปรียบเทียบช่วยให้ฉันทราบราคา

นี่คือเหตุผลว่าทำไมไม่สำคัญว่าเดือนและวันจะเป็นตัวเลขหลักเดียวมันจะไม่มีวันคลุมเครือเพราะไม่มีวันอื่นของปีที่จะทำให้เป็น1225มาตรฐาน

ห่วงต่อไปจนกว่าสตริงคือ 1225ที่จุดเริ่มต้นของโปรแกรม$iจะเป็นศูนย์ดังนั้นจะเป็นการเปรียบเทียบวันที่วันนี้และการวนซ้ำจะไม่ดำเนินการ แต่สำหรับวันอื่นใดที่$iเพิ่มขึ้นในลูปเนื้อหาเพื่อที่เราจะได้นับจำนวนวันจนกว่าจะถึง คริสมาสต์ถัดไปโดยอัตโนมัติคิดเป็นปีอธิกสุรทิน

หลังจากวนรอบเราเพียงแค่เอาท์พุทสตริงที่Christmasต่อกันกับผลลัพธ์ของการคูณสตริงeveด้วยค่าของ$i(ซึ่งในวันคริสต์มาสจะเป็น0ผลลัพธ์จะไม่มีผลลัพธ์eve)


เห็นได้ชัดว่า;หลังจาก{$i++}นั้นซ้ำซ้อน? (เช่นเดียวกันกับที่คุณได้เป็นผู้นำในการทุบตีอีกครั้ง)
Kritixi Lithos

@ Cowquack ดี! ฉันไม่สังเกตเห็นได้อย่างไร!
นักเทศน์

7

C # (Visual C # Interactive Compiler) , 89 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ @JeppeStigNielsen!

กลยุทธ์ของฉันค่อนข้างตรงไปตรงมา:

  1. เตรียมใช้งานตัวแปรลูปtเป็นวันที่ปัจจุบัน
  2. พิมพ์Eveถ้าtไม่ใช่คริสมาสต์
  3. เพิ่มวันtและทำซ้ำ

ฉันลองสิ่งที่นักเล่นบางคน แต่วิธีนี้ต้องการไบต์ที่น้อยที่สุด


... คุณต้องการมอบหมาย t ให้ตัวเองในส่วนเพิ่มหรือไม่? ฉันไม่มีเอกสารอยู่ข้างหน้าของฉัน แต่ถ้าไม่คุณสามารถบันทึกได้อีกสองไบต์
Stackstuck

1
โอ้มันเป็นโครงสร้าง แน่นอนมันเป็น ไม่เป็นไร.
Stackstuck

1
คุณสามารถทดแทนกับที่สั้นกว่าt.Month<12|t.Day!=25 $"{t:Md}"!="1225"มันใช้สตริง interpolated และสตริงการจัดรูปแบบ DateTime ที่กำหนดเอง
Jeppe Stig Nielsen

6

T-SQL, 92 88 ไบต์

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

แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @BradC


ทำได้ดีมาก ประหยัด 2 ด้วยPRINT'Christmas'+...และอีก 2 โดยใช้DATEDIFF(D,แทนDATEDIFF(DAY,
BradC

@BradC ดีขอบคุณ!
Neil

5

APL (Dyalog Unicode) , 76 63 ไบต์SBCS

โปรแกรมเต็มรูปแบบ ถือว่า⎕IO←0(การทำดัชนีเป็นศูนย์)

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

ลองออนไลน์!

⎕CY'dfns'c o p y ในไลบรารี dfns

⎕TS ปัจจุบันt ime s tamp เป็น [ปี, เดือน, วัน, ชั่วโมง, นาที, วินาที, ms]
days[c]  ค้นหาจำนวนวัน[n]ตั้งแต่ 1899-12-31 00: 00: 00.000
(⍳366) เพิ่มจำนวนเต็ม 366 ตัวแรก (0 ... 365) ไปที่
date[C]  พบว่าวันที่[n]ที่สอดคล้องกับตัวเลขเหล่านั้น (366 × 7 ตารางคอลัมน์หนึ่งต่อหน่วย)
 ไขว้ (7 × 366 ตารางหนึ่งแถวต่อหน่วย)
1↓ ลดลงหนึ่งแถว (ปี)
2↑ ใช้เวลา สองแถวแรก (เดือนและวัน)
12 25⍳⍨ ค้นหาดัชนีของคริสมาสต์แรก
 คูณด้วยสี่
' Eve'⍴⍨ ใช้เพื่อปรับแต่งรายชื่อตัวละคร
'Christmas ', ต่อท้ายว่า

[c]  รหัสของฟังก์ชันนั้น
[n]  หมายเหตุสำหรับฟังก์ชันนั้น


5

Python 2 , 111 103 ไบต์

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

ลองออนไลน์!

ปรับปรุงแรงบันดาลใจจากคำตอบของริชาร์ดครอสของ

คำอธิบาย:

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 92ไบต์

โซลูชันแรกของฉัน (ไร้เดียงสา) ( 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)

มันกำหนดวันที่ 2: ตอนนี้และคริสต์มาสของปีนี้ ถ้าอันหลังยังไม่ผ่านมันก็แค่แยกพวกมันถ้าผ่านไปก็จะแตกต่างกับคริสต์มาสในปีหน้า ใช้ diffs ต่าง ๆ ตามจำนวนการทำซ้ำ

(พยายามทำ) คิดนอกกรอบ ( 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 ระบุผลลัพธ์ที่ต้องการเมื่อเรียกใช้โปรแกรมในวันที่กำหนด แต่ไม่ได้ระบุว่าจะส่งคืนเมื่อใด ...

นี่จะเป็นการ 'นอน' หนึ่งวันเพิ่มตัวนับ 1 และทำซ้ำจนกว่าจะถึงวันคริสต์มาสเพื่อให้ได้ผลลัพธ์

เนื่องจาก JavaScript ไม่รับประกันเวลา 'สลีป' ดังนั้นผลลัพธ์ที่แท้จริงจึงอาจถูกปิด

มันก็น่าเกลียดสำหรับการใช้งานalertฟังก์ชั่นซึ่งหมายความว่าจริง ๆ แล้วไม่ได้เกี่ยวข้องกับจาวาสคริปต์ที่บริสุทธิ์ แต่ใช้กับเบราว์เซอร์ API ด้วย (เราสามารถใช้งานได้console.logที่ 6 ไบต์พิเศษ)

แนวทางที่ดีกว่า ( 121b ):

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

เริ่มจากวันนี้เพิ่มวันเป็นวันจนกว่าจะถึง Xmas จากนั้นใช้ตัวนับวนซ้ำนั้นตามจำนวนที่ต้องการซ้ำ

การปรับปรุง (รวมถึงการใช้ตัวขยายและใช้เคล็ดลับของ 12Me21 เพื่อโกนพิเศษ 5b) ( 92b ):

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

สัมผัสสุดท้าย ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • สำหรับข้างต้นทั้งหมด REPL จะถือว่า
  • ดูการส่งของ Vadim - ดีกว่าของฉันมาก!

1
ฉันคิดว่าคุณสามารถใช้t.getMonth()/t.getDate-.48เพื่อตรวจสอบว่าวันที่ไม่ใช่วันที่ 25 ธันวาคม
12Me21

1
ยินดีต้อนรับสู่เว็บไซต์! คุณสามารถใช้การเว้นวรรค 4 ช่องเพื่อทำให้บล็อคโค้ดของคุณดูดีขึ้น
ข้าวสาลีตัวช่วยสร้าง

1
ยินดีต้อนรับสู่ PPCG!
Shaggy

1
98 , printเป็นสิ่งจำเป็นตั้งแต่นี้เป็นโปรแกรมที่ไม่ได้ฟังก์ชั่นเว้นแต่ 1. คุณทำให้มันกลายเป็นแลมบ์ดาหรือ 2. คุณระบุว่าคุณกำลังใช้ REPL
ASCII เท่านั้น

1
t=new Date(+t+864e5)สั้นลง 1 ไบต์
Andrew Svietlichnyy

3

VBA (Excel) 108 ไบต์

คัดลอกในโมดูลเปล่า พิมพ์ไปที่หน้าต่างทันที:

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

หมายเหตุ:การใช้:แทนการขึ้นบรรทัดใหม่จะบันทึกสองไบต์ต่อบรรทัด

โปรดสังเกตว่าตัวแก้ไข VBA จะแทรกช่องว่างเพิ่มเติมระหว่างคำหลักตัวดำเนินการ ฯลฯ ... และวงเล็บหลังคำจำกัดความย่อย แต่ถ้าคุณคัดลอกและวางรหัสนี้มันจะใช้ได้ (ฉันไม่สามารถกำจัดช่องว่างนั้นก่อนหน้า&)

ไม่เลวสำหรับ VBA (หนึ่งครั้ง)



@ ASCII เท่านั้น: นำพื้นที่ออกก่อนที่จะ&เกิดข้อผิดพลาด
Barranka

-1 ไบต์ ขอบคุณ @
ASCII-

1
คุณสามารถตัดลงไป 71 nowตัวอักษรโดยการแปลงไปยังฟังก์ชั่นหน้าต่างทันทีและลบตัวแปรชั่วคราว เมื่อคุณทำเช่นนั้นควรมีลักษณะเช่นนี้?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott

3

Bash + GNU date, 72 73 bytes

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • บันทึกหนึ่งไบต์แทนที่!=ด้วย-
  • อีกลบพื้นที่พิเศษ
  • fix -3 ไบต์d=0เนื่องจากdate -ddayเป็นวันที่ + 1 และไม่ทำงานในวันที่ 25/12

ลองออนไลน์


อืมทำไม=~ไม่ทำงานในเงื่อนไข for-loop
Kritixi Lithos

เนื่องจากเงื่อนไขวนเป็นนิพจน์ทางคณิตศาสตร์คำว่า coerced ให้เป็นจำนวนเต็มและจำนวนที่ขึ้นต้นด้วย 0 จะถือว่าเป็นเลขฐานแปดนั่นคือสาเหตุที่ 1 ถูกจัดเตรียมไว้
Nahuel Fouilleul

3

Python 2, 128 ไบต์ / Python 3, 130 ไบต์

แน่นอนสองไบต์น้อยกว่าด้วย Python 2

from datetime import date as D
T=D.today()
Y=T.year
a=(D(Y,12,25)-T).days
print("Christmas"+" Eve"*[a,(D(Y+1,12,25)-T).days][a<0])


@tsh นั่นเป็นวิธีที่น่าทึ่ง!
iBug



3

Bash , 68 65 61 ไบต์

Golfed 4 ไบต์ขอบคุณNahuel Fouilleulโดยใช้การ``แทนที่คำสั่งและevalแทนที่ sed eและxargs

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

ลองออนไลน์!

ภายในการ`` ทดแทนคำสั่งเรามี

eval รันสตริงต่อไปนี้เป็นคำสั่งเชลล์

  • date\ -d{0..366}day\;ภายใต้การขยายรั้งของ{0..366}ผลลัพธ์นี้ในสตริงdate -d0day; date -d1day; date -d2day; ... date -d366day;แต่ละคำสั่งในสตริงนี้คำนวณวันที่ระหว่าง 0 ถึง 366 วันนับจากปัจจุบันส่งผลให้เกิดรูปแบบผลลัพธ์Wed Dec 26 18:22:33 UTC 2018โดยแต่ละบรรทัดอยู่ในบรรทัดของตัวเอง

|sed ซึ่งเรียกคำสั่ง sed ต่อไปนี้

  • /c.25/Qถ้า regex /c.25/ตรงกันQuit โดยไม่ต้องพิมพ์

  • \;cEve มิฉะนั้นเปลี่ยนสายเป็น Eve

จำนวนที่ต้องการทั้งหมดEveจะถูกสร้างขึ้นในแต่ละบรรทัด เอาต์พุตนี้ถูกดักจับ``และขึ้นอยู่กับการแยกคำที่มีการแบ่งคำในบรรทัดใหม่ echoแต่ละคำจะถูกป้อนเป็นอาร์กิวเมนต์ไปยัง

echo Christmas ...

แต่ละอาร์กิวเมนต์ที่จะechoถูกพิมพ์โดยถูกคั่นด้วยช่องว่างทำให้เกิดผลลัพธ์ที่ต้องการ


ไม่มีอะไรพิเศษ - bashเกี่ยวกับโซลูชันนี้โดยเฉพาะ มันต้อง GNU date, sedและseqแม้ว่า
Kusalananda


@NahuelFouilleul ขอบคุณเคล็ดลับดี ๆ ของการใช้การทดแทนคำสั่ง backtick เพื่อหลีกเลี่ยง xargs และการใช้ eval เพื่อข้ามไปที่ seq
Kritixi Lithos

2

C (gcc) , 157 ไบต์

ฉันคิดว่าฉันจะสามารถหลีกเลี่ยงการรวมถึงtime.hแต่ที่เพิ่งให้ข้อผิดพลาดส่วน

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

ลองออนไลน์!


IMO คุณควรออกไป#include <stdlib.h>ไม่เหมือนจะทำอะไรเลยที่นี่
ASCII เท่านั้น

แนะนำ*t;f(u)แทน*t,u;f()และ#import<time.h>แทนที่จะเป็น#include <time.h>และ5[t=localtime(&u)]แทนที่จะเป็นt=localtime(&u);t[5]
ceilingcat

2

Groovy , 66 ไบต์

d=[]as Date
print'Christmas'+' Eve'*(new Date((d+6).year,11,25)-d)

ลองออนไลน์!

ได้รับความอนุเคราะห์จาก @ ASCII- เท่านั้น


คุณต้องพิมพ์ออกมาเนื่องจากนี่ไม่ใช่โปรแกรมเต็มรูปแบบไม่ใช่ฟังก์ชั่น
ASCII-only

> Chistmas: /
ASCII-only



การหนึ่งครั้งแรกของคุณและการใช้ Groovy 2.5 Slims มันลงไป115
bdkosher


2

สกาลา , 116 113 ไบต์

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

ลองออนไลน์!

ที่ไหนสั้นสำหรับc 25Dec 25


1
ฉันคิดว่าคุณสามารถใช้contains("c 25")แทนmatches(".*c 25.*")
12Me21

ขอบคุณน้อยสามไบต์! 😁
Kjetil S.

ว้าวทำได้ดีมากการเก็บวันที่ดี
V. Courtois

2

JavaScript, 86 77 ไบต์

ใช้ REPL มันจะเป็น

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

ความรุ่งโรจน์ถึง ASCII เท่านั้นสำหรับ-9ไบต์



ไชโย! คุณทำได้ดีกว่าฉันมาก ฉันขอเสนอให้โกนไบต์พิเศษได้ไหม for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c หรือตัวแปรนี้: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s ทั้งสองคือ 76 ไบต์
ทาร์ทูมอน

2

Lua , 137 118 ไบต์

118 ไบต์

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 ไบต์ (ก่อนหน้า)

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

มันน่าสังเกตว่ามันไม่ทำงานใน LuaJIT (ข้อผิดพลาดทางไวยากรณ์)


ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

1

MySQL, 102 ไบต์

สวยมากเช่นเดียวกับคำตอบ Neil's T-SQL ดูเหมือนว่าจะไม่มีวิธีที่สั้นกว่าใน SQL

select concat("Christmas",repeat(" Eve",datediff(concat(year(now()+interval 6 day),"-12-25"),now())));

ลองมันออนไลน์


1

MATLAB, 91 ไบต์

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

MATLAB Non-looper, 100 bytes

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

1

สกาลา 123 ไบต์

ขอบคุณการทำงานของ ASCII เท่านั้น

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

ลองออนไลน์!

Scala + Joda-Timeขนาด 140 ไบต์

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)

ไม่ทำงานใน TIO เนื่องจากต้องใช้ไลบรารี Joda-Time


ไม่มี Joda 154 น่าเศร้าที่ไม่สามารถjava.util.Dateทำงานได้ที่นี่: /
ASCII- เท่านั้น


Ah @ ASCII เท่านั้นฉันไม่ได้นับobject Main extends App{}ตัวอักษรในการนับของฉัน (เพราะฉันไม่ได้ตอบ Scala อื่นของฉันด้วย) ถ้าเราเอามันออกมาคุณก็จะชนะฉัน ^^
V. Courtois

การwithDate()โทรนั้นแพงมาก ...
V. Courtois

1. จำไว้ว่าคุณต้องระบุภาษาเป็น "Scala + Joda-Time" เนื่องจากคุณใช้ไลบรารีภายนอกและ 2. จะไม่ใช้การเปลี่ยนแปลงของฉันหรือไม่ มันสั้นกว่าและไม่จำเป็นต้องมีไลบรารี: P
ASCII เท่านั้น

1

05AB1E , 93 89 ไบต์

ž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™

ลองมันออนไลน์หรือลองออนไลน์กับวันที่เทิดทูนด้วยตนเองที่ระบุ 'วันนี้'

คำอธิบาย:

05AB1E ไม่มี builtins ใด ๆ สำหรับวันที่ยกเว้นการรับปี / เดือน / วัน / ชั่วโมง / นาที / วินาที / microseconds ปัจจุบันดังนั้นไบต์ส่วนใหญ่จะใช้สำหรับการคำนวณด้วยตนเอง

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

ดูคำตอบของฉันที่จะเข้าใจว่าเราไปในวันถัดไป (PS: 1¾ǝถูกแทนที่ด้วยT`ǝเนื่องจากเราใช้ที่counter_variableอื่นเช่นกัน)

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการใช้พจนานุกรม?และวิธีการบีบอัดจำนวนเต็มขนาดใหญ่? )จะเข้าใจว่าทำไม'»ˆคือ"eve"; 'ŒÎคือ"christmas"; และเป็นŽ9Ú1225


เล่นกอล์ฟที่ฉลาด!
MilkyWay90

0

C # (Visual C # Interactive คอมไพเลอร์) , 141 ไบต์

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

ลองออนไลน์!


1
ฉันไม่คิดว่าจะใช้งานได้ในวันที่ 30 พฤศจิกายน ...
Neil

แก้ไขแล้วตอนนี้ฉันลืมที่จะเพิ่มการตรวจสอบว่าเป็นเดือนธันวาคมหรือไม่
ศูนย์รวมของความไม่รู้

คุณแน่ใจเกี่ยวกับเดือน> 25 หรือไม่
Neil


เป็นหรือไม่ 1: 0 สิ่งจำเป็น? ไม่ & คืนค่าจำนวนเต็ม?
12Me21

0

สีแดง , 89 86 84 78 76 ไบต์

-10 ไบต์ขอบคุณ ASCII-only!

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

ลองออนไลน์!



แน่นอน @ ASCII เท่านั้นอืม! ขอขอบคุณ!
Galen Ivanov



@ ASCII เท่านั้นรุ่น 76 ไบต์ของคุณไม่ได้ให้ผลที่ถูกต้องเมื่อทำงานบนคริสมาสต์: วันที่เป็นอาร์กิวเมนต์ผมรู้สึกโง่ไม่ได้ใช้เท่านั้นและไม่ได้now now/dateขอบคุณสำหรับการปรับปรุง!
Galen Ivanov

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