Codieren Sie das Datum im Heiligabend-Format

51

Der Tag, an dem dieser Beitrag veröffentlicht wurde, war Heiligabend. Morgen ist Weihnachten. Gestern war Heiligabend. In zwei Tagen ist es soweit

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

.

Ihre Aufgabe ist es, das Datum, an dem das Programm ausgeführt wird, im Heiligabend-Format zu codieren.

  • Wenn Ihr Programm an Weihnachten ausgeführt wird, sollte es die Zeichenfolge "Weihnachten" ausgeben.
  • Wenn Ihr Programm nicht an Weihnachten ausgeführt wird, sollte die Zeichenfolge "Weihnachten" gefolgt von der Zeichenfolge "Eva" ausgegeben werden n, wobei ndie Anzahl der Tage bis Weihnachten angegeben ist.
    • Beachten Sie, dass dies auf dem nächsten Weihnachtsfest basieren muss . Wenn der Tag beispielsweise der 26. April 2019 ist, müssen Sie Ihre Berechnung auf der Grundlage des 25. Dezember 2019 durchführen, nicht auf der Grundlage anderer Weihnachten.
    • Denken Sie daran, Schalttage zu zählen.
  • Weihnachten ist der 25. Dezember eines jeden Jahres.

Das ist , also gewinnt der kürzeste Code! Beachten Sie jedoch, dass das Ziel nicht darin besteht, das kürzeste Programm in einer beliebigen Sprache zu finden, sondern das kürzeste Programm in einer bestimmten Sprache. Wenn Sie beispielsweise das kürzeste C ++ - Programm finden, gewinnt es diesen Wettbewerb für C ++, auch wenn jemand in Python ein kürzeres Programm findet.

PyRulez
quelle
7
Irgendwie wusste ich, dass dies eine PPCG-Herausforderung sein würde, sobald ich den Cartoon - +1 von mir
Black Owl Kai
25
Eine xkcd-Karikatur, die heute veröffentlicht wurde. imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai
7
@BlackOwlKai LMBO Diesen Comic habe ich erst nach deinem Kommentar gesehen. Ich hatte bereits geplant, dies zu posten und wartete nur auf Heiligabend. Großartige Köpfe denken wohl gleich?
PyRulez
1
Kann das Datum ein Parameter sein?
Olivier Grégoire
1
@ OlivierGrégoire ähm, ich lasse es zu, wenn die Sprache nicht in der Lage ist, das aktuelle Datum auf andere Weise abzurufen.
PyRulez

Antworten:

52

SmileBASIC, 73 71 67 Bytes

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

Das Programm druckt "Weihnachten" und dann jedes Mal "Eva", wenn ein Tag vergeht, bis es der 25. Dezember ist. (25.12. = 0,48) Die
Ausführung kann bis zu einem Jahr dauern.

12Me21
quelle
7
Genie pur ...
FlipTack
7
Das brachte mich zum Lächeln ...
Neil
3
Nett! Eine meiner JavaScript-Lösungen verfolgt einen ähnlichen Ansatz. In JavaScript ist die Wartezeit jedoch nur eine Bestleistung. Wie geht es SmileBASIC in dieser Hinsicht?
Targumon
4
@ 12Me21, die offensichtlich aufgrund von Schaltsekunden ausfallen würde, sieht diese Version viel besser aus.
Freitag,
5
+1 für über den Tellerrand hinaus denken und mich zum Lachen bringen.
Tom
24

Excel-Formel, 59 Bytes

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
Richard Crossley
quelle
4
Ich denke, es wird YEAR(TODAY()+6)immer das richtige Jahr zurückgegeben, wodurch der Zustand vermieden wird.
Neil
3
Ich denke, YEAR(NOW()+6)funktioniert auch mit 2 weniger Bytes.
Ingenieur Toast
2
Ich denke, = "Weihnachten" & REPT ("Eve", DATE (YEAR (NOW () + 6), 12,26) -NOW ()) ist noch kürzer und ich glaube, es sollte funktionieren.
JeroendeK
1
NOW()enthält die Zeit, also wird es keine ganze Zahl sein und ich bin mir nicht sicher, ob ich REPTdas zulassen würde.
12. Mai,
2
aber dies gibt nicht "Weihnachten" am Weihnachtstag. Check="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony
12

Perl 6 , 61 47 Bytes

Sagen Sie 'Weihnachten' ~ 'Eva'x (Date.today ... ^ {. month == 12 &&. day == 25})

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

Probieren Sie es online!

-14 Bytes (!) Dank Jo King

Date.today ...^ /12\-25/ist die Abfolge der Daten, die heute beginnen und am Tag vor Weihnachten enden. (Der reguläre Ausdruck /12\-25/wird mit der Zeichenfolgendarstellung der Datumsangaben abgeglichen.) Die Zeichenfolge " Eve"wird so oft repliziert, wie sie der Länge dieser Sequenz entspricht, und nach der Zeichenfolge ausgegeben "Christmas".

Sean
quelle
Könnten Sie "Monat> 11" tun, um ein Byte zu speichern?
chrixbittinx
2
Würde /12.25/funktionieren
Kritixi Lithos
2
@Cowsquack nein, denn dann könnte es das Jahr in Daten wie12025-12-24
Jo King
Ich denke, es ist sicher anzunehmen, dass dies niemals passieren wird
12Me21
8

R , 112 106 72 Byte

Über @digEmAll und @ J.Doe

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

Probieren Sie es online!

Meine ursprüngliche Antwort war vor der Klarstellung, dass der Code das Datum haben soll, an dem der Code als Eingabe ausgeführt wird. Es könnte wie oben geändert werden, um viele Bytes zu sparen, aber ich werde mich nicht darum kümmern.

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

Probieren Sie es online!

Erklärung: Jeder ist in der Kirche, also habe ich Zeit dafür. Extrahieren Sie das Jahr, erzwingen Sie eine Ganzzahl. Machen Sie einen Vektor des diesjährigen Weihnachtsfestes und des nächsten Weihnachtsfestes und subtrahieren Sie das Eingabedatum, um einen Vektor mit zwei Differenzen zwischen dem Eingabedatum und diesen beiden Weihnachtsfesten zu erhalten.

Wählen Sie die nicht-negative und cat"Weihnachten" mit so vielen "Eves".

ngm
quelle
Sie verwenden es nur yeinmal, sodass Sie es direkt für 108 Bytes verwenden können.
Giuseppe
Würde das auch z[z>=0][1]funktionieren statt min?
Giuseppe
73 Bytes . Laut dem letzten Kommentar muss das Programm den Text basierend auf dem Tag ausgeben, an dem er ausgeführt wird. Frohe Weihnachten BTW! : D
digEmAll
1
Optimiert für 72 Bytes , @digEmAll. Fröhliche Weihnachten!
J.Doe
8

Windows PowerShell , 67 64 63 Bytes

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

Probieren Sie es online!

Es ist gelungen, 3 Bytes und 4 Bytes (danke an Cows quack ) zu -freduzieren, indem der Operator ormat anstelle von verwendet .ToString()wurde und anschließend die Datumszeichenfolge vom numerischen Wert 1225 subtrahiert wurde, anstatt einen Vergleich mit durchzuführen -ne. Die resultierende Ganzzahl wird als ein Boolescher Wert für die Bedingung interpretiert, bei der 0(was an Weihnachten passieren wird) interpretiert wird als False(nicht in die Schleife eintreten), und jeder andere Wert wird interpretiert als True(in die Schleife eintreten).

Da sich die Ganzzahl jetzt links befindet, wird die Datumszeichenfolge in die Ganzzahl konvertiert, und es wird eine Berechnung durchgeführt, im Gegensatz zu der vorherigen Version, in der die 1225Ganzzahl für den Vergleich in eine Zeichenfolge konvertiert wurde.

Originalfassung


Windows PowerShell , 67 Byte

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

Probieren Sie es online!

Verwenden einer forSchleife als whileSchleife im Grunde, weil es kürzer ist. In der Schleifenbedingung prüfen wir das aktuelle Datum ( dateeine abgekürzte Form von Get-Date), das an ForEach-Objectden Aliasnamen weitergeleitet wird %, mithilfe des Formulars, mit dem eine Methode mit Platzhalternamen aufgerufen werden kann. In diesem Fall befindet sich die Methode AddDays()auf dem DateTimeObjekt, und der Wert, den wir ihm geben, ist $i.

Dies wird ForEach-Objecterneut weitergeleitet, um die ToString()Methode mit der Formatzeichenfolge Md(Monat, dann Tag, minimale Ziffern, da es uns egal ist, was als Nächstes kommt) aufzurufen . Diese Zeichenfolge wird dann getestet, um festzustellen, ob sie nicht -neder Zahl entspricht 1225, die für den Vergleich in eine Zeichenfolge umgewandelt wird, wodurch die Anführungszeichen gespart werden.

Aus diesem Grund spielt es keine Rolle, dass die Monate und Tage einstellig sind, es wird nie mehrdeutig sein, da es keinen anderen Tag im Jahr gibt, an dem dies zutreffen würde 1225.

Die Schleife wird fortgesetzt, bis die Zeichenfolge ist 1225 . Zu Beginn des Programms $iwird Null sein, damit es das aktuelle Datum vergleicht, und die Schleife wird nie ausgeführt, aber für jeden anderen Tag $iwird der Schleifenkörper inkrementiert, sodass wir zählen, wie viele Tage bis zum nächstes Weihnachten, wobei automatisch die Schaltjahre berücksichtigt werden und ob Weihnachten in diesem Jahr vergangen ist oder nicht.

Nach der Schleife geben wir einfach die Zeichenfolge aus, die Christmasmit dem Ergebnis der Multiplikation der Zeichenfolge mit evedem Wert von $i(der am Weihnachtstag zu 0no eves führt) verknüpft ist.

Briantist
quelle
Anscheinend ist der ;nach {$i++}ist überflüssig? (Auch wow, Sie übernahmen die Führung über Bash wieder)
Kritixi Lithos
@Cowsquack schön! wie habe ich das nicht bemerkt ?!
Briantist
7

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

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

Probieren Sie es online!

-3 Bytes dank @JeppeStigNielsen!

Meine Strategie ist ziemlich einfach:

  1. Initialisieren Sie eine Schleifenvariable tmit dem aktuellen Datum
  2. Drucken, Evewenn tnicht Weihnachten ist
  3. Fügen Sie einen Tag hinzu tund wiederholen Sie

Ich habe einige schickere Dinge ausprobiert, aber auf diese Weise wurden die wenigsten Bytes benötigt.

Dana
quelle
... müssen Sie sich im Inkrementor t zuweisen? Ich habe die Dokumente nicht vor mir, aber wenn nicht, könnten Sie zwei Bytes mehr sparen.
Stackstuck
1
Oh, es ist eine Struktur. Natürlich ist es das. Keine Ursache.
Stackstuck
1
Sie können t.Month<12|t.Day!=25mit dem kürzeren ersetzen $"{t:Md}"!="1225". Es wird eine interpolierte Zeichenfolge und eine benutzerdefinierte DateTime-Formatierungszeichenfolge verwendet.
Jeppe Stig Nielsen
6

T-SQL, 92 88 Bytes

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

Bearbeiten: 4 Bytes dank @BradC gespeichert.

Neil
quelle
Gute Arbeit. Sparen Sie 2 mit PRINT'Christmas'+...und 2 mehr mit DATEDIFF(D,anstelle vonDATEDIFF(DAY,
BradC
@BradC Schön, danke!
Neil
5

APL (Dyalog Unicode) , 76 63 Bytes SBCS

Volles Programm. Annahmen ⎕IO←0(Null-Indizierung).

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

Probieren Sie es online!

⎕CY'dfns'c o p y in der dfns-bibliothek

⎕TS Strom t ime s Stampf als [Jahr, Monat, Tag, Stunde, Minute, Sekunde, ms]
days[c]  die Anzahl der Tage finden [n] seit 1899.12.31 00: 00: 00.000
(⍳366) fügen Sie die ersten 366 Zahlen (0 … 365) zu finden, dass
date[c]  die Daten [n] , die diesen Zahlen entsprechen (366 × 7-Tabelle; eine Spalte pro Einheit)
 transponieren (7 × 366-Tabelle; eine Zeile pro Einheit)
1↓ eine Zeile (die Jahre)
2↑ dauern In den ersten beiden Zeilen (Monate und Tage) wird
12 25⍳⍨ der Index des ersten Weihnachtsfestes
 multipliziert und mit vier multipliziert,
' Eve'⍴⍨ um die
'Christmas ', Zeichenliste umzugestalten

[c]  Code dieser Funktion
[n]  Notizen für diese Funktion

Adam
quelle
5

Python 2 , 111 103 Bytes

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

Probieren Sie es online!

Update inspiriert von Richard Crossleys Antwort .

Erläuterung:

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
Triggernometrie
quelle
4

JavaScript, 135 131 121 92 88 Bytes

Meine erste (naive) Lösung ( 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)

Es werden 2 Daten festgelegt: Jetzt und Weihnachten dieses Jahres. Wenn letzteres noch nicht bestanden hat, unterscheidet es sie nur, wenn es bestanden hat, unterscheidet es sich von Weihnachten des nächsten Jahres. Verwendet entweder Unterschiede für die Anzahl der Wiederholungen.

(Der Versuch, über den Tellerrand hinauszudenken ) ( 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()

Die Herausforderung gibt an, WELCHE Ausgabe erforderlich ist, wenn das Programm an einem bestimmten Tag ausgeführt wird, gibt jedoch nicht an, WANN es zurückgegeben werden soll ...

Dies wird nur für einen Tag "schlafen", einen Zähler um 1 erhöhen und wiederholen, bis Weihnachten ist, um die Ausgabe zu geben.

Da JavaScript die Ruhezeit nicht garantiert, ist das tatsächliche Ergebnis möglicherweise nicht korrekt.

Es ist auch hässlich für die Verwendung der alertFunktion, was bedeutet, dass wir uns nicht nur mit reinem JavaScript, sondern auch mit Browser-APIs befassen (wir können es console.logfür 6 zusätzliche Bytes verwenden).

Ein besserer Ansatz ( 121b ):

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

Erhöhen Sie ab heute das Datum um einen Tag, bis Weihnachten ansteht, und verwenden Sie dann den Zähler dieser Schleife für die Anzahl der erforderlichen Wiederholungen.

Verbessern (einschließlich Durchlaufen eines Minizers und Verwenden des 12Me21-Tricks zum Rasieren von zusätzlichen 5b) ( 92b ):

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

Letzte Berührung ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Für alle oben genannten wird REPL angenommen.
  • Siehe Vadims Beitrag - viel besser als meiner!
Targumon
quelle
1
Ich denke, Sie können t.getMonth()/t.getDate-.48überprüfen, ob das Datum nicht der 25. Dezember ist
12Me21
1
Willkommen auf der Seite! Sie können einen 4-stelligen Einzug verwenden, damit Ihre Codeblöcke besser aussehen.
Wheat Wizard
1
Willkommen bei PPCG!
Shaggy
1
98 , printwird benötigt, da dies ein Programm ist, das keine Funktion ist, es sei denn, 1. Sie wandeln es in ein Lambda um oder 2. Sie geben an, dass Sie eine REPL
ASCII-only
1
t=new Date(+t+864e5)ist 1 Byte kürzer.
Andrew Svietlichnyy
3

VBA (Excel), 108 Byte

Kopieren Sie in einem leeren Modul. Druckt in das Direktfenster:

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

Hinweis: Durch die Verwendung von :anstelle von Zeilenumbrüchen werden zwei Bytes pro Zeile gespart.

Beachten Sie, dass der VBA-Editor nach der Unterdefinition zusätzliche Leerzeichen zwischen Schlüsselwörtern, Operatoren usw. und Klammern einfügt. Wenn Sie diesen Code kopieren und einfügen, funktioniert er jedoch (ich konnte diesen Leerzeichen vor dem nicht entfernen &).

Nicht schlecht für VBA (einmal).

Barranka
quelle
1
* Christmas: |
Nur ASCII
@ Nur ASCII: Entfernen des Leerzeichens vor dem &
Auslösen
-1 Bytes. Vielen Dank an @ ASCII-only für den Tippfehler
Barranka
1
Sie können dies auf 71 Zeichen reduzieren, indem Sie es in eine Sofortfensterfunktion konvertieren und die temporäre Variable für entfernen now. Wenn Sie das tun, sollte es ?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott
3

Bash + GNU Datum, 72 73 Bytes

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • Ein Byte gespart, ersetzt !=durch-
  • ein anderer, der zusätzlichen Raum entfernt
  • Verlegenheit -3 Bytes d=0, weil date -ddayDatum + 1 ist und nicht auf 25/12 arbeitet

Probieren Sie es online aus

Nahuel Fouilleul
quelle
Hmmm, warum funktioniert das =~nicht in der for-Schleife bedingt?
Kritixi Lithos
da die for-Schleifenbedingung ein arithmetischer Ausdruck ist, werden Wörter zu ganzen Zahlen gezwungen und Zahlen, die mit 0 beginnen, werden als Oktal angenommen. Deshalb wird 1 vorangestellt
Nahuel Fouilleul
3

Bash , 68 65 61 Bytes

Golf 4 Bytes dank Nahuel Fouilleul durch ``Befehlsersetzung und evalanstelle von sed eundxargs

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

Probieren Sie es online!

Innerhalb der `` Befehlsersetzung haben wir

eval Führen Sie die folgende Zeichenfolge als Shell-Befehle aus

  • date\ -d{0..366}day\;in geschweiften Klammern von {0..366}ergibt dies die Zeichenfolge date -d0day; date -d1day; date -d2day; ... date -d366day;, wobei jeder Befehl in dieser Zeichenfolge das Datum zwischen 0 und 366 Tagen ab dem aktuellen Datum berechnet, was zur Ausgabe des Formats Wed Dec 26 18:22:33 UTC 2018mit jeweils einer eigenen Zeile führt

|sed Rufen Sie die folgenden sed-Befehle auf

  • /c.25/QWenn der reguläre Ausdruck /c.25/übereinstimmt, wird er Qohne Druck beendet

  • \;cEve Andernfalls ändern Sie die Zeile in Eve

Alle benötigten Eves werden jeweils in einer eigenen Linie produziert. Diese Ausgabe wird in erfasst ``und der Wortteilung unterzogen , wobei Wörter in Zeilenumbrüchen geteilt werden. Jedes Wort wird als Argument an gefüttert echo.

echo Christmas ...

Jedes Argument an echowird durch Leerzeichen getrennt ausgegeben, was zur gewünschten Ausgabe führt.

Kritixi Lithos
quelle
Es gibt nichts wirklich bashSpezifisches an dieser Lösung. Es erfordert GNU date, sedund seqzwar.
Kusalananda
-4 Bytes
Nahuel Fouilleul
@NahuelFouilleul Danke, netter Trick Graviszeichen Befehl Substitution zu vermeiden xargs verwenden und eval auf seq zu überspringen out
Kritixi Lithos
2

C (gcc) , 157 Bytes

Ich dachte, ich könnte das Einschließen vermeiden, time.haber das gab nur Segmentfehler.

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

Probieren Sie es online!

ErikF
quelle
IMO solltest du das weglassen, da #include <stdlib.h>es hier überhaupt nichts macht
ASCII-only
Schlagen Sie *t;f(u)anstelle von *t,u;f()und #import<time.h>anstelle von #include <time.h>und 5[t=localtime(&u)]anstelle vont=localtime(&u);t[5]
Ceilingcat
2

Groovy , 66 Bytes

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

Probieren Sie es online!

Mit freundlicher Genehmigung von @ ASCII-only

bdkosher
quelle
Sie müssen es ausdrucken, da dies ein vollständiges Programm und keine Funktion ist
ASCII
> Chistmas: /
Nur ASCII
Behoben, 149
Nur ASCII
123
Nur ASCII
Wenn Sie Ihren ersten nehmen und Groovy 2.5 verwenden, wird er auf 115 reduziert .
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
quelle
2

Scala , 116 113 Bytes

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

Probieren Sie es online!

Wo c 25ist die Abkürzung für Dec 25.

Kjetil S.
quelle
1
Ich denke, Sie können contains("c 25")anstelle vonmatches(".*c 25.*")
12Me21
Danke, drei Bytes weniger! 😁
Kjetil S.
wow, schön gemacht, Datum war schön
V. Courtois
2

JavaScript, 86 77 Bytes

Mit REPL wäre es

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

Kudos zu nur ASCII für -9 Bytes

Vadim
quelle
77
Nur ASCII
Bravo! Du hast es viel besser gemacht als ich. Darf ich anbieten, ein zusätzliches Byte zu rasieren? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c oder diese Variante: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s beide sind 76 Bytes.
Targumon
2

Lua , 137 118 Bytes.

118 Bytes

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 Bytes (früher)

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

Es ist erwähnenswert, dass es in LuaJIT nicht funktioniert (Syntaxfehler)

Tae Hanazono
quelle
Willkommen bei PPCG! Schöner erster Beitrag!
31.
1

MATLAB, 91 Bytes

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

Scala , 123 Bytes

Dank der Arbeit von ASCII-only.

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

Probieren Sie es online!

Scala + Joda-Time , 140 Bytes

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)

Läuft nicht in TIO, da dafür eine Joda-Time-Bibliothek erforderlich ist.

V. Courtois
quelle
No Joda, 154 . Leider kann ich java.util.Datehier nicht zur Arbeit kommen: /
Nur ASCII
148
Nur ASCII
Ah @ ASCII-only Ich habe object Main extends App{}beim Zählen keine Zeichen gezählt (weil ich auch in meinen anderen Scala-Antworten nicht gezählt habe). Wenn wir das rausholen, schlägst du mich ^^
V. Courtois
Der withDate()Anruf ist so teuer ...
V. Courtois
1. Denken Sie daran, dass Sie die Sprache als "Scala + Joda-Time" angeben müssen, da Sie eine externe Bibliothek verwenden und 2. meine Änderungen nicht verwenden möchten? Es ist kürzer und benötigt keine Bibliothek: P
Nur ASCII
1

05AB1E , 93 89 Bytes

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

Probieren Sie es online aus oder Probieren Sie es online mit einem emulierten, selbst festgelegten Datum von "Heute" aus .

Erläuterung:

05AB1E verfügt über keine eingebauten Daten, außer für den Empfang des aktuellen Jahres / Monats / Tages / Stunden / Minuten / Sekunden / Mikrosekunden. Daher werden die meisten Bytes für manuelle Berechnungen verwendet.

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

Sehen Sie sich meine Antwort an, um zu verstehen, wie wir am nächsten Tag weitermachen. (PS: 1¾ǝwurde durch ersetzt T`ǝ, da wir das auch counter_variablewoanders verwenden.)

Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte Verwendung des Wörterbuchs und Komprimieren großer Ganzzahlen ), um zu verstehen, warum dies so '»ˆist "eve". 'ŒÎist "christmas"; und Ž9Úist 1225.

Kevin Cruijssen
quelle
Schlaues Golfen!
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)));

Probieren Sie es online!

Verkörperung der Ignoranz
quelle
1
Ich glaube nicht, dass das am 30. November funktioniert ...
Neil,
Es wurde nun
Verkörperung der Ignoranz
Sind Sie sicher, dass der Monat> 25 ist?
Neil
Behoben ...
Verkörperung der Ignoranz
Ist das 1: 0 notwendig? Gibt & keine Ganzzahl zurück?
12. Mai,
0

Rot , 89 86 84 78 76 Bytes

-10 Bytes nur dank ASCII!

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

Probieren Sie es online!

Galen Ivanov
quelle
84
Nur ASCII
@ Natürlich nur ASCII Hmm! Danke!
Galen Ivanov
78
Nur ASCII
76
Nur ASCII
@ Nur ASCII Ihre 76-Byte-Version liefert zu Weihnachten kein korrektes Ergebnis: Datum als Argument Ich finde es dumm, nicht nur nowund nicht nur zu verwenden now/date. Vielen Dank für Ihre Verbesserungen!
Galen Ivanov