Zakoduj datę w formacie wigilijnym

51

Dzień opublikowania tego postu był wigilijny. Jutro będą święta. Wczoraj była wigilia Bożego Narodzenia. Będzie za dwa dni

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

.

Twoim zadaniem jest ustalenie daty uruchomienia programu i zakodowanie go w formacie wigilijnym.

  • Jeśli twój program jest uruchomiony w Boże Narodzenie, powinien wypisać ciąg „Boże Narodzenie”.
  • Jeśli twój program nie jest uruchamiany w Boże Narodzenie, powinien wypisać ciąg „Boże Narodzenie”, a następnie ciąg „Ewa” powtórzony nrazy, gdzie njest liczba dni do Bożego Narodzenia.
    • Pamiętaj, że musi to być oparte na następne Święta Bożego Narodzenia. Na przykład, jeśli dzień przypada na 26 kwietnia 2019 r., Musisz wykonać obliczenia na podstawie 25 grudnia 2019 r., A nie innych świąt Bożego Narodzenia.
    • Pamiętaj, aby liczyć dni przestępne.
  • Boże Narodzenie przypada na 25 grudnia każdego roku.

To jest , więc wygrywa najkrótszy kod! Pamiętaj jednak, że celem nie jest znalezienie najkrótszego programu w żadnym języku, ale znalezienie najkrótszego programu w każdym konkretnym języku. Na przykład, jeśli znajdziesz najkrótszy program w C ++, wygrywa on konkurs dla C ++, nawet jeśli ktoś znajdzie krótszy program w Pythonie.

PyRulez
źródło
7
Jakoś wiedziałem, że to będzie wyzwanie PPCG, gdy tylko zobaczyłem kreskówkę - +1 ode mnie
Czarnej Sowy Kai
25
Cartoon xkcd, który został opublikowany dzisiaj. imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai
7
@BlackOwlKai LMBO Nie widziałem nawet tego komiksu, dopóki nie skomentowałeś. Już planowałem to opublikować i tylko czekałem na Wigilię Bożego Narodzenia. Chyba wielkie umysły myślą podobnie?
PyRulez
1
Czy data może być parametrem?
Olivier Grégoire,
1
@ OlivierGrégoire uhm, pozwolę na to, jeśli język nie ma możliwości uzyskania aktualnej daty w inny sposób.
PyRulez,

Odpowiedzi:

52

SmileBASIC, 73 71 67 bajtów

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

Program drukuje „Boże Narodzenie”, a następnie „Ewa” za każdym razem, gdy mija dzień, aż do 25 grudnia. (12/25 = 0,48)
Uruchomienie może potrwać nawet rok.

12Me21
źródło
7
czysty geniusz ...
FlipTack
7
To mnie rozśmieszyło ...
Neil,
3
Miły! Jedno z moich rozwiązań JavaScript ma podobne podejście. Jednak w JavaScript czas oczekiwania jest najlepszym wysiłkiem. Jak radzi sobie SmileBASIC w tym zakresie?
targumon
4
@ 12Me21, który oczywiście zawiódłby z powodu sekund przestępnych, ta wersja wygląda znacznie lepiej.
Rɪᴋᴇʀ
5
+1 za nieszablonowe myślenie i rozśmieszanie mnie.
Tom
24

Formuła Excel, 59 bajtów

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
Richard Crossley
źródło
4
Myślę, że YEAR(TODAY()+6)zawsze zwraca poprawny rok, unikając w ten sposób warunku.
Neil,
3
Myślę, że YEAR(NOW()+6)działa również z 2 bajtami mniej.
Inżynier Toast
2
Myślę, że = „Christmas” i REPT („Eve”, DATE (YEAR (NOW () + 6), 12,26) -NOW ()) jest jeszcze krótszy i uważam, że powinien działać.
JeroendeK
1
NOW()obejmuje czas, więc nie będzie liczbą całkowitą i nie jestem pewien REPT, czy na to pozwolę.
maja 21
2
ale to nie daje „Bożego Narodzenia” w Boże Narodzenie. Sprawdź="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony
12

Perl 6 , 61 47 bajtów

powiedz „Christmas” ~ „Eve'x (Date.today ... ^ {. month == 12 &&. day == 25})

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

Wypróbuj online!

-14 bajtów (!) Dzięki Jo King

Date.today ...^ /12\-25/jest sekwencją dat rozpoczynających się dziś i kończących dzień przed Bożym Narodzeniem. (Wyrażenie regularne /12\-25/jest porównywane z ciągiem reprezentującym daty.) Łańcuch " Eve"jest replikowany kilka razy równy długości tej sekwencji i jest wyprowadzany po ciągu "Christmas".

Sean
źródło
Czy możesz zrobić „miesiąc> 11”, aby zapisać bajt?
chrixbittinx,
2
Czy /12.25/zadziała?
Kritixi Lithos
2
@ Cowsquack nie, ponieważ wtedy może pasować do roku w datach takich jak12025-12-24
Jo King
Myślę, że można bezpiecznie założyć, że to się nigdy nie wydarzy
12
8

R , 112 106 72 bajtów

Via @digEmAll i @ J.Doe

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

Wypróbuj online!

Moja pierwotna odpowiedź była wcześniejsza niż wyjaśnienie, że kod miał przyjmować datę uruchomienia kodu jako danych wejściowych. Można go zmodyfikować jak wyżej, aby zaoszczędzić wiele bajtów, ale nie będę się tym przejmować.

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

Wypróbuj online!

Wyjaśnienie: wszyscy są w kościele, więc mam na to czas. Wyodrębnij rok, wymusz na liczbę całkowitą. Zrób wektor świąt Bożego Narodzenia na rok i Boże Narodzenie na następny rok i odejmij datę wejściową, aby uzyskać wektor dwóch różnic między datą wejściową a tymi dwiema Xmasami.

Wybierz nieujemną i cat„Świąteczną” z tyloma „Evami”.

ngm
źródło
Używasz tylko yraz, więc możesz użyć go bezpośrednio dla 108 bajtów.
Giuseppe,
Czy też z[z>=0][1]działałoby zamiast min?
Giuseppe,
73 bajty . Zgodnie z ostatnim komentarzem program musi wypisać tekst na podstawie dnia uruchomienia. Wesołych świąt BTW! : D
digEmAll
1
Poprawiłem twój dla 72 bajtów , @digEmAll. Wesołych Świąt!
J.Doe
8

Windows PowerShell , 67 64 63 bajtów

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

Wypróbuj online!

Udało się ogolił 3 bajty 4 bajty (dzięki Krowy quack ) za pomocą -foperatora Ormat zamiast .ToString(), a następnie odjęcie ciąg dat z wartością liczbową 1225 zamiast robić porównania z -ne. Wynikowa liczba całkowita będzie interpretowana jako wartość logiczna dla warunku, w którym 0(co nastąpi w Boże Narodzenie) jest interpretowane jako False(nie wchodź w pętlę), a każda inna wartość jest interpretowana jako True(wchodź w pętlę).

Ponieważ liczba całkowita znajduje się teraz po lewej stronie, ciąg daty zostanie przekonwertowany na liczbę całkowitą i matematyka zostanie wykonana, w przeciwieństwie do poprzedniej wersji, w której 1225liczba całkowita została przekonwertowana na ciąg dla porównania.

Orginalna wersja


Windows PowerShell , 67 bajtów

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

Wypróbuj online!

Używanie forpętli jako whilepętli w zasadzie, ponieważ jest krótsza. W stanie pętli sprawdzamy bieżącą datę ( dateskróconą formę Get-Date), przesyłaną potokowo do ForEach-Objectaliasu %, używając formularza, który może wywoływać metodę według nazwy wieloznacznej; w tym przypadku metoda jest AddDays()na DateTimeobiekcie, a wartość, którą podajemy, to $i.

To jest przesyłane ForEach-Objectponownie do wywołania ToString()metody z ciągiem formatu Md(miesiąc, następnie dzień, minimalna liczba cyfr, ponieważ nie dbamy o to, co będzie dalej). Ten ciąg jest następnie testowany, aby sprawdzić, czy nie jest równy -neliczbie 1225, która zostanie przekonwertowana na ciąg do porównania, co oszczędza mi cytatów.

Dlatego nie ma znaczenia, że ​​miesiące i dni są jednocyfrowe, nigdy nie będzie dwuznaczny, ponieważ nie ma innego dnia w roku, który by się do tego zobowiązał 1225.

Pętla trwa do momentu, gdy ciąg będzie 1225 . Na początku programu $iwyniesie zero, więc będzie porównywał dzisiejszą datę, a pętla nigdy się nie wykona, ale dla każdego innego dnia $izostanie zwiększona w treści pętli, dzięki czemu będziemy mieli liczbę dni do następne Święta Bożego Narodzenia, automatycznie uwzględniające lata przestępne i czy Boże Narodzenie minęło w tym roku.

Po pętli po prostu wyprowadzamy ciąg Christmaspołączony z wynikiem pomnożenia ciągu everazy razy wartość $i(która w dzień Bożego Narodzenia będzie 0, nie powodując żadnych eves).

briantist
źródło
Najwyraźniej ;po {$i++}jest zbędny? (też wow, znów
objąłeś
@Cowsquack nice! jak tego nie zauważyłem ?!
briantist
7

C # (interaktywny kompilator Visual C #) , 89 bajtów

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

Wypróbuj online!

-3 bajty dzięki @JeppeStigNielsen!

Moja strategia jest dość prosta:

  1. Zainicjuj zmienną pętli tdo bieżącej daty
  2. Wydrukuj, Evejeśli tnie są święta
  3. Dodaj dzień ti powtórz

Próbowałem bardziej wymyślnych rzeczy, ale w ten sposób wymagało najmniej bajtów.

dana
źródło
... czy musisz przypisać t do siebie w inkrementorze? Nie mam przed sobą dokumentów, ale jeśli nie, możesz zaoszczędzić dwa bajty więcej.
Stackstuck
1
och, to jest struktura. Oczywiście, że jest. Nieważne.
Stackstuck
1
Możesz zastąpić t.Month<12|t.Day!=25krótszym $"{t:Md}"!="1225". Wykorzystuje interpolowany ciąg i niestandardowy ciąg formatujący DateTime.
Jeppe Stig Nielsen
6

T-SQL, 92 88 bajtów

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

Edycja: Zapisano 4 bajty dzięki @BradC.

Neil
źródło
Dobra robota. Zaoszczędź 2 z PRINT'Christmas'+...i 2 więcej, używając DATEDIFF(D,zamiastDATEDIFF(DAY,
BradC
@BradC Fajnie, dzięki!
Neil
5

APL (Dyalog Unicode) , 76 63 bajtów SBCS

Pełny program Zakłada ⎕IO←0(indeksowanie zera).

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

Wypróbuj online!

⎕CY'dfns'c o p y w bibliotece dfns

⎕TS Prąd t ime s ubijać w [rok, miesiąc, dzień, godzina, minuta, s, MS]
days[c]  Produkt liczbę dni [N] od 31.12.1899 00: 00: 00.000
(⍳366) dodawania pierwszych 366 liczb całkowitych (0 … 365) do tego
date[c]  znajdź daty [n], które odpowiadają tym liczbom (tabela 366 × 7; jedna kolumna na jednostkę)
 transponuj (tabela 7 × 366; jeden wiersz na jednostkę)
1↓ upuść jeden wiersz (lata)
2↑ weź pierwsze dwa wiersze (miesiące i dni)
12 25⍳⍨ znajdują indeks pierwszego Bożego Narodzenia
 pomnożony przez cztery,
' Eve'⍴⍨ które służą do przekształcenia listy znaków,
'Christmas ', dołączają ją do tego

[c]  kod tej funkcji
[n]  uwagi na temat tej funkcji

Adám
źródło
5

Python 2 , 111 103 bajtów

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

Wypróbuj online!

Aktualizacja zainspirowana odpowiedzią Richarda Crossleya .

Wyjaśnienie:

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
Triggernometria
źródło
4

PHP, 61 bajtów

Christmas<?for($t=time();date(md,$t+=86400)-1226;)echo" Eve";

Uruchom -nlub wypróbuj online .

Tytus
źródło
4

JavaScript, 135 131 121 92 88 bajtów

Moje pierwsze (naiwne) rozwiązanie ( 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)

Ustawia 2 daty: teraz i Boże Narodzenie tego roku. Jeśli to drugie jeszcze nie minęło, to po prostu je różni, jeśli minęło, różni się od świąt Bożego Narodzenia w przyszłym roku. Używa albo różnic dla liczby powtórzeń.

(Próbuje) Think Outside the Box ( 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()

Wyzwanie określa, które dane wyjściowe są wymagane podczas uruchamiania programu w danym dniu, ale nie określa KIEDY, aby je zwrócić ...

Spowoduje to po prostu „przespanie” jednego dnia, zwiększenie licznika o 1 i powtarzanie do Xmas w celu uzyskania wyniku.

Ponieważ JavaScript nie gwarantuje czasu „uśpienia”, rzeczywisty wynik może być wyłączony.

Jest to również brzydkie z powodu korzystania z alertfunkcji, co oznacza, że ​​tak naprawdę nie mamy do czynienia z czystym JavaScriptem, ale także z interfejsami API przeglądarki (możemy użyć console.logkosztem 6 dodatkowych bajtów).

Lepsze podejście ( 121b ):

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

Począwszy od dzisiaj, zwiększaj datę o jeden dzień aż do Bożego Narodzenia, a następnie użyj licznika tej pętli dla wymaganej liczby powtórzeń.

Ulepszenie (w tym przejście przez minifikator i użycie sztuczki 12Me21, aby zgolić dodatkowe 5b) ( 92b ):

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

Ostatnie poprawki ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Dla wszystkich powyższych założono REPL.
  • Zobacz poddanie się Vadima - znacznie lepsze niż moje!
targumon
źródło
1
Myślę, że można użyć, t.getMonth()/t.getDate-.48aby sprawdzić, czy data nie jest 25 grudnia
maja 21
1
Witamy na stronie! Możesz użyć wcięcia o 4 spacje, aby poprawić wygląd bloków kodu.
Wheat Wizard
1
Witamy w PPCG!
Kudłaty
1
98 , printjest potrzebny, ponieważ jest to program, a nie funkcja, chyba że 1. zmienisz go w lambda lub 2. oświadczysz, że używasz REPL
tylko ASCII
1
t=new Date(+t+864e5)jest o 1 bajt krótszy.
Andrew Svietlichnyy
3

VBA (Excel), 108 bajtów

Skopiuj w pustym module. Drukuje do okna Natychmiastowe:

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

Uwaga: Użycie :zamiast podziału linii oszczędza dwa bajty na linię.

Zauważ, że edytor VBA wstawi dodatkowe spacje między słowami kluczowymi, operatorami itp. ... i nawiasami po definicji Sub, ale jeśli skopiujesz i wkleisz ten kod, to zadziała (nie mogłem pozbyć się tego miejsca przed &).

Nieźle jak na VBA (choć raz).

Barranka
źródło
1
* Christmas: |
Tylko ASCII,
@ Tylko ASCII: usunięcie spacji przed &zgłoszeniem błędu
Barranka
-1 bajtów. Dzięki @ ASCII-tylko za złapanie literówki
Barranka
1
Możesz to zmniejszyć do 71 znaków, przekształcając je w funkcję bezpośredniego okna i usuwając zmienną tymczasową dla now. Kiedy to zrobisz, powinno to wyglądać ?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott
3

Data Bash + GNU, 72 73 bajty

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • zapisano jeden bajt, zastępując !=go-
  • kolejne usunięcie dodatkowej przestrzeni
  • napraw -3 bajty d=0, ponieważ date -ddayjest to data + 1 i nie działa 25/12

Wypróbuj online

Nahuel Fouilleul
źródło
Hmmm, dlaczego =~nie działa w warunkowym for-loop?
Kritixi Lithos
ponieważ warunek pętli for jest wyrażeniem arytmetycznym, słowa są wymuszane na liczbę całkowitą, a liczba rozpoczynająca się od 0 jest przyjmowana w postaci ósemkowej, dlatego 1 jest poprzedzane
Nahuel Fouilleul
3

Bash , 68 65 61 bajtów

Grał w golfa 4 bajty dzięki Nahuelowi Fouilleulowi , używając ``zastępowania poleceń i evalzamiast sed eixargs

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

Wypróbuj online!

Wewnątrz `` podstawienia polecenia mamy

eval uruchom następujący ciąg jako polecenia powłoki

  • date\ -d{0..366}day\;pod rozszerzalności usztywniającego z {0..366}tego wynika, w ciągu date -d0day; date -d1day; date -d2day; ... date -d366day;, każde polecenie tego łańcucha obliczania termin pomiędzy 0 i 366 dni od obecnej powodując wyjścia formatu Wed Dec 26 18:22:33 UTC 2018, przy czym każdy w swojej własnej linii

|sed po czym wywołaj następujące polecenia sed

  • /c.25/Qjeśli wyrażenie regularne /c.25/jest dopasowane, Qużyj bez drukowania

  • \;cEve w przeciwnym razie zmień linię na Eve

Wszystkie wymagane liczby Eves są produkowane na osobnych liniach. Wyjście to jest ujęte w ``, i podlega podziałowi na słowa , gdzie słowa są podzielone na nowej linii. Każde słowo jest podawane jako argument do echo.

echo Christmas ...

Każdy argument do echojest drukowany przez oddzielenie spacjami, co daje pożądany wynik.

Kritixi Lithos
źródło
W bashtym rozwiązaniu nie ma nic konkretnego. Wymaga to GNU date, seda seqjednak.
Kusalananda
-4 bajty
Nahuel Fouilleul
@NahuelFouilleul Dzięki, niezła sztuczka polegająca na użyciu zastępowania polecenia backtick w celu uniknięcia xargs i używania eval do pominięcia na seq
Kritixi Lithos
2

C (gcc) , 157 bajtów

Pomyślałem, że będę w stanie uniknąć włączenia, time.hale to tylko spowodowało błędy segmentu.

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

Wypróbuj online!

ErikF
źródło
IMO należy pominąć #include <stdlib.h>, a nie jak to ma w ogóle nic tutaj
ASCII tylko
Sugeruj *t;f(u)zamiast *t,u;f()i #import<time.h>zamiast #include <time.h>i 5[t=localtime(&u)]zamiastt=localtime(&u);t[5]
ceilingcat
2

Groovy , 66 bajtów

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

Wypróbuj online!

Dzięki uprzejmości @ ASCII

bdkosher
źródło
Musisz go wydrukować, ponieważ jest to pełny program, a nie funkcja
tylko ASCII
> Chistmas: /
Tylko ASCII,
naprawiono, 149
tylko ASCII,
123
Tylko ASCII,
biorąc pierwszy i używając Groovy 2.5, zmniejsza go do 115 .
bdkosher
2

Python 3, 106 bajtów

from datetime import*
d=date.today()
print("Christmas"+" Eve"*(date((d+timedelta(6)).year,12,25)-d).days)
Albert Capp
źródło
2

Scala , 116 113 bajtów

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

Wypróbuj online!

Gdzie c 25jest skrót Dec 25.

Kjetil S.
źródło
1
Myślę, że możesz użyć contains("c 25")zamiastmatches(".*c 25.*")
12Me21
Dzięki, trzy bajty mniej! 😁
Kjetil S.
wow, ładnie zrobione, randka była fajna
V. Courtois
2

JavaScript, 86 77 bajtów

Przy użyciu REPL byłoby to

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

Wyrazy uznania dla ASCII tylko dla -9 bajtów

Vadim
źródło
77
Tylko ASCII,
Brawo! Poradziłeś sobie znacznie lepiej niż ja. Czy mogę zaoferować ogolenie dodatkowego bajtu? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c lub ten wariant: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s oba mają 76 bajtów.
targumon
2

Lua , 137 118 bajtów.

118 bajtów

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 bajtów (poprzedni)

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

Warto zauważyć, że nie działa w LuaJIT (błąd składniowy)

Tae Hanazono
źródło
Witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
1

MySQL, 102 bajty

prawie tak samo jak odpowiedź T-SQL Neila . Wydaje się, że nie ma krótszej drogi w SQL.

select concat("Christmas",repeat(" Eve",datediff(concat(year(now()+interval 6 day),"-12-25"),now())));

Wypróbuj online .

Tytus
źródło
1

MATLAB, 91 bajtów

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 bajtów

x=datenum(datetime(floor((now+5)/365.2425),12,25))
d=x-now
['Christmas' repmat(' Eve',1,min(d(d>=0)))]
Anthony
źródło
1

Scala , 123 bajty

Dzięki pracy ASCII-only.

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

Wypróbuj online!

Scala + czas Joda , 140 bajtów

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)

Nie działa w TIO, ponieważ wymaga biblioteki Joda-Time.

V. Courtois
źródło
bez Jody, 154 . niestety nie mogę java.util.Datetutaj dostać się do pracy: /
Tylko ASCII,
148
Tylko ASCII,
Ach, tylko w ASCII, nie object Main extends App{}liczyłem znaków w moim zliczaniu (ponieważ nie miałem też innych odpowiedzi Scali). Jeśli to wyciągniemy, pobijesz mnie ^^
V. Courtois,
withDate()Rozmowa jest tak drogie ...
V. Courtois
1. pamiętasz, że musisz określić język jako „Scala + Joda-Time”, ponieważ korzystasz z zewnętrznej biblioteki i 2. nie zamierzasz używać moich zmian? jest krótszy plus nie potrzebuje biblioteki: P
tylko ASCII
1

05AB1E , 93 89 bajtów

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

Wypróbuj online lub Wypróbuj online z emulowaną, podaną przez siebie datą „dzisiaj” .

Wyjaśnienie:

05AB1E nie ma żadnych wbudowanych dat, z wyjątkiem otrzymania bieżącego roku / miesiąca / dnia / godzin / minut / sekund / mikrosekund, więc większość bajtów jest wykorzystywana do obliczeń ręcznych.

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

Zobacz moją odpowiedź, aby zrozumieć, jak idziemy do następnego dnia. (PS: 1¾ǝzostał zastąpiony T`ǝ, ponieważ używamy również counter_variablegdzie indziej.)

Zobacz tę końcówkę 05AB1E kopalni (sekcje Jak korzystać ze słownika? I Jak skompresować dużych liczb całkowitych? ) , Aby zrozumieć, dlaczego '»ˆjest "eve"; 'ŒÎjest "christmas"; i Ž9Újest 1225.

Kevin Cruijssen
źródło
Sprytna gra w golfa!
MilkyWay90
0

C # (interaktywny kompilator Visual C #) , 141 bajtów

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

Wypróbuj online!

Wcielenie ignorancji
źródło
1
Nie sądzę, że to zadziała 30 listopada ...
Neil,
Naprawiono teraz, zapomniałem dodać czek, czy był grudzień, czy nie
Embodiment of Ignorance
Czy jesteś pewien, że miesiąc> 25?
Neil,
Naprawiono to teraz ...
Embodiment of Ignorance
Czy jest to konieczne? 1: 0? nie zwraca i zwraca liczbę całkowitą?
maja 21
0

Czerwony , 89 86 84 78 76 bajtów

-10 bajtów dzięki tylko ASCII!

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

Wypróbuj online!

Galen Iwanow
źródło
84
Tylko ASCII,
@ Hmm, tylko ASCII, oczywiście! Dziękuję Ci!
Galen Iwanow
78
Tylko ASCII,
76
Tylko ASCII,
@ Tylko ASCII Twoja 76-bajtowa wersja nie daje poprawnego wyniku podczas uruchamiania w Boże Narodzenie: Data jako argument Głupio czuję, że nie używam tylko nowi nie now/date. Dziękujemy za twoje ulepszenia!
Galen Iwanow
0

Perl 5 , 68 bajtów

print"Christmas";print" Eve"while localtime($i++*86400+time)!~/c 25/

Wypróbuj online!

Gdzie c 25jest skrót Dec 25.

Kjetil S.
źródło