Czy to święta

33

Wyzwanie

Biorąc pod uwagę, że Boże Narodzenie to:

  • grudzień
  • 12. miesiąc
  • 25 dzień

Każdego roku określ dzisiejszą datę i określ, czy dzisiaj są Boże Narodzenie. Jeśli są święta, musisz wydrukować "It's Christmas". Jeśli to nie Boże Narodzenie, musisz jakoś poczekać do Bożego Narodzenia, a następnie wydrukować "It's Christmas".

Przykład

Z tego pytania o przepełnienie stosu

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

Python w 115 znakach

Zasady

Oto zasady:

  • Załóżmy, że zegar komputera jest zawsze poprawny.
  • Twój kod musi być możliwy do uruchomienia w dowolnym momencie.
  • Twój kod musi zostać wydrukowany "It's Christmas"w Boże Narodzenie.
  • Pętla z pewnością nie jest konieczna, ale po uruchomieniu kod nie powinien kończyć się, dopóki nie zostanie wydrukowany.
  • Najkrótszy kod wygrywa.
Patrick Perini
źródło
Myślałem, że dane wejściowe są w Julianie, zanim przeczytałem ten post
Ming-Tang,

Odpowiedzi:

18

Perl + Unix, 40 znaków

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

Jest to to samo, co rozwiązanie Perla dla JB , z tym wyjątkiem, że zapisuję kilka znaków przy użyciu zewnętrznego datepolecenia zamiast Perla localtime.

Ilmari Karonen
źródło
143

Bash, 39 lat

Dla tych, którzy nie mogą się doczekać:

sudo date 12250000
echo It\'s Christmas

Jest to zgodne ze wszystkimi zasadami, zwłaszcza pierwszą.

Joey Adams
źródło
11
Sprytny. Nie to, co miałem na myśli, ale cholernie sprytne.
Patrick Perini,
8
„... a jeśli zegar komputera nie zawsze jest odpowiedni, zrób to.” Dobry pokaz!
JB,
13
Możesz zapisać 5 znaków, jeśli jesteś rootem. : D
Wug
29

Unix, 39 bajtów

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

Dzięki pomocy Dennisa, dzięki za to.

nieznany użytkownik
źródło
Narusza to »Pętla z pewnością nie jest konieczna, ale po uruchomieniu kod nie powinien się zatrzymywać, dopóki nie zostanie wydrukowany.«.
Joey,
Nie rozumiem twojej krytyki. Czy twierdzisz, że to się zapętla? Że przestanie przed drukowaniem?
użytkownik nieznany
2
Używanie echo{,} "It\'s Christmas"|at -t12252359jest krótsze niż zaakceptowana odpowiedź. (Nawiasem mówiąc, wymagany jest odwrotny ukośnik).
Dennis
1
@Dennis: Ładne wykorzystanie rozszerzenia nawiasów klamrowych.
Joey Adams,
18

PowerShell, 45 46 znaków

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

Z pewnością nie jest bardzo energooszczędny, więc bateria do laptopa może umrzeć przed Bożym Narodzeniem (być może powód, by chcieć nowego). Ale nie spanie jest zdecydowanie krótsze .

Jest to również niezależne od ustawień regionalnych. I dzięki Jaykulowi za niezłą sztuczkę w dalszym zmniejszaniu tego.

Trochę narusza zasady, 45 znaków

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

Spowoduje to wydrukowanie pustych wierszy do Świąt Bożego Narodzenia, na których zostanie wydrukowane „Jest Boże Narodzenie”.

To ...

  • ... można uruchomić w dowolnym momencie.
  • ... drukuje „Jest Boże Narodzenie” na Boże Narodzenie. Kilka razy. Cały dzień. (Zasady nie mówiły nic o tym, jak często może być drukowane).
  • ... nie drukuje napisu „Jest Boże Narodzenie” w święta inne niż Boże Narodzenie (chociaż w tym przypadku drukuje pustą linię; można to naprawić, poświęcając inną postać, ale wtedy nie zyskuje to nic ponad bardziej rozsądne rozwiązanie powyżej).
  • ... nigdy się nie kończy (nawet po wydrukowaniu „Jest Boże Narodzenie”, ale na pewno nie wcześniej).
Joey
źródło
2
for (; (date) .date-ne "12/25") {} "It's Christmas" # 45 znaków
Jaykul
Jaykul: Dzięki ... to coś, o czym nigdy bym nie pomyślał, że działa.
Joey,
Skrypt „obelżywy” mógłby także używać -matchi bez użycia symbolu wieloznacznego, aby nie zyskać / stracić znaków.
Iszi
Możesz usunąć nadużycie teraz, jest to niepotrzebne.
Erik the Outgolfer,
@EriktheGolfer: Jak to możliwe? Nadal oferuje ciekawe alternatywne podejście, nawet jeśli nie jest krótsze.
Joey,
13

Python (36 znaków)

W duchu nadużycia zasad:

  • Zdecydowanie drukuje „It's Christmas” na Boże Narodzenie

  • Jeśli to nie Boże Narodzenie, poświęć czas, drukując „Jest Boże Narodzenie”

    while True:
        print "It's Christmas"
    
Próbować
źródło
2
29 bajtów: 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)=

Nie uruchamiaj na drukarce, nie drukuje strony, a drukarka będzie wykonywać tylko do Bożego Narodzenia. Z drugiej strony odzyskanie drukarki byłoby miłym prezentem.

MrMRDubya
źródło
4
Nie zapomnij nakleić na drukarce napisu: NIE ZABIERAJ PRACY DO ŚWIĄT BOŻEGO NARODZENIA!
Joey Adams,
Myślę, że większość drukarek nawet nie ma działającego zegara sprzętowego, ponieważ jest to funkcja opcjonalna. Ale bardzo fajnie :)
Joey,
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Mr.Wizard
źródło
5

Perl, 44 45

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

Czy czas GMT nie byłby wystarczający? (3 znaki wyłączone ;-)

JB
źródło
1until localtime=~/c 25/;uratowałbym cię jednym char. :)
Ilmari Karonen,
Myślałem, że już tego spróbowałem i to się nie udało, ale okazało się, że wtedy zapomniałem -E. Dzięki!
JB
Nie ma problemu. (Ps. Właśnie zamieściłem wersję twojego rozwiązania, używając backsicków zamiast localtimeniżej. Możesz ją ukraść, jeśli chcesz, ale czułem, że dodatkowa zależność uzasadniała osobną odpowiedź.)
Ilmari Karonen
Naaaw, szkoda, że ​​nie pomyślałem o tym więcej . Odrębna odpowiedź jest całkowicie uzasadniona przez IMO (i pozytywnie rozpatrzona).
JB,
5

Perl, 45

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

Perl, 44

za pomocą operatora trójskładnikowego (Dzięki Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
źródło
? :zamiast && ;zaoszczędzić ci też jednego char. (I użyłbym sayzamiast dieładniejszego wyjścia.)
Ilmari Karonen,
@Ilmari Karonen: dzięki. Jednak użycie sayzamiast umierania powoduje, że skrypt nigdy się nie kończy.
Toto,
Będzie, jeśli użyjesz operatora trójskładnikowego.
Ilmari Karonen,
@Ilmari Karonen: tak, oczywiście. Może jestem zbyt zmęczony !!!
Toto,
5

JavaScript, 51 znaków

To zabójca procesora:

while(!/c 25/.test(Date()));alert("It's Christmas")
David Murdoch
źródło
4

Chciałem to zrobić bez parsowania ciągów. Następnie w moim kodzie jest wiele magicznych liczb.

Dokonałem przybliżenia, aby uwzględnić lata przestępne. Nikt nie powiedział, że musi go wydrukować już 00:00:00, 25 grudnia!

Perl, 80 69 57 znaków

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

Edytowane, aby uzyskać bardziej zwięzłe zapętlenie!

Ben Richards
źródło
4

R (47)

while(!grepl("c 25",date())){};"It's Christmas"
zx8754
źródło
3

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
źródło
To 1na końcu drugiej linii wydaje mi się dość podejrzane. : P
cjfaure
@Trimsty: 1Zapewnia ciało dla pętli while. Zasadniczo jest to zajęte oczekiwanie do 25 grudnia. Ma podobny efekt jak while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ach, okej, dzięki za wyjaśnienie.
cjfaure
Myślę, że time.ctime()zrobiłbym.
gnibbler
@gnibbler: Rzeczywiście tak. Dobry chwyt.
Steven Rumbalski
3

TI-BASIC, 42 38

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

Oczekuje, że format daty to RRRR / MM / DD.

getDate tworzy trzyelementową listę {year,month,day}; tylko w Boże Narodzenie miesiąc ^ 2 + dzień ^ 2 jest równy 769.

Do ciągu używa się 23 bajtów, ponieważ małe litery to dwa bajty, z wyjątkiem i, który jest wyświetlany jako token urojonej jednostki.

lirtosiast
źródło
2

Plik wsadowy, 68 znaków

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

Nie można używać interaktywnie, ponieważ zabija sesję. Rozwiązanie wymagałoby 5 dodatkowych znaków.

Również wrażliwy na ustawienia regionalne. Działa to w moich lokalizacjach, które używają formatu daty ISO 8601.

Ale hej, to plik wsadowy (przez większość nawet nie uważany za język programowania). I krótszy niż Javascript (i na równi z Pythonem).

Joey
źródło
2

Groovy, 55

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

Myślę, że to działa, ale wciąż czeka na wyjście.

Armand
źródło
Jeśli wyrażenia regularne Groovy są podobne do większości innych języków, .*są one całkowicie niepotrzebne. (Ps. Możesz to przetestować, czekając na 5 grudnia zamiast 25)
Ilmari Karonen
1
Ilmari, Groovy jest językiem JVM, a wyrażenia regularne Java są domyślnie zakotwiczone.
Joey,
1
Ilmari, sprawdziłbym, ale mój program wciąż działa
Armand
2

(pdf) eTeX - 180 znaków tylko 1-25 grudnia.

\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 ma tylko sposób na dostęp do daty uruchomienia programu, a czas, który upłynął od uruchomienia, jest ograniczony do 32768 sekund, więc muszę obliczyć liczbę sekund oczekiwania i dla każdej sekundy wykonać pętlę, która czeka na upłynął czas do osiągnięcia 1si zresetowania czasu. (Dokładnie, robię bloki po 900 sekund.)

Praca na każdy miesiąc wymaga więcej pracy: 355 znaków.

\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
źródło
2

MySQL, 180 znaków

Bo do czego w ogóle używasz silnika bazy danych?

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

Nie bardzo konkurencyjne pod względem długości, ale hej, to wykonalne!

TehShrike
źródło
Spróbuj DELIMITER /, RETURNS TEXTa CURDATE()LIKE'%12-25'; i spróbuj usunąć trochę białych znaków.
Tytus
2

Ruby, 53

until Time.now.to_s=~/c 25/
end
puts"It's Christmas!"
Steven Rumbalski
źródło
2

PHP, 40 bajtów

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

Pętla do 25 grudnia; następnie wyjdź do trybu zwykłego i wydrukuj.

Uruchom z ustawieniami domyślnymi (nie wyświetlaj powiadomień).

Tytus
źródło
2

Kod maszynowy 8086, 33 bajty

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
użytkownik5434231
źródło
1

JavaScript, 93 89 78 77 znaków

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

JiminP
źródło
@Joey Thanks! Zapomniałem o tym.
JiminP,
2
Kolejna nieblokująca wersja: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)przy 61 znakach ... jedyną wadą jest to, że będzie alert()cały dzień w Boże Narodzenie.
David Murdoch,
Dlaczego setInterval1? setInveralaby 1000*60*60*24i to zarówno nie uczyni proces cierpieć i powiadomi tylko raz na Boże Narodzenie.
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");
}
maniak zapadkowy
źródło
Prawdopodobnie możesz zapisać dwa znaki w zadaniu. I jeszcze kilka, zmniejszając liczbę linii.
Joey,
Mogę też trochę zaoszczędzić, używając t.month^12|t.day^25(jeśli odpowiednio ustalę swoje priorytety)
maniakiem zapadkowym,
1

Q, 63 znaki

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

będzie działać na Boże Narodzenie każdego roku

tartin
źródło
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Zarozumiały SERVEROUTPUT ON
  • Krótsze niż rozwiązanie MySql (zjedz to, MySql!)
  • Za późno na ostatni rok, ale na czas w tym roku
  • Próbowałem DBMS_OUTPUT.putzamiast, DBMS_OUTPUT.put_lineale to nic nie drukuje.
SQB
źródło
1

C # (126)

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

Ładniejszy dla twojej baterii:

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

edytować

Druga wersja („ładniejsza dla twojej baterii”) ma trochę problem dec. 26 do grudnia 31. Właśnie pomyślałem o: P.

Obie wersje można prawdopodobnie nieco skrócić.

RobIII
źródło
1

Japt , 27 bajtów (niekonkurencyjny)

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

Aby przetestować w stosunku do dzisiejszej daty: Zamień c 25na ostatnią literę tego miesiąca (skrót) + spację + dzień miesiąca. Feb 02==b 02

Wypróbuj online! Nie konkuruje, ponieważ Japt jest znacznie nowszy niż to wyzwanie.

Oliver
źródło
1

VBA, 58 bajtów

Anonimowy VBE natychmiast uruchamia funkcję okna, która nie pobiera danych wejściowych i działa aż do Bożego Narodzenia, kiedy to It's Christmasjest wysyłany do VBE, natychmiast zamyka okno.

While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"
Taylor Scott
źródło
0

bash-n-date: 69 znaków:

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

Ale zawiedzie od 26 grudnia do 31 grudnia.

nieznany użytkownik
źródło
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
źródło
> Jeśli to nie Boże Narodzenie, musisz jakoś poczekać do Bożego Narodzenia, a następnie wydrukować „Jest Boże Narodzenie”.
skeevey
Przepraszam, poprawione, by sprawdzać co sekundę, czy są Święta Bożego Narodzenia ... więc to będzie drukować „Jest Boże Narodzenie” 86 400 razy co 25 grudnia. Oczywiście możesz to zmienić, zwiększając czas, który jest w milisekundach.
sinedcm