Ist es weihnachten

33

Herausforderung

Vorausgesetzt, Weihnachten ist:

  • Dezember
  • Monat 12
  • Tag 25

Bestimmen Sie jedes Jahr das heutige Datum und ob heute Weihnachten ist oder nicht. Wenn es Weihnachten ist, müssen Sie drucken "It's Christmas". Wenn es nicht Weihnachten ist, müssen Sie irgendwie bis Weihnachten warten und dann drucken "It's Christmas".

Beispiel

Aus dieser Stapelüberlauffrage

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

Python in 115 Zeichen

Regeln

Hier sind die Regeln:

  • Angenommen, die Uhr des Computers stimmt immer.
  • Ihr Code muss jederzeit gestartet werden können.
  • Ihr Code muss "It's Christmas"an Weihnachten gedruckt werden .
  • Ein Looping ist sicherlich nicht erforderlich, aber nach dem Start sollte der Code erst nach dem Drucken angehalten werden.
  • Kürzester Code gewinnt.
Patrick Perini
quelle
Ich dachte, die Eingabe ist in Julian Datum, bevor ich diesen Beitrag lesen
Ming-Tang

Antworten:

18

Perl + Unix, 40 Zeichen

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

Dies ist die gleiche wie die Perl-Lösung von JB , außer dass ich ein paar Zeichen speichere, indem ich den externen dateBefehl anstelle von Perls verwende localtime.

Ilmari Karonen
quelle
143

Bash, 39

Für diejenigen, die einfach nicht warten können:

sudo date 12250000
echo It\'s Christmas

Dies folgt allen Regeln, insbesondere der ersten.

Joey Adams
quelle
11
Klug. Nicht was ich meinte, aber verdammt schlau.
Patrick Perini
8
"... und wenn die Uhr des Computers nicht immer gut genug ist, mach es." Gute Show!
JB
13
Sie können 5 Zeichen speichern, wenn Sie root sind. : D
Wug
29

Unix, 39 Bytes

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

Mit Hilfe von Dennis, danke dafür.

Benutzer unbekannt
quelle
Dies verstößt zwar gegen »Schleifen ist sicherlich nicht erforderlich, aber nach dem Start sollte Ihr Code erst nach dem Drucken anhalten.«
Joey
Ich verstehe deine Kritik nicht. Behauptest du, dass dies eine Schleife ist? Dass es vor dem Drucken stoppt?
Benutzer unbekannt
2
Mit echo{,} "It\'s Christmas"|at -t12252359ist dies kürzer als die akzeptierte Antwort. (Der Backslash ist übrigens erforderlich.)
Dennis
1
@ Tennis: Netter Einsatz der Klammererweiterung.
Joey Adams
18

PowerShell, 45 46 Zeichen

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

Es ist sicherlich nicht sehr stromsparend, so dass ein Laptop-Akku möglicherweise vor Weihnachten leer wird (vielleicht ein Grund, sich einen neuen zu wünschen). Aber nicht schlafen ist definitiv kürzer .

Dies ist auch lokal-agnostisch. Und danke an Jaykul für einen netten Trick, um dies weiter zu reduzieren.

Missbrauch der Regeln ein bisschen, 45 Zeichen

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

Dadurch werden leere Zeilen gedruckt, bis Weihnachten ist. Daraufhin wird "Es ist Weihnachten" gedruckt.

Es ist ...

  • ... kann jederzeit gestartet werden.
  • ... druckt "Es ist Weihnachten" zu Weihnachten. Mehrmals. Den ganzen tag lang (Die Regeln sagten nichts darüber aus, wie oft es gedruckt werden darf.)
  • ... druckt nicht "Es ist Weihnachten" an Nicht-Weihnachten (obwohl es in diesem Fall eine leere Zeile druckt; kann korrigiert werden, indem ein anderes Zeichen geopfert wird, aber dies bringt nichts gegen die obige vernünftigere Lösung).
  • ... hört nie auf (auch nicht, nachdem es „It's Christmas“ gedruckt hat, aber definitiv nicht vorher).
Joey
quelle
2
für (; (Datum) .date-ne "12/25") {} "Es ist Weihnachten" # 45 Zeichen
Jaykul
Jaykul: Danke ... das ist etwas, von dem ich nie gedacht hätte, dass es funktioniert.
Joey
Das "missbräuchliche" Skript könnte auch -matchden Platzhalter verwenden und darauf verzichten, um keinen Gewinn / Verlust an Zeichen zu verursachen.
Iszi
Sie können den Missbrauch jetzt entfernen, es ist nicht erforderlich.
Erik der Outgolfer
@EriktheGolfer: Wie so? Es bietet immer noch einen interessanten alternativen Ansatz, auch wenn er nicht kürzer ist.
Joey
13

Python (36 Zeichen)

Im Geiste des Missbrauchs der Regeln:

  • Auf jeden Fall druckt "It's Christmas" an Weihnachten

  • Wenn es nicht Weihnachten ist, vertreiben Sie die Zeit, indem Sie "Es ist Weihnachten" drucken.

    while True:
        print "It's Christmas"
    
Versuchen
quelle
2
29 Bytes while 1:print"It's Christmas".
Erik der Outgolfer
11

PostScript, 90

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

Laufen Sie nicht auf einem Drucker, es druckt keine Seite und es wird nur Ihren Drucker bis Weihnachten tun. Andererseits wäre es ein schönes Geschenk, wenn Sie Ihren Drucker zurückbekämen.

MrMRDubya
quelle
4
Vergessen Sie nicht, dem Drucker ein Schild mit der Aufschrift aufzukleben: JOB NICHT TÖTEN, BIS WEIHNACHTEN!
Joey Adams
Ich denke, die meisten Drucker haben nicht einmal eine funktionierende Hardware-Uhr, da dies eine optionale Funktion ist. Sehr schön :)
Joey
7

Mathematica, 47

While[Date[][[2;;3]]!={12,25}];"It's Christmas"
Mr.Wizard
quelle
5

Perl, 44 45

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

Wäre GMT nicht ausreichend? (3 Zeichen weg ;-)

JB
quelle
1until localtime=~/c 25/;würde dir einen char sparen. :)
Ilmari Karonen
Ich dachte, ich hätte das schon versucht und es ist gescheitert, aber es stellte sich heraus, dass ich es damals tatsächlich vergessen -Ehatte. Vielen Dank!
JB
Kein Problem. (Ps. Ich habe gerade eine Version Ihrer Lösung mit Backticks gepostet, anstatt localtimeunten. Sie können sie jederzeit stehlen, aber ich hatte das Gefühl, dass die zusätzliche Abhängigkeit eine separate Antwort rechtfertigt.)
Ilmari Karonen
Naaaw, Schande über mich nicht daran zu denken wieder . Die getrennte Antwort ist IMO vollkommen gerechtfertigt (und positiv bewertet).
JB
5

Perl, 45

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

Perl, 44

mit ternären Operator (Dank an Ilmari Karonen).

{localtime=~/c 25/?say"It's Christmas":redo}
Toto
quelle
? :anstatt && ;dir einen char zu sparen. (Und ich würde saystatt diefür eine schönere Ausgabe verwenden.)
Ilmari Karonen
@Ilmari Karonen: danke. Wenn Sie jedoch sayanstelle von sterben verwenden, wird das Skript nie beendet.
Toto
Es wird, wenn Sie den ternären Operator verwenden.
Ilmari Karonen
@Ilmari Karonen: Ja, natürlich. Vielleicht bin ich zu müde !!!
Toto
5

Javascript, 51 Zeichen

Es ist ein CPU-Killer:

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

Ich wollte dies tun, ohne Zeichenfolgen zu analysieren. Anschließend enthält mein Code viele magische Zahlen.

Ich habe eine Annäherung vorgenommen, um die Schaltjahre zu berücksichtigen. Niemand sagte, es müsse gleich am 25. Dezember um 00:00:00 Uhr ausgedruckt werden!

Perl, 80 69 57 Zeichen

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

Bearbeitet für präziseres Looping!

Ben Richards
quelle
4

R (47)

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

Python, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"
Steven Rumbalski
quelle
Das 1am Ende der zweiten Zeile sieht für mich ziemlich verdächtig aus. : P
cjfaure
@Trimsty: Der 1stellt einen Body für die while-Schleife bereit. Bis zum 25. Dezember ist im Grunde genommen viel zu tun. Dies hat den gleichen Effekt wie while 1:if'c 25'in time.asctime():break.
Steven Rumbalski
Ah, okay, danke, dass du das geklärt hast.
cjfaure
Ich denke time.ctime()würde tun.
Gnibbler
@knabber: In der Tat würde es. Schöner Fang.
Steven Rumbalski
3

TI-BASIC, 42 38

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

Erwartet das Datumsformat JJJJ / MM / TT.

getDate erstellt eine Liste mit drei Elementen {year,month,day}. Nur an Weihnachten ist Monat ^ 2 + Tag ^ 2 gleich 769.

Für die Zeichenfolge werden 23 Byte verwendet, da Kleinbuchstaben jeweils zwei Byte umfassen, mit Ausnahme von i, das als imaginäres Einheitentoken angezeigt wird.

Lirtosiast
quelle
2

Batch-Datei, 68 Zeichen

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

Nicht interaktiv verwendbar, da die Sitzung beendet wird. Für das Lösen wären 5 weitere Zeichen erforderlich.

Auch Gebietsschemasensitiv. Dies funktioniert in meinem Gebietsschema, das das Datumsformat ISO 8601 verwendet.

Aber hey, es ist eine Batch-Datei (von den meisten nicht einmal als Programmiersprache angesehen). Und kürzer als Javascript (und auf Augenhöhe mit Python).

Joey
quelle
2

Groovy, 55 Jahre alt

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

Ich denke, es funktioniert, aber ich warte immer noch auf die Ausgabe.

Armand
quelle
Wenn Groovys reguläre Ausdrücke mit den meisten anderen Sprachen vergleichbar sind, .*sind diese völlig unnötig. (Ps. Sie können es testen, indem Sie auf den 5. statt auf den 25. Dezember warten.)
Ilmari Karonen,
1
Ilmari, Groovy ist eine JVM-Sprache, und Javas reguläre Ausdrücke sind standardmäßig verankert.
Joey
1
Ilmari, ich würde nachsehen, aber mein Programm läuft noch
Armand
2

(pdf) eTeX - 180 Zeichen nur vom 1. bis 25. Dezember.

\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 hat nur eine Möglichkeit, auf das Datum, an dem das Programm startet, und die seit dem Start verstrichene Zeit von 32768 Sekunden zuzugreifen. Ich muss also die Anzahl der Sekunden berechnen, die gewartet werden soll, und für jede Sekunde eine Schleife ausführen, die auf das Programm wartet verstrichene Zeit, um die Zeit zu erreichen 1sund zurückzusetzen. (Genau, ich mache Blöcke von 900 Sekunden.)

Für jeden Monat zu arbeiten erfordert mehr Arbeit: 355 Zeichen.

\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
quelle
2

MySQL, 180 Zeichen

Wofür verwenden Sie Ihre Datenbank-Engine überhaupt?

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

In Längsrichtung nicht sehr wettbewerbsfähig, aber hey, es ist machbar!

TehShrike
quelle
Versuchen Sie DELIMITER /, RETURNS TEXTund CURDATE()LIKE'%12-25'; und versuchen, etwas Leerzeichen zu entfernen.
Titus
2

Rubin, 53

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

PHP, 40 Bytes

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

Schleife bis zum 25. Dezember; Beenden Sie dann den normalen Modus und drucken Sie.

Mit Standardeinstellungen ausführen (keine Hinweise anzeigen).

Titus
quelle
2

8086 Maschinencode, 33 Bytes

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
user5434231
quelle
1

Javascript, 93 89 78 77 Zeichen

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

JiminP
quelle
@ Joey Danke! Ich habe das vergessen.
5.
2
Eine weitere nicht blockierende Version: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)bei 61 Zeichen ... der einzige Nachteil ist, dass es alert()an Weihnachten den ganzen Tag ist.
David Murdoch
Warum setIntervalzu 1? setInveralto 1000*60*60*24und beides wird den Prozess nicht in Mitleidenschaft ziehen und nur einmal an Weihnachten benachrichtigen.
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");
}
Ratschenfreak
quelle
Sie können wahrscheinlich zwei Zeichen in der Zuordnung speichern. Und noch ein paar mehr durch Reduzierung der Zeilenanzahl.
Joey
Ich kann auch einiges sparen, indem t.month^12|t.day^25ich (wenn ich meine Prioritäten richtig einstelle)
Ratschenfreak
1

Q, 63 Zeichen

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

wird an jedem Weihnachtstag arbeiten

tmartin
quelle
1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Vorausgesetzt SERVEROUTPUT ON
  • Kürzer als die MySql-Lösung (iss das, MySql!)
  • Zu spät für letztes Jahr, aber pünktlich für dieses Jahr
  • Versucht DBMS_OUTPUT.putanstatt, DBMS_OUTPUT.put_lineaber das druckt nichts.
SQB
quelle
1

C # (126)

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

Schöner für Ihren Akku:

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

bearbeiten

Die zweite ("schöner für Ihre Batterie") Version hat ein bisschen ein Problem Dezember. 26. bis Dezember 31. Ich dachte nur an: P

Beide Versionen können wahrscheinlich noch etwas gekürzt werden.

RobIII
quelle
1

Japt , 27 Bytes (nicht konkurrierend)

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

So testen Sie das aktuelle Datum: Ersetzen Sie es c 25durch den letzten Buchstaben des Monats (Kurzform) + Leerzeichen + Tag des Monats. Feb 02==b 02

Probieren Sie es online! Nicht konkurrierend, weil Japt viel neuer ist als diese Herausforderung.

Oliver
quelle
1

VBA, 58 Bytes

Die anonyme VBE-Direktfensterfunktion nimmt keine Eingabe entgegen und wird bis Weihnachten ausgeführt. Zu diesem Zeitpunkt wird sie It's Christmasim VBE-Direktfenster ausgegeben.

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

Bash-n-Date: 69 Zeichen:

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

Aber es wird am 26. Dezember bis 31. Dezember scheitern.

Benutzer unbekannt
quelle
0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}
sinedcm
quelle
> Wenn es nicht Weihnachten ist, müssen Sie irgendwie bis Weihnachten warten und dann "Es ist Weihnachten" drucken.
Skeevey
Ich entschuldige mich, korrigiert, um jede Sekunde zu überprüfen, ob Weihnachten ist ... also wird "Es ist Weihnachten" jeden 25. Dezember 86.400 Mal gedruckt. Natürlich können Sie dies ändern, indem Sie den Timer in Millisekunden erhöhen.
Sinedcm