Menyandikan tanggal dalam format Malam Natal

51

Hari posting ini diterbitkan adalah Malam Natal. Besok akan Natal. Kemarin adalah Malam Natal. Dalam dua hari akan tiba

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

.

Tugas Anda adalah mengambil tanggal program dijalankan dan menyandikannya dalam format Malam Natal.

  • Jika program Anda dijalankan pada Natal, itu akan menampilkan string "Natal".
  • Jika program Anda tidak berjalan pada Natal, itu akan menampilkan string "Natal", diikuti oleh string "Hawa" berulang nkali, di mana njumlah hari sampai Natal.
    • Perhatikan bahwa ini harus didasarkan pada Natal berikutnya . Misalnya, jika hari itu 26 April 2019, Anda harus melakukan perhitungan berdasarkan 25 Desember 2019, bukan Natal lainnya.
    • Ingatlah untuk menghitung hari kabisat.
  • Natal adalah 25 Desember setiap tahun.

Ini adalah , jadi kode terpendek menang! Perhatikan bahwa tujuannya bukan untuk menemukan program terpendek dalam bahasa apa pun, tetapi untuk menemukan program terpendek dalam setiap bahasa tertentu. Misalnya, jika Anda menemukan program C ++ terpendek, maka ia memenangkan kontes ini untuk C ++, bahkan jika seseorang menemukan program yang lebih pendek dengan Python.

PyRulez
sumber
7
Entah bagaimana saya tahu bahwa ini akan menjadi tantangan PPCG saat saya melihat kartun - +1 dari saya
Black Owl Kai
25
Kartun xkcd yang diterbitkan hari ini. imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai
7
@ BlackOwlKai LMBO Saya bahkan tidak melihat komik itu sampai komentar Anda. Saya sudah merencanakan untuk memposting ini, dan hanya menunggu Malam Natal. Pikiran besar berpikir sama, saya kira?
PyRulez
1
Bisakah tanggal menjadi parameter?
Olivier Grégoire
1
@ OlivierGrégoire uhm, saya akan mengizinkannya jika bahasa tidak memiliki kemampuan untuk mendapatkan tanggal saat ini dengan cara lain.
PyRulez

Jawaban:

52

SmileBASIC, 73 71 67 byte

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

Program ini mencetak "Natal", lalu mencetak "Hawa" setiap kali sehari, sampai tanggal 25 Desember. (12/25 = 0,48)
Mungkin membutuhkan waktu hingga satu tahun untuk berjalan.

12Me21
sumber
7
genius murni ...
FlipTack
7
Ini membuatku tersenyum ...
Neil
3
Bagus! Salah satu solusi JavaScript saya menggunakan pendekatan yang serupa. Namun, dalam JavaScript waktu tunggu hanyalah upaya terbaik. Bagaimana nasib SmileBASIC dalam hal ini?
targumon
4
@ 12Me21 yang jelas akan gagal karena lompatan detik, versi ini terlihat jauh lebih baik.
Rɪᴋᴇʀ
5
+1 untuk berpikir di luar kotak dan membuat saya tertawa.
Tom
24

Rumus Excel, 59 byte

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
Richard Crossley
sumber
4
Saya pikir YEAR(TODAY()+6)selalu mengembalikan tahun yang benar, sehingga menghindari kondisinya.
Neil
3
Saya pikir YEAR(NOW()+6)berfungsi juga dengan 2 byte lebih sedikit.
Engineer Toast
2
Saya pikir = "Natal" & REPT ("Eve", DATE (TAHUN (SEKARANG (SEKARANG (+6)), 12,26) -NOW ()) bahkan lebih pendek dan saya percaya itu harus bekerja.
JeroendeK
1
NOW()termasuk waktu, jadi itu tidak akan menjadi bilangan bulat dan saya tidak yakin REPTakan mengizinkannya.
12Me21
2
tetapi ini tidak memberikan "Natal" pada hari Natal. Periksa="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony
12

Perl 6 , 61 47 byte

ucapkan 'Natal' ~ 'Eve'x (Date.today ... ^ {. month == 12 &&. day == 25})

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

Cobalah online!

-14 byte (!) Berkat Jo King

Date.today ...^ /12\-25/adalah urutan tanggal mulai hari ini dan berakhir sehari sebelum Natal. (Ekspresi reguler /12\-25/dicocokkan dengan representasi string dari tanggal.) String " Eve"direplikasi beberapa kali sama dengan panjang urutan itu, dan merupakan output setelah string "Christmas".

Sean
sumber
Bisakah Anda melakukan "bulan> 11" untuk menyimpan satu byte?
chrixbittinx
2
Akan /12.25/bekerja
Kritixi Lithos
2
@Cowsquack tidak, karena itu mungkin cocok dengan tahun di tanggal seperti12025-12-24
Jo King
Saya pikir aman untuk berasumsi bahwa hal itu tidak akan pernah terjadi
12Me21
8

R , 112 106 72 byte

Via @digEmAll dan @ Joe

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

Cobalah online!

Jawaban asli saya sebelum klarifikasi bahwa kode tersebut akan mengambil tanggal di mana kode dijalankan sebagai input. Itu bisa dimodifikasi seperti di atas untuk menghemat banyak byte tetapi saya tidak akan repot.

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

Cobalah online!

Penjelasan: semua orang di gereja jadi saya punya waktu untuk melakukan ini. Ekstrak tahun, paksa ke integer. Buatlah vektor Xmas tahun itu dan Xmas tahun depan dan kurangi tanggal input untuk mendapatkan vektor dua perbedaan antara tanggal input dan kedua Xmases tersebut.

Pilih yang tidak negatif dan cat"Natal" dengan banyak "Hawa" itu.

ngm
sumber
Anda hanya menggunakan ysekali sehingga Anda bisa menggunakannya secara langsung untuk 108 byte.
Giuseppe
Juga akan z[z>=0][1]bekerja, bukan min?
Giuseppe
73 byte . Menurut komentar terakhir, program harus menampilkan teks berdasarkan hari berjalannya. Selamat Natal BTW! : D
digEmAll
1
Tweak milikmu selama 72 byte , @digEmAll. Selamat Natal!
J.Do
8

Windows PowerShell , 67 64 63 byte

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

Cobalah online!

Berhasil mencukur 3 byte 4 byte (terima kasih Sapi dukun ) dengan menggunakan -foperator ormat .ToString(), dan kemudian mengurangi string tanggal dari nilai numerik 1225 bukannya melakukan perbandingan dengan -ne. Bilangan bulat yang dihasilkan akan ditafsirkan sebagai boolean untuk kondisi di mana 0(yang akan terjadi pada hari Natal) ditafsirkan sebagai False(jangan masukkan loop), dan nilai lainnya ditafsirkan sebagai True(masukkan loop).

Karena bilangan bulat ada di sebelah kiri sekarang, string tanggal akan dikonversi ke bilangan bulat dan matematika akan dilakukan, sebagai lawan dari versi sebelumnya di mana 1225bilangan bulat dikonversi ke string untuk perbandingan.

Versi asli


Windows PowerShell , 67 byte

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

Cobalah online!

Menggunakan forloop sebagai whileloop pada dasarnya, karena lebih pendek. Dalam kondisi loop kami memeriksa tanggal saat ini ( date, bentuk singkat dari Get-Date), disalurkan ke ForEach-Objectalias %, menggunakan formulir yang dapat memanggil metode dengan nama wildcarded; dalam hal ini metodenya ada AddDays()pada DateTimeobjek, dan nilai yang kita berikan adalah $i.

Ini disalurkan ke ForEach-Objectlagi untuk memanggil ToString()metode, dengan format string Md(bulan, lalu hari, digit minimal karena kami tidak peduli dengan apa yang terjadi selanjutnya). String ini kemudian diuji untuk melihat apakah itu tidak sama -nedengan angka 1225, yang akan dikonversi ke string untuk perbandingan, menghemat kuotasi.

Inilah sebabnya mengapa tidak masalah bahwa bulan dan hari adalah angka tunggal, itu tidak akan pernah ambigu karena tidak ada hari lain dalam setahun yang akan menjadi ketat 1225.

Loop terus sampai string adalah 1225 . Pada awal program, $iakan menjadi nol sehingga akan membandingkan tanggal hari ini, dan loop tidak akan pernah dieksekusi, tetapi untuk hari lain $iakan bertambah dalam tubuh loop, sehingga kita akan memiliki hitungan berapa hari sampai Natal berikutnya, secara otomatis terhitung tahun kabisat dan apakah Natal berlalu tahun ini atau tidak.

Setelah loop, kami hanya menampilkan string yang Christmasdigabungkan dengan hasil mengalikan nilai string evekali $i(yang, pada hari Natal, akan 0, menghasilkan no eves).

briantis
sumber
Rupanya ;setelahnya {$i++}berlebihan? (juga wow Anda memimpin lagi bash)
Kritixi Lithos
@Cowsquack bagus! bagaimana aku tidak memperhatikan itu ?!
briantis
7

C # (Visual C # Interactive Compiler) , 89 byte

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

Cobalah online!

-3 byte terima kasih kepada @JeppeStigNielsen!

Strategi saya cukup mudah:

  1. Inisialisasi variabel loop tke tanggal saat ini
  2. Cetak Evekalau tbukan Natal
  3. Tambahkan satu hari ke tdan ulangi

Saya mencoba beberapa hal yang lebih menarik, tetapi cara ini membutuhkan byte paling sedikit.

dana
sumber
... apakah Anda perlu menetapkan t untuk dirinya sendiri di incrementor? Saya tidak memiliki dokumen di depan saya, tetapi jika tidak, Anda bisa menghemat dua byte lagi.
Stackstuck
1
oh, itu sebuah struct. Tentu saja. Lupakan.
Stackstuck
1
Anda bisa mengganti t.Month<12|t.Day!=25dengan yang lebih pendek $"{t:Md}"!="1225". Ini menggunakan string yang diinterpolasi dan string format DateTime kustom.
Jeppe Stig Nielsen
6

T-SQL, 92 88 byte

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

Sunting: Disimpan 4 byte berkat @BradC.

Neil
sumber
Kerja bagus. Hemat 2 dengan PRINT'Christmas'+...dan 2 lainnya dengan menggunakan DATEDIFF(D,bukannyaDATEDIFF(DAY,
BradC
@BradC Bagus, terima kasih!
Neil
5

APL (Dyalog Unicode) , 76 63 byte SBCS

Program lengkap. Asumsi ⎕IO←0(pengindeksan nol).

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

Cobalah online!

⎕CY'dfns'c o p y di perpustakaan dfns

⎕TS saat t ime s memadatkan sebagai [tahun, bulan, hari, jam, menit, detik, ms]
days[c]  menemukan jumlah hari [n] sejak 1899/12/31 00: 00: 00.000
(⍳366) menambahkan 366 bilangan bulat pertama (0 … 365) untuk itu
date[c]  temukan tanggal [n] yang sesuai dengan angka-angka itu (tabel 366 × 7; satu kolom per unit)
 transpos (tabel 7 × 366; satu baris per unit)
1↓ turun satu baris (tahun)
2↑ ambil dua baris pertama (bulan dan hari)
12 25⍳⍨ menemukan indeks
 perkalian Natal pertama yang oleh empat
' Eve'⍴⍨ digunakan untuk membentuk kembali daftar karakter
'Christmas ', menambahkan bahwa untuk ini

[c]  kode fungsi itu
[n]  mencatat untuk fungsi itu

Adm
sumber
5

Python 2 , 111 103 byte

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

Cobalah online!

Pembaruan terinspirasi oleh jawaban Richard Crossley .

Penjelasan:

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
Triggernometri
sumber
4

Ruby , 80 byte

require'date'
t=Date.today
puts'Christmas'+' Eve'*(Date.new((t+6).year,12,25)-t)

Cobalah online!

Terima kasih tsh untuk idenya

iBug
sumber
77 byte (yaitu, hemat 3 byte) dengan mengganti putsdengan p: tautan Try It Online
Spencer D
4

PHP, 61 byte

Christmas<?for($t=time();date(md,$t+=86400)-1226;)echo" Eve";

Jalankan dengan -natau coba online .

Titus
sumber
4

JavaScript, 135 131 121 92 88 byte

Solusi (naif) pertama saya ( 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)

Ini menetapkan 2 tanggal: sekarang dan Natal tahun ini. Jika yang terakhir belum berlalu, itu hanya akan membuat mereka berbeda, jika sudah berlalu, akan berbeda dengan Xmas tahun depan. Baik menggunakan berbeda untuk jumlah pengulangan.

(Mencoba) Berpikir di Luar Kotak ( 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()

Tantangan menentukan output WHICH diperlukan ketika menjalankan program pada hari tertentu, tetapi tidak menentukan KAPAN untuk mengembalikannya ...

Ini hanya akan 'tidur' selama sehari, menambah penghitung dengan 1, dan ulangi sampai Xmas untuk memberikan hasil.

Karena JavaScript tidak menjamin waktu 'tidur', hasil yang sebenarnya mungkin tidak aktif.

Ini juga jelek untuk menggunakan alertfungsi, yang berarti kita sebenarnya tidak berurusan dengan JavaScript murni, tetapi dengan API browser juga (kita dapat menggunakan console.logbiaya tambahan 6 byte).

Pendekatan yang lebih baik ( 121b ):

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

Mulai dari hari ini, tambahkan tanggal dengan satu hari hingga Natal, kemudian gunakan penghitung putaran itu untuk jumlah pengulangan yang diperlukan.

Meningkatkan (termasuk melalui minifier dan menggunakan trik 12Me21 untuk mencukur 5b ekstra) ( 92b ):

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

Sentuhan akhir ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Untuk semua hal di atas, REPL diasumsikan.
  • Lihat pengajuan Vadim - jauh lebih baik daripada milikku!
targumon
sumber
1
Saya pikir Anda dapat menggunakan t.getMonth()/t.getDate-.48untuk memeriksa apakah tanggal tidak desember 25
12Me21
1
Selamat datang di situs ini! Anda dapat menggunakan indentasi 4 spasi untuk membuat blok kode Anda terlihat lebih baik.
Wheat Wizard
1
Selamat datang di PPCG!
Shaggy
1
98 , printdiperlukan karena ini adalah program yang bukan fungsi, kecuali 1. Anda mengubahnya menjadi lambda atau 2. Anda menyatakan bahwa Anda menggunakan REPL
ASCII-only
1
t=new Date(+t+864e5)lebih pendek 1 byte.
Andrew Svietlichnyy
3

VBA (Excel), 108 byte

Salin dalam modul kosong. Mencetak ke jendela Segera:

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

Catatan: Menggunakan :alih-alih jeda baris menghemat dua byte per baris.

Perhatikan bahwa editor VBA akan menyisipkan spasi tambahan antara kata kunci, operator, dll ... dan tanda kurung setelah Sub definisi, tetapi jika Anda menyalin dan menempelkan kode ini akan berfungsi (saya tidak bisa menghilangkan ruang itu sebelum &).

Tidak buruk untuk VBA (sekali).

Barranka
sumber
1
* Christmas: |
ASCII-only
@ ASCII-only: menghapus ruang sebelum &melempar kesalahan
Barranka
-1 byte. Berkat @ ASCII-satunya untuk menangkap kesalahan ketik
Barranka
1
Anda dapat memotong ini menjadi 71 karakter dengan mengonversinya menjadi fungsi jendela langsung dan menghapus variabel sementara untuk now. Ketika Anda melakukan itu, itu akan terlihat seperti?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott
3

Bash + tanggal GNU, 72 73 byte

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • satu byte disimpan diganti !=dengan-
  • lain menghapus ruang ekstra
  • perbaiki -3 byte d=0, karena date -ddaytanggal + 1 dan tidak berfungsi pada 25/12

Cobalah online

Nahuel Fouilleul
sumber
Hmmm, mengapa =~tidak bekerja di for-loop conditional?
Kritixi Lithos
karena untuk kondisi loop adalah ekspresi aritmatika, kata-kata dipaksa untuk bilangan bulat juga angka dimulai dengan 0 diasumsikan dalam oktal, itu sebabnya 1 adalah prepended
Nahuel Fouilleul
3

Bash , 68 65 61 byte

Golf 4 byte terima kasih kepada Nahuel Fouilleul dengan menggunakan ``substitusi perintah dan evaldi tempat sed edanxargs

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

Cobalah online!

Di dalam `` substitusi perintah , kami punya

eval jalankan string berikut sebagai perintah shell

  • date\ -d{0..366}day\;di bawah ekspansi penjepit dari {0..366}, hasil ini dalam string date -d0day; date -d1day; date -d2day; ... date -d366day;, setiap perintah dalam string ini menghitung tanggal antara 0 dan 366 hari dari sekarang menghasilkan output format Wed Dec 26 18:22:33 UTC 2018, dengan masing-masing sejalan sendiri

|sed di mana, panggil perintah sed berikut

  • /c.25/Qjika regex /c.25/cocok, Quit tanpa cetak

  • \;cEve jika tidak ubah baris ke Eve

Semua jumlah yang diperlukan Evediproduksi masing-masing pada jalurnya sendiri. Output ini ditangkap ``, dan tunduk pada pemisahan kata di mana kata-kata dibagi pada baris baru. Setiap kata dimasukkan sebagai argumen echo.

echo Christmas ...

Setiap argumen untuk echodicetak dengan dipisahkan oleh spasi, menghasilkan output yang diinginkan.

Kritixi Lithos
sumber
Tidak ada yang benar-benar bashspesifik tentang solusi ini. Itu membutuhkan GNU date, seddan seqmeskipun.
Kusalananda
-4 bytes
Nahuel Fouilleul
@NahuelFouilleul Terima kasih, trik yang baik untuk menggunakan substitusi perintah backtick untuk menghindari xargs dan menggunakan eval untuk melompat keluar pada seq
Kritixi Lithos
2

C (gcc) , 157 byte

Saya berpikir bahwa saya akan dapat menghindari termasuk time.htetapi itu hanya memberikan kesalahan segmen.

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

Cobalah online!

ErikF
sumber
IMO Anda harus meninggalkan #include <stdlib.h>, tidak suka itu melakukan apa pun di sini
ASCII-only
Sarankan *t;f(u)bukannya *t,u;f()dan #import<time.h>bukannya #include <time.h>dan 5[t=localtime(&u)]bukannyat=localtime(&u);t[5]
ceilingcat
2

Groovy , 66 byte

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

Cobalah online!

Atas perkenan @ ASCII-only

bdkosher
sumber
Anda perlu mencetaknya karena ini adalah program lengkap bukan fungsi
ASCII
> Chistmas: /
ASCII
123
ASCII
mengambil yang pertama Anda dan menggunakan Groovy 2.5 slims ke 115 .
bdkosher
2

Python 3, 106 Bytes

from datetime import*
d=date.today()
print("Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days)
Albert Capp
sumber
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)}

Cobalah online!

Dimana c 25kependekan dari Dec 25.

Kjetil S.
sumber
1
Saya pikir Anda dapat menggunakan contains("c 25")sebagai gantinyamatches(".*c 25.*")
12Me21
Terima kasih, tiga byte lebih sedikit! 😁
Kjetil S.
wow, bagus sekali, toString of date itu bagus
V. Courtois
2

JavaScript, 86 77 byte

Menggunakan REPL itu akan menjadi

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

Kudos to ASCII-only untuk -9 byte

Vadim
sumber
77
ASCII
Bravo! Anda melakukan jauh lebih baik daripada saya. Bolehkah saya menawarkan untuk mencukur byte tambahan? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c atau varian ini: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s keduanya 76 byte.
targum
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 (sebelumnya)

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

Perlu dicatat bahwa itu tidak berfungsi di LuaJIT (kesalahan sintaks)

Tae Hanazono
sumber
Selamat datang di PPCG! Posting pertama yang bagus!
Rɪᴋᴇʀ
1

MySQL, 102 byte

hampir sama dengan jawaban T-SQL Neil . Tampaknya tidak ada cara yang lebih pendek dalam SQL.

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

Cobalah online .

Titus
sumber
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 Non-looper, 100 byte

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

Scala , 123 byte

Berkat kerja ASCII saja.

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

Cobalah online!

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)

Tidak berjalan di TIO karena memerlukan perpustakaan Joda-Time.

V. Courtois
sumber
no joda, 154 . sayangnya tidak bisa mulai java.util.Datebekerja di sini: /
ASCII-satunya
148
ASCII
Ah @ ASCII-saja saya tidak menghitung object Main extends App{}karakter dalam penghitungan saya (karena saya tidak dalam jawaban Scala saya yang lain juga). Jika kami mengeluarkannya, Anda mengalahkan saya ^^
V. Courtois
The withDate()panggilan begitu mahal ...
V. Courtois
1. ingat Anda harus menentukan bahasa sebagai "Scala + Joda-Time" karena Anda menggunakan perpustakaan eksternal dan 2. tidak akan menggunakan perubahan saya? lebih pendek plus tidak perlu perpustakaan: P
ASCII-satunya
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™

Cobalah secara online atau Coba online dengan tanggal 'hari ini' yang ditentukan sendiri yang ditiru .

Penjelasan:

05AB1E tidak memiliki bawaan untuk tanggal, kecuali untuk menerima tahun / bulan / hari / jam / menit / detik / mikrodetik saat ini, sehingga sebagian besar byte digunakan untuk perhitungan manual.

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

Lihat jawaban saya ini untuk memahami bagaimana kita pergi ke hari berikutnya. (PS: 1¾ǝtelah diganti dengan T`ǝ, karena kami juga menggunakan counter_variabletempat lain.)

Lihat ini 05AB1E ujung tambang (bagian Cara menggunakan kamus? Dan Cara kompres bilangan bulat besar? ) Untuk memahami mengapa '»ˆadalah "eve"; 'ŒÎadalah "christmas"; dan Ž9Úadalah 1225.

Kevin Cruijssen
sumber
Golf yang pintar!
MilkyWay90
0

C # (Visual C # Interactive Compiler) , 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)));

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1
Saya tidak berpikir ini bekerja untuk 30 November ...
Neil
Diperbaiki sekarang, saya lupa menambahkan cek apakah Desember atau bukan
Perwujudan Ketidaktahuan
Anda yakin tentang Bulan> 25?
Neil
Perbaiki sekarang ...
Perwujudan Ketidaktahuan
Apakah 1: 0 tidak perlu? tidak & mengembalikan bilangan bulat?
12Me21
0

Merah , 89 86 84 78 76 byte

-10 byte berkat ASCII saja!

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

Cobalah online!

Galen Ivanov
sumber
84
ASCII
@ ASCII-only Hmm, tentu saja! Terima kasih!
Galen Ivanov
78
ASCII
76
ASCII
@ ASCII-only Versi 76-byte Anda tidak memberikan hasil yang benar ketika dijalankan pada Natal: Tanggal sebagai argumen saya merasa bodoh karena tidak menggunakan saja nowdan tidak now/date. Terima kasih atas peningkatan Anda!
Galen Ivanov
0

Perl 5 , 68 byte

print"Christmas";print" Eve"while localtime($i++*86400+time)!~/c 25/

Cobalah online!

Dimana c 25kependekan dari Dec 25.

Kjetil S.
sumber