Apakah ini Natal?

33

Tantangan

Mengingat bahwa Natal adalah:

  • Desember
  • Bulan 12
  • 25 hari

Setiap tahun, tentukan tanggal hari ini, dan apakah hari ini Natal atau tidak. Jika ini Natal, Anda harus mencetak "It's Christmas". Jika ini bukan Natal, Anda harus entah bagaimana menunggu sampai Natal dan kemudian mencetak "It's Christmas".

Contoh

Dari Pertanyaan Stack Overflow ini

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

Python dalam 115 Karakter

Aturan

Berikut aturannya:

  • Asumsikan bahwa jam komputer selalu benar.
  • Kode Anda harus dapat dimulai kapan saja.
  • Kode Anda harus dicetak "It's Christmas"pada Natal.
  • Looping tentu tidak perlu, tetapi sekali mulai kode Anda tidak boleh berhenti sampai sudah dicetak.
  • Kode terpendek menang.
Patrick Perini
sumber
Saya pikir inputnya ada pada tanggal Julian sebelum saya membaca posting ini
Ming-Tang

Jawaban:

18

Perl + Unix, 40 karakter

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

Ini sama dengan solusi Perl JB , kecuali bahwa saya menyimpan beberapa karakter dengan menggunakan dateperintah eksternal, bukan Perl localtime.

Ilmari Karonen
sumber
143

Bash, 39

Bagi mereka yang tidak sabar:

sudo date 12250000
echo It\'s Christmas

Ini mengikuti semua aturan, terutama yang pertama.

Joey Adams
sumber
11
Pintar. Bukan maksudku, tapi sangat pintar.
Patrick Perini
8
"... dan jika jam komputer tidak selalu benar, buatlah." Pertunjukan yang bagus!
JB
13
Anda dapat menyimpan 5 karakter jika Anda root. : D
Wug
29

Unix, 39 byte

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

Dengan bantuan dari Dennis, terima kasih untuk itu.

Pengguna tidak diketahui
sumber
Ini melanggar »Looping tentu saja tidak perlu, tetapi sekali mulai kode Anda tidak boleh berhenti sampai sudah dicetak.«, Meskipun.
Joey
Saya tidak mengerti kritik Anda. Apakah Anda mengklaim ini berulang? Itu berhenti sebelum mencetak?
pengguna tidak diketahui
2
Menggunakan echo{,} "It\'s Christmas"|at -t12252359, ini lebih pendek dari jawaban yang diterima. (Omong kosong diperlukan oleh cara.)
Dennis
1
@ Dennis: Penggunaan ekspansi brace yang bagus.
Joey Adams
18

PowerShell, 45 46 karakter

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

Ini tentu saja tidak sangat hemat daya, sehingga baterai laptop mungkin mati sebelum Natal (alasan untuk berharap yang baru, mungkin). Tapi tidak tidur pasti lebih pendek .

Ini juga agnostik-lokal. Dan terima kasih kepada Jaykul untuk trik yang bagus dalam mengurangi ini lebih jauh.

Menyalahgunakan aturan sedikit, 45 karakter

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

Ini akan mencetak baris kosong sampai Natal, yang di atasnya akan mencetak "Ini Natal".

Saya t ...

  • ... dapat dimulai kapan saja.
  • ... mencetak "Ini Natal" pada Natal. Beberapa kali. Sepanjang hari. (Aturan tidak mengatakan apa-apa tentang seberapa sering dapat dicetak.)
  • ... tidak mencetak "Ini Natal" pada bukan-Natal (meskipun mencetak garis kosong dalam kasus itu; dapat diperbaiki dengan mengorbankan karakter lain, tetapi kemudian ini tidak mendapatkan apa-apa daripada solusi yang lebih waras di atas).
  • ... tidak pernah berhenti (bahkan setelah itu telah dicetak "Ini Natal" tetapi jelas tidak sebelumnya).
Joey
sumber
2
untuk (; (tanggal) .tanggal-ne "12/25") {} "Ini Natal" # 45 chars
Jaykul
Jaykul: Terima kasih ... itu adalah sesuatu yang saya tidak pernah berpikir akan berhasil.
Joey
Skrip "abusive" juga bisa digunakan -match, dan dilakukan tanpa wildcard, tanpa ada untung / rugi karakter.
Iszi
Anda dapat menghapus penyalahgunaan sekarang, itu tidak dibutuhkan.
Erik the Outgolfer
@EriktheGolfer: Bagaimana bisa begitu? Itu masih menawarkan pendekatan alternatif yang menarik, meskipun tidak lebih pendek.
Joey
13

Python (36 karakter)

Dalam semangat menyalahgunakan aturan:

  • Pasti mencetak "Ini Natal" pada Natal

  • Jika ini bukan Natal, habiskan waktu dengan mencetak "Ini Natal"

    while True:
        print "It's Christmas"
    
Mencoba
sumber
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)=

Jangan jalankan di printer, itu tidak mencetak halaman, dan itu hanya akan melakukan printer Anda sampai hari Natal. Kemudian lagi, mendapatkan kembali printer Anda akan menjadi hadiah yang bagus.

MrMRDubya
sumber
4
Jangan lupa menempelkan tanda ke printer yang bertuliskan: JANGAN MEMBUNUH PEKERJAAN SAMPAI DENGAN NATAL!
Joey Adams
Saya kira sebagian besar printer bahkan tidak memiliki jam perangkat keras yang berfungsi karena itu fitur opsional. Sangat bagus, :)
Joey
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Tuan Wisaya
sumber
5

Perl, 44 45

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

Bukankah waktu GMT sudah mencukupi? (Off 3 karakter ;-)

JB
sumber
1until localtime=~/c 25/;akan menghemat satu char. :)
Ilmari Karonen
Saya pikir saya sudah mencobanya dan ternyata gagal, tetapi ternyata saya benar-benar lupa -Epada saat itu. Terima kasih!
JB
Tidak masalah. (Mz. Saya baru saja memposting versi solusi Anda menggunakan backtick daripada di localtimebawah. Jangan ragu untuk mencurinya jika Anda mau, tetapi saya merasa ketergantungan ekstra membenarkan jawaban yang terpisah.)
Ilmari Karonen
Naaaw, rasa malu ada pada saya karena tidak memikirkannya lagi . Jawaban terpisah adalah IMO yang benar-benar dibenarkan (dan ditingkatkan).
JB
5

Perl, 45

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

Perl, 44

menggunakan operator ternary (Terima kasih kepada Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
sumber
? :bukannya && ;akan menghemat satu char juga. (Dan saya akan menggunakan saysebagai ganti dieuntuk hasil yang lebih cantik.)
Ilmari Karonen
@Ilmari Karonen: terima kasih. Tetapi dengan menggunakan sayalih-alih mati, skrip tidak pernah selesai.
Toto
Itu akan, jika Anda menggunakan operator ternary.
Ilmari Karonen
@Ilmari Karonen: ya, tentu saja. Mungkin aku terlalu lelah !!!
Toto
5

Javascript, 51 karakter

Ini adalah pembunuh CPU:

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

Saya ingin melakukan ini tanpa parsing string. Selanjutnya, ada banyak angka ajaib dalam kode saya.

Saya melakukan perkiraan untuk menghitung tahun kabisat. Tidak ada yang mengatakan bahwa ia harus mencetaknya tepat pada pukul 00:00:00, 25 Desember!

Perl, 80 69 57 karakter

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

Diedit untuk pengulangan yang lebih ringkas!

Ben Richards
sumber
4

R (47)

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

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
sumber
Bahwa 1pada akhir baris kedua terlihat cukup mencurigakan bagi saya. : P
cjfaure
@Rimsty: The 1menyediakan tubuh untuk while-loop. Ini pada dasarnya menunggu sibuk sampai 25 Desember. Ini memiliki efek yang mirip dengan while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, oke, terima kasih sudah membereskannya.
cjfaure
Saya pikir time.ctime()akan melakukannya.
gnibbler
@gnibbler: Memang benar. Tangkapan bagus.
Steven Rumbalski
3

TI-BASIC, 42 38

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

Diharapkan format tanggal menjadi YYYY / MM / DD.

getDate membuat daftar tiga elemen {year,month,day}; hanya pada hari Natal adalah bulan ^ 2 + hari ^ 2 sama dengan 769.

23 byte digunakan untuk string karena huruf kecil masing-masing dua byte, kecuali untuk i yang ditampilkan sebagai token unit imajiner.

lirtosiast
sumber
2

File batch, 68 karakter

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

Tidak dapat digunakan secara interaktif, karena sesi ini terbunuh. Memecahkan itu membutuhkan 5 karakter lebih banyak.

Juga sensitif terhadap lokal. Ini berfungsi di lokal saya yang menggunakan format tanggal ISO 8601.

Tapi hei, itu file batch (oleh sebagian besar bahkan tidak dianggap sebagai bahasa pemrograman). Dan lebih pendek dari Javascript (dan setara dengan Python).

Joey
sumber
2

Groovy, 55

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

Berpikir itu berhasil, tetapi masih menunggu hasil.

Armand
sumber
Jika regexps Groovy mirip dengan kebanyakan bahasa lain, itu .*sama sekali tidak perlu. (Mz. Anda dapat mengujinya dengan menunggu 5 Des alih-alih 25.)
Ilmari Karonen
1
Ilmari, Groovy adalah bahasa JVM dan regex Java secara default berlabuh.
Joey
1
Ilmari, saya akan memeriksa tetapi program saya masih berjalan
Armand
2

(pdf) eTeX - 180 karakter saja 1-25 Desember.

\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 hanya memiliki cara untuk mengakses tanggal ketika program dimulai, dan waktu yang berlalu sejak awal, dibatasi pada 32.768 detik, jadi saya perlu menghitung jumlah detik untuk menunggu, dan untuk setiap detik lakukan satu loop yang menunggu untuk waktu yang telah berlalu untuk mencapai 1sdan mengatur ulang waktu. (Tepatnya, saya sedang melakukan blok 900 detik.)

Bekerja untuk bulan apa pun membutuhkan lebih banyak pekerjaan: 355 karakter.

\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
Bruno Le Floch
sumber
2

MySQL, 180 karakter

Karena untuk apa Anda menggunakan mesin basis data Anda?

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

Tidak terlalu kompetitif memanjang, tapi hei, itu bisa dilakukan!

TehShrike
sumber
Coba DELIMITER /, RETURNS TEXTdan CURDATE()LIKE'%12-25'; dan mencoba untuk menghapus spasi.
Titus
2

Ruby, 53

until Time.now.to_s=~/c 25/
end
puts"It's Christmas!"
Steven Rumbalski
sumber
2

PHP, 40 byte

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

Lingkaran sampai 25 Desember; kemudian keluar ke mode biasa dan cetak.

Jalankan dengan pengaturan default (jangan tampilkan pemberitahuan).

Titus
sumber
2

8086 kode mesin, 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
pengguna5434231
sumber
1

Javascript, 93 89 78 77 karakter

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

JiminP
sumber
@ Joey, terima kasih! Saya lupa tentang itu.
JiminP
2
Versi non-blocking lainnya: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)pada 61 karakter ... satu-satunya kelemahan adalah bahwa ia akan alert()sepanjang hari pada hari Natal.
David Murdoch
Kenapa setIntervalharus 1? setInveraluntuk 1000*60*60*24dan keduanya tidak akan membuat proses menderita dan hanya akan memberi tahu sekali pada hari Natal.
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");
}
ratchet freak
sumber
Anda mungkin dapat menyimpan dua karakter dalam tugas. Dan beberapa lagi dengan mengurangi jumlah garis.
Joey
Saya juga bisa menghemat dengan menggunakan t.month^12|t.day^25(jika prioritas saya tepat)
ratchet freak
1

Q, 63 karakter

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

akan bekerja untuk hari natal setiap tahun

tmartin
sumber
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Asumsi SERVEROUTPUT ON
  • Lebih pendek daripada solusi MySql (makan itu, MySql!)
  • Terlambat untuk tahun lalu, tetapi pada waktunya untuk tahun ini
  • Mencoba DBMS_OUTPUT.putbukan DBMS_OUTPUT.put_linetetapi itu tidak mencetak apa pun.
SQB
sumber
1

C # (126)

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

Lebih bagus untuk baterai Anda:

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

sunting

Versi kedua ("lebih bagus untuk baterai Anda") memang memiliki sedikit masalah Desember. 26 hingga Desember. Saya hanya memikirkan: P

Kedua versi mungkin dapat dipersingkat lebih sedikit.

RobIII
sumber
1

Japt , 27 byte (tidak bersaing)

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

Untuk menguji tanggal hari ini: Ganti c 25dengan huruf terakhir (singkatan) bulan ini + spasi + hari dalam sebulan. Feb 02==b 02

Cobalah online! Non-bersaing karena Japt jauh lebih baru daripada tantangan ini.

Oliver
sumber
1

VBA, 58 Bytes

VBE anonim akan mengaktifkan fungsi jendela yang tidak menerima input dan berjalan hingga hari Natal, saat itu ia mengeluarkan It's ChristmasVBE untuk mengaktifkan jendela.

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

bash-n-date: 69 karakter:

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

Tapi itu akan gagal pada 26 Desember hingga 31 Desember.

Pengguna tidak diketahui
sumber
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
sumber
> Jika ini bukan Natal, Anda harus entah bagaimana menunggu sampai Natal dan kemudian mencetak "Ini Natal".
skeevey
Permintaan maaf saya, dikoreksi untuk memeriksa setiap detik apakah ini Natal ... jadi ini akan mencetak "Ini Natal" 86.400 kali setiap 25 Desember. Jelas Anda dapat mengubah ini dengan menambah timer, yang dalam milidetik.
sinedcm