Noel mi


33

Meydan okuma

Noel verildiğinde:

  • Aralık
  • 12 ay
  • 25. gün

Her yıl, bugünün tarihini ve bugün Noel olup olmadığını belirleyin. Noel ise, yazdırmanız gerekir "It's Christmas". Noel değilse, bir şekilde Noel'e kadar beklemeniz ve ardından yazdırmanız gerekir "It's Christmas".

Örnek

Gönderen bu yığın taşması Soru

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

115 Karakterdeki Python

kurallar

İşte kurallar:

  • Bilgisayarın saatinin her zaman doğru olduğunu varsayalım.
  • Kodunuz herhangi bir zamanda başlatılabilmelidir.
  • Kodunuz "It's Christmas"Noel’de yazdırılmalıdır .
  • Döngü kesinlikle gerekli değildir, ancak bir kez başladıktan sonra kodunuz yazdırılana kadar durmamalıdır.
  • En kısa kod kazanır.

Bu yazıyı okumadan önce girdilerin Julian tarihinde olduğunu sanıyordum
Ming-Tang

Yanıtlar:



143

Bash, 39

Sadece bekleyemeyenler için:

sudo date 12250000
echo It\'s Christmas

Bu, özellikle ilk olan tüm kuralları takip eder.


11
Zeki. Kastettiğim bu değil ama zekice.
Patrick Perini,

8
“... ve bilgisayarın saati her zaman yeterince doğru değilse, yap.” İyi şov!
JB,

13
Kökseniz 5 karakter kaydedebilirsiniz. : D
Wug

29

Unix, 39 bayt

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

Dennis'in yardımıyla, bunun için teşekkürler.


Bu, “Döngü kesinlikle gerekli değildir, ancak bir kez başladıktan sonra kodunuz yazdırılana kadar durmamalıdır”.
Joey,

Eleştirmeni anlamıyorum. Bunun döngü olduğunu iddia ediyor musunuz? Yazdırmadan önce durması?
kullanıcı bilinmeyen

2
Kullanarak echo{,} "It\'s Christmas"|at -t12252359, bu kabul edilen cevaptan daha kısadır. (Bu arada ters eğik çizgi gerekir.)
Dennis,

1
@Dennis: Brace genişlemesinin iyi kullanımı.
Joey Adams,

18

PowerShell, 45 46 karakter

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

Kesinlikle çok verimli değil, bu yüzden laptop bataryası Noel'den önce ölebilir (belki de yeni bir tane istemesi gerekebilir). Fakat uyumamak kesinlikle daha kısa .

Bu aynı zamanda yerel agnostik. Ve Jaykul'a bunu daha da azaltmak için güzel bir numara için teşekkür ederiz.

Kuralları kötüye kullanmak, 45 karakter

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

Bu, Noel'e kadar boş satırları basar ve üzerinde “Noel” yazacaktır.

O ...

  • ... herhangi bir zamanda başlatılabilir.
  • ... Noel’de “Noel’de” yazıyor. Birkaç defa. Bütün gün boyunca. (Kurallar, ne sıklıkta basılabileceği hakkında hiçbir şey söylemedi.)
  • ... yok değil (daha sonra daha aklı başında çözümü yukarıda üzerinden bu kazançlar hiçbir şey başka bir karakter kurban ederek düzeltilmesi olabilir, ancak bu durumda boş bir satır yazdırır rağmen) değil-Noel “It Noel'i” yazdırmak.
  • ... hiç durmuyor (“Noel'i” yazdıktan sonra bile değil, kesinlikle daha önce değil).

2
(; (tarih) .date-ne "12/25") {} "Noel" # 45 karakter
Jaykul

Jaykul: Teşekkürler ... bu asla çalışmayı düşünmediğim bir şeydi.
Joey,

"Küfürlü" komut dosyası -matchkarakterlerde kazanç / kayıp olmadan joker karakter olmadan da kullanabilir ve bunu yapabilir.
Iszi

Kötüye kullanımı şimdi kaldırabilirsiniz, gereksizdir.
Outgolfer Erik

@EriktheGolfer: Nasıl yani? Kısa olmasına rağmen ilginç bir alternatif yaklaşım sunuyor.
Joey

13

Python (36 karakter)

Kuralları kötüye kullanma ruhuyla:

  • Noel'de kesinlikle "Noel var" yazıyor

  • Noel değilse, "Noel'i" yazarak zaman geçirin

    while True:
        print "It's Christmas"
    

2
29 bayt: while 1:print"It's Christmas".
Outgolfer Erik

11

PostScript, 90

(%Calendar%)currentdevparams begin{Month 12 eq Day 25 eq and{exit}if}loop(It's Christmas)=

Yazıcıda çalıştırmayın, sayfa yazdırmaz ve Noel gününe kadar yalnızca yazıcınızı DoS yapar. Sonra tekrar, yazıcınızı geri almak güzel bir hediye olurdu.


4
Yazıcıya bir işaret koymayı unutma: DAHA FAZLA NOEL!
Joey Adams,

Sanırım çoğu yazıcı, isteğe bağlı bir özellik olduğu için çalışan bir donanım saatine bile sahip olmayacak. Çok güzel olsa da :)
Joey

7

Mathematica, 47

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

5

Perl, 44 45

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

GMT zamanı yeterli olmaz mıydı? (3 karakter kapalı ;-)


1until localtime=~/c 25/;sana bir karakter kazandırır. :)
Ilmari Karonen

Bunu çoktan denediğimi sanıyordum ve başarısız oldu, ama aslında -Eo zaman unuttuğum ortaya çıktı . Teşekkürler!
JB

Sorun değil. (Ps. Çözümünüzün bir versiyonunu localtimeaşağıda yerine backticks kullanarak yayınladım . İsterseniz çalmaktan çekinmeyin, ancak ekstra bağımlılığın ayrı bir cevabı haklı çıkardığını hissettim.)
Ilmari Karonen

Naaaw, bir daha düşünmediğim için utanıyorum . Ayrı bir cevap IMO’ya tamamen haklı çıktı (ve oylandı).
JB,

5

Perl, 45

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

Perl, 44

üçlü operatör kullanarak (İlmari Karonen'e teşekkürler).

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

? :yerine && ;bir tane de seni kurtaracaktı. (Ve daha güzel çıktılar sayyerine kullanırdım die.)
Ilmari Karonen

@Ilmari Karonen: teşekkürler. Fakat saykalıp yerine, senaryo asla bitmez.
Toto,

Üçlü operatör kullanıyorsanız, olur.
Ilmari Karonen

@Ilmari Karonen: evet, elbette. Çok yorgun olabilirim !!!
Toto,

5

Javascript, 51 karakter

Bir CPU katili:

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

4

Bunu dizeleri ayrıştırmadan yapmak istedim. Daha sonra, kodumda birçok sihirli numara var.

Artık yılları hesaba katmak için bazı yaklaşımlar yaptım. Hiç kimse, 25 Aralık'ta 00: 00'da yazdırmak zorunda olduğunu söylemedi!

Perl, 80 69 57 karakter

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

Daha özlü döngü için düzenlendi!


4

R (47)

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

3

Python, 66 68

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

Yani 1ikinci satırın sonunda bana oldukça şüpheli görünüyor. : P
cjfaure

@Trimsty: Bu 1süre döngü için bir vücut sağlar. Temelde, 25 Aralık'a kadar yoğun bir bekleyiş while 1:if'c 25'in time.asctime():break.
Steven Rumbalski

Tamam, temizlediğin için teşekkürler.
cjfaure

Bence time.ctime()yapardım.
gnibbler

@gnibbler: Gerçekten öyle olurdu. İyi yakaladın.
Steven Rumbalski,

3

TI-BASIC, 42 38

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

Tarih formatının YYYY / MM / DD olmasını bekliyor.

getDate üç elemanlı bir liste oluşturur {year,month,day}; sadece Noel'de ay ^ 2 + gün ^ 2 769'a eşittir.

Dize için 23 bayt kullanılır, çünkü küçük harfler her biri iki bayttır, ancak hayali birim belirteci olarak görüntülenen i hariç.


2

Toplu iş dosyası, 68 karakter

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

Oturumu öldürdüğü için etkileşimli olarak kullanılamaz. Bunu çözmek 5 karakter daha gerektirir.

Ayrıca yerel-duyarlı. Bu, ISO 8601 tarih biçimini kullanan yerel ayarımda çalışır.

Ama hey, bu bir toplu iş dosyası (çoğu zaman bir programlama dili olarak bile görülmüyor). Javascript'ten daha kısa (ve Python ile eşit).


2

Harika, 55

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

İşe yaradığını düşünüyorum ama yine de çıktı bekliyor.


Groovy'nin regexps'i diğer birçok dilde olduğu gibi ise, .*bunlar tamamen gereksizdir. (Ps. 25 yerine 5
Aralık'ı

1
Ilmari, Groovy bir JVM dilidir ve Java'nın regex'leri varsayılan olarak tutturulur.
Joey,

1
Ilmari, kontrol ederim ama programım hala çalışıyor
Armand

2

(pdf) eTeX - sadece 1-25 Aralık arasındaki 180 karakter.

\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'in yalnızca programın başladığı tarihe ve başlangıçtan itibaren geçen sürenin 32768 saniyede kapanmasına erişme yolu vardır, bu yüzden bekleyecek olan saniye sayısını hesaplamam gerekir ve her saniye için bekleyen bir döngü yapın zamana ulaşmak 1sve sıfırlamak için geçen süre. (Kesinlikle, 900 saniyelik bloklar yapıyorum.)

Herhangi bir ay boyunca çalışmak daha fazla iş gerektirir: 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

2

MySQL, 180 karakter

Zaten veritabanı motorunu ne için kullanıyorsun?

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

Uzunlamasına çok rekabetçi değil, ama hey, yapılabilir!


Deneyin DELIMITER /, RETURNS TEXTve CURDATE()LIKE'%12-25'; ve biraz boşluk bırakmayı deneyin.
Titus


2

PHP, 40 bayt

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

25 Aralık'a kadar döngü; daha sonra düz moda çıkın ve yazdırın.

Varsayılan ayarlarla çalıştırın (ekran bildirimleri yapma).


2

8086 makine kodu, 33 bayt

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 karakter

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


@Joey Teşekkürler! Bunu unutmuştum.
JiminP

2
Engellenmeyen bir başka versiyon: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)61 karakterde ... tek dezavantajı alert()Noel'de bütün gün sürecek olmasıdır.
David Murdoch

Neden setInterval1 setInveraliçin 1000*60*60*24ve hem süreç acı ve Noel üzerinde yalnızca bir kez bildirecektir yapmaz.
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");
}

Muhtemelen atamada iki karakter kaydedebilirsiniz. Ve birkaç tane daha çizgi sayısını azaltarak.
Joey,

Bazı önceliklerimi kullanarak da tasarruf edebilirim t.month^12|t.day^25(önceliklerimi doğru
alırsam

1

Q, 63 karakter

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

her yıl noel günü için çalışacak


1

SQL * Artı + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • varsayarsak SERVEROUTPUT ON
  • Daha kısa sürede MySQL çözümü (onu ye, MySQL!)
  • Geçen yıl için çok geç, ama bu yıl için tam zamanında
  • DBMS_OUTPUT.putBunun yerine denedim DBMS_OUTPUT.put_lineama bu bir şey yazdırmıyor.

1

C # (126)

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

Bataryanız için daha iyi:

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

Düzenle

İkinci ("bataryanız için daha iyi") sürümde bir sorun var. 26 Aralık'tan itibaren. 31. Sadece düşündüm: P

Her iki sürüm de muhtemelen biraz daha kısaltılabilir.


1

Japt , 27 bayt (rekabet etmeyen)

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

Bugünün tarihine karşı test etmek için: c 25Bu ayın son harfiyle (kısa steno) + boşluk + ayın günü ile değiştirin. Feb 02==b 02

Çevrimiçi deneyin! Rekabet etmiyor çünkü Japt bu mücadeleden çok daha yeni.


1

VBA, 58 Bayt

Anonim VBE, giriş yapmayan ve Noel günü olana kadar çalışan It's Christmasve VBE'ye giden pencereye çıkış yapan pencere işlevini etkinleştirir.

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

0

bash-n-date: 69 karakter:

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

Fakat 26 Aralık - 31 Aralık arasında başarısız olacak.


0

S (60)

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

> Noel değilse, bir şekilde Noel'e kadar beklemeli ve sonra "Noel" yazmalısınız.
skeevey

Özür dilerim, her saniye Noel olup olmadığını kontrol etmek için düzeltildi ... bu yüzden her 25 Aralık'ta 86.400 kez "Noel" yazacak. Açıkçası bunu milisaniye cinsinden zamanlayıcıyı artırarak değiştirebilirsiniz.
sinedcm,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.