Codifica la data nel formato della vigilia di Natale


51

Il giorno in cui questo post è stato pubblicato è stata la vigilia di Natale. Domani sarà Natale. Ieri era la vigilia di Natale. Tra due giorni lo sarà

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

.

Il tuo compito è prendere la data di esecuzione del programma e codificarlo nel formato della vigilia di Natale.

  • Se il tuo programma viene eseguito a Natale, dovrebbe generare la stringa "Natale".
  • Se il tuo programma non viene eseguito a Natale, dovrebbe generare la stringa "Christmas", seguita dalla stringa "Eve" nvolte ripetute , dove nè il numero di giorni fino a Natale.
    • Si noti che questo deve essere basato sul prossimo Natale. Ad esempio, se il giorno è il 26 aprile 2019, è necessario eseguire il calcolo in base al 25 dicembre 2019, non a qualsiasi altro Natale.
    • Ricorda di contare i giorni bisestili.
  • Il Natale è il 25 dicembre di ogni anno.

Questo è , quindi vince il codice più corto! Si noti tuttavia che l'obiettivo non è quello di trovare il programma più breve in qualsiasi lingua, ma di trovare il programma più breve in ogni lingua particolare. Ad esempio, se trovi il programma C ++ più corto, vince questo concorso per C ++, anche se qualcuno trova un programma più breve in Python.


7
In qualche modo sapevo che questa sarebbe stata una sfida PPCG nel momento in cui ho visto il cartone animato - +1 da me
Black Owl Kai

25
Un fumetto xkcd che è stato pubblicato oggi. imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai

7
@BlackOwlKai LMBO Non ho nemmeno visto quel fumetto fino al tuo commento. Avevo già programmato di pubblicare questo post e stavo solo aspettando la vigilia di Natale. Le grandi menti pensano allo stesso modo, immagino?
PyRulez,

1
La data può essere un parametro?
Olivier Grégoire il

1
@ OlivierGrégoire uhm, lo permetterò se la lingua non ha la possibilità di ottenere la data corrente in un altro modo.
PyRulez,

Risposte:


52

SmileBASIC, 73 71 67 byte

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

Il programma stampa "Natale", quindi stampa "Eva" ogni volta che passa un giorno, fino al 25 dicembre. (12/25 = 0.48)
Potrebbe richiedere fino a un anno per l'esecuzione.


7
genio puro ...
FlipTack il

7
Questo mi ha fatto sorridere ...
Neil il

3
Bello! Una delle mie soluzioni JavaScript ha un approccio simile. Tuttavia, in JavaScript il tempo di attesa è solo uno sforzo. Come sta andando SmileBASIC in questo senso?
Targumon,

4
@ 12Me21 che ovviamente fallirebbe a causa dei secondi bisestili, questa versione sembra molto migliore.
Rɪᴋᴇʀ

5
+1 per pensare fuori dagli schemi e farmi ridere.
Tom,

24

Formula di Excel, 59 byte

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())

4
Penso che YEAR(TODAY()+6)ritorni sempre l'anno corretto, evitando così la condizione.
Neil,

3
Penso che YEAR(NOW()+6)funzioni anche con 2 byte in meno.
Ingegnere Toast il

2
Penso che "Natale" e REPT ("Eve", DATE (YEAR (NOW () + 6), 12,26) -NOW ()) siano ancora più brevi e credo che dovrebbero funzionare.
JeroendeK,

1
NOW()include il tempo, quindi non sarà un numero intero e non sono sicuro che REPTlo consentirebbe.
Me21,

2
ma questo non dà "Natale" il giorno di Natale. Verifica="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony,

12

Perl 6 , 61 47 byte

di '' Natale '~' Eve'x (Date.today ... ^ {. month == 12 &&. day == 25})

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

Provalo online!

-14 byte (!) Grazie a Jo King

Date.today ...^ /12\-25/è la sequenza di date che iniziano oggi e terminano il giorno prima di Natale. (L'espressione regolare /12\-25/viene confrontata con la rappresentazione in formato stringa delle date.) La stringa " Eve"viene replicata un numero di volte uguale alla lunghezza di quella sequenza e viene emessa dopo la stringa "Christmas".


Potresti fare "mese> 11" per salvare un byte?
Chrixbittinx,

2
Funzionerebbe /12.25/?
Kritixi Lithos il

2
@Cowsquack no, perché allora potrebbe coincidere con l'anno in date come:12025-12-24
Jo King,

Penso che sia sicuro presumere che non accadrà mai
12Me21,

8

R , 112 106 72 byte

Via @digEmAll e @ J.Doe

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

Provalo online!

La mia risposta originale era prima del chiarimento che il codice doveva prendere la data in cui il codice veniva eseguito come input. Potrebbe essere modificato come sopra per salvare molti byte, ma non mi preoccuperò.

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

Provalo online!

Spiegazione: tutti sono in chiesa, quindi ho tempo per farlo. Estrarre l'anno, forzare a numero intero. Crea il vettore del Natale di quell'anno e il Natale dell'anno successivo e sottrai la data di input per ottenere un vettore di due differenze tra la data di input e quei due Natale.

Scegli quello non negativo e cat"Natale" con tante "Eve".


Lo usi solo yuna volta, quindi puoi usarlo direttamente per 108 byte.
Giuseppe,

Inoltre avrebbe z[z>=0][1]funzionato invece di min?
Giuseppe,

73 byte . Secondo l'ultimo commento, il programma deve generare il testo in base al giorno in cui viene eseguito. Buon Natale BTW! : D
digEmAll

1
Ottimizzato il tuo per 72 byte , @digEmAll. Buon Natale!
J.Doe,

8

Windows PowerShell , 67 64 63 byte

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

Provalo online!

Riuscito a radere 3 byte 4 byte (grazie al quack di Cows ) usando l' -foperatore ormat invece di .ToString(), e quindi sottraendo la stringa di data dal valore numerico 1225 invece di fare un confronto con -ne. L'intero risultante verrà interpretato come un valore booleano per il condizionale in cui 0(che accadrà a Natale) viene interpretato come False(non inserire il ciclo) e qualsiasi altro valore viene interpretato come True(entra nel ciclo).

Poiché ora l'intero è sulla sinistra, la stringa della data verrà convertita nell'intero e verrà eseguita la matematica, al contrario della versione precedente in cui l' 1225intero è stato convertito in stringa per il confronto.

Versione originale


Windows PowerShell , 67 byte

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

Provalo online!

Usando un forloop in whilepratica, perché è più corto. Nella condizione del ciclo controlliamo la data corrente ( date, una forma abbreviata di Get-Date), reindirizzata ForEach-Objectall'alias %, usando il modulo che può invocare un metodo con un nome jolly; in questo caso il metodo è AddDays()in DateTimeoggetto, e il valore che indica che è $i.

Questo viene reindirizzato ForEach-Objectnuovamente per invocare il ToString()metodo, con stringa di formato Md(mese, quindi giorno, cifre minime poiché non ci interessa ciò che verrà dopo). Questa stringa viene quindi testata per vedere se non è uguale -neal numero 1225, che verrà convertito in una stringa per il confronto, salvandomi le virgolette.

Questo è il motivo per cui non importa che i mesi e i giorni siano a una sola cifra, non sarà mai ambiguo perché non c'è nessun altro giorno dell'anno a cui si dovrebbe stringere 1225.

Il ciclo continua fino a quando la stringa non è 1225 . All'inizio del programma, $isarà zero, quindi confronterà la data di oggi e il ciclo non verrà mai eseguito, ma per ogni altro giorno $iverrà incrementato nel corpo del ciclo, in modo che avremo un conteggio di quanti giorni fino al il prossimo Natale, tenendo conto automaticamente degli anni bisestili e se il Natale sia passato o meno quest'anno.

Dopo il loop abbiamo appena emesso la stringa Christmasconcatenata con il risultato di moltiplicare la stringa per eveil valore di $i(che, il giorno di Natale, sarà 0, senza risultato eve).


Apparentemente il ;dopo {$i++}è ridondante? (
Eeeek !!!

@Cowsquack nice! come non l'ho notato ?!
Briantist,

7

C # (compilatore interattivo Visual C #) , 89 byte

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

Provalo online!

-3 byte grazie a @JeppeStigNielsen!

La mia strategia è piuttosto semplice:

  1. Inizializza una variabile di loop talla data corrente
  2. Stampa Evese tnon è Natale
  3. Aggiungi un giorno a te ripeti

Ho provato alcune cose più elaborate, ma in questo modo ho richiesto il minor numero di byte.


... devi assegnare t a se stesso nell'incremento? Non ho i documenti davanti a me, ma in caso contrario, potresti risparmiare altri due byte.
Stackstuck,

1
oh, è una struttura. Ovviamente è. Non importa.
Stackstuck,

1
È possibile sostituire t.Month<12|t.Day!=25con il più breve $"{t:Md}"!="1225". Utilizza una stringa interpolata e una stringa di formattazione DateTime personalizzata.
Jeppe Stig Nielsen,

6

T-SQL, 92 88 byte

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

Modifica: salvato 4 byte grazie a @BradC.


Bel lavoro. Salva 2 con PRINT'Christmas'+...e altri 2 utilizzando DATEDIFF(D,invece diDATEDIFF(DAY,
BradC

@BradC Bello, grazie!
Neil

5

APL (Dyalog Unicode) , 76 63 byte SBCS

Programma completo. Presuppone ⎕IO←0(indicizzazione zero).

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

Provalo online!

⎕CY'dfns'c o p y nella biblioteca dfns

⎕TS attuale t ime s tamp come [anno, mese, giorno, ora, min, sec, ms]
days[c]  trova il numero di giorni [n] dal 1899-12-31 00: 00: 00.000
(⍳366) aggiungi i primi 366 numeri interi (0 ... 365) a che
date[c]  trova le date [n] che corrispondono a quei numeri (366 × 7 tabella; una colonna per unità)
 trasporre (7 × 366 tabella; una riga per unità)
1↓ rilasciare una riga (gli anni)
2↑ prendere le prime due righe (mesi e giorni)
12 25⍳⍨ trovano l'indice del primo Natale
 moltiplicato per quattro
' Eve'⍴⍨ che lo usano per rimodellare la lista dei caratteri
'Christmas ', aggiungendola a questo

[c]  codice di quella funzione
[n]  note per quella funzione


5

Python 2 , 111 103 byte

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

Provalo online!

Aggiornamento ispirato alla risposta di Richard Crossley .

Spiegazione:

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



4

JavaScript, 135 131 121 92 88 byte

La mia prima soluzione (ingenua) ( 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)

Imposta 2 date: ora e Natale di quest'anno. Se quest'ultimo non è ancora passato, li differenzia, se è passato, differisce a Natale del prossimo anno. Utilizza le differenze per il numero di ripetizioni.

(Cercando di) Pensare fuori dagli schemi ( 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()

La sfida specifica QUALE output è richiesto quando si esegue il programma in un determinato giorno, ma non specifica QUANDO restituirlo ...

Questo "dormirà" per un giorno, incrementerà un contatore di 1 e ripeterà fino a quando non è Natale per dare l'output.

Poiché JavaScript non garantisce il tempo di "sospensione", il risultato effettivo potrebbe essere spento.

È anche brutto per l'utilizzo della alertfunzione, il che significa che in realtà non abbiamo a che fare con JavaScript puro, ma anche con le API del browser (possiamo usare console.logal costo di 6 byte extra).

Un approccio migliore ( 121b ):

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

A partire da oggi, incrementa la data di un giorno fino a quando è Natale, quindi usa il contatore di quel ciclo per il numero di ripetizioni richieste.

Miglioramento (incluso passare attraverso un minificatore e usare il trucco di 12Me21 per radere 5b extra) ( 92b ):

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

Tocchi finali ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Per tutto quanto sopra, si assume REPL.
  • Guarda la proposta di Vadim - molto meglio della mia!

1
Penso che puoi usare t.getMonth()/t.getDate-.48per verificare se la data non è il 25 dicembre
12

1
Benvenuti nel sito! È possibile utilizzare un rientro di 4 spazi per migliorare l'aspetto dei blocchi di codice.
Wheat Wizard il

1
Benvenuti in PPCG!
Shaggy,

1
98 , printè necessario poiché questo non è un programma, a meno che 1. non lo trasformi in lambda o 2. dichiari di utilizzare un REPL
ASCII-only

1
t=new Date(+t+864e5)è più corto di 1 byte.
Andrew Svietlichnyy,

3

VBA (Excel), 108 byte

Copia in un modulo vuoto. Stampa sulla finestra immediata:

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

Nota: l' utilizzo :anziché le interruzioni di riga consente di risparmiare due byte per riga.

Si noti che l'editor VBA inserirà spazi aggiuntivi tra parole chiave, operatori, ecc ... e parentesi dopo la definizione secondaria, ma se si copia e incolla questo codice funzionerà (non riuscivo a liberarmi di quello spazio prima del &).

Non male per VBA (per una volta).


1
* Christmas: |
ASCII il

@ ASCII-only: rimozione dello spazio prima del &lancio di un errore
Barranka il

-1 byte. Grazie a @ ASCII-only per aver catturato l'errore di battitura
Barranka il

1
Puoi ridurlo a 71 caratteri convertendolo in una funzione finestra immediata e rimuovendo la variabile temporanea per now. Quando lo fai, dovrebbe assomigliare a qualcosa?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott,

3

Bash + data GNU, 72 73 byte

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • un byte salvato sostituendolo !=con-
  • un altro rimuove lo spazio extra
  • correzione -3 byte d=0, perché date -ddayè data + 1 e non funziona il 25/12

Provalo online


Hmmm, perché =~non funziona nel condizionale for-loop?
Kritixi Lithos il

poiché la condizione del ciclo for è un'espressione aritmetica, le parole sono costrette a un numero intero e anche il numero che inizia con 0 è assunto in ottale, ecco perché 1 è anteposto
Nahuel Fouilleul,


3

Bash , 68 65 61 byte

Golfato 4 byte grazie a Nahuel Fouilleul usando la ``sostituzione di comando e evalal posto di sed eexargs

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

Provalo online!

All'interno della `` sostituzione del comando , abbiamo

eval eseguire la seguente stringa come comandi di shell

  • date\ -d{0..366}day\;in caso di espansione di parentesi graffe{0..366} , questo risulta nella stringa date -d0day; date -d1day; date -d2day; ... date -d366day;, ogni comando in questa stringa calcola la data tra 0 e 366 giorni a partire dal presente risultante nell'output del formato Wed Dec 26 18:22:33 UTC 2018, con ciascuno nella propria riga

|sed su cui, chiamare i seguenti comandi sed

  • /c.25/Qse il regex /c.25/è abbinato, Quit senza stampare

  • \;cEve altrimenti cambia la linea in Eve

Tutto il numero richiesto di Eves viene prodotto ciascuno sulla propria riga. Questo output viene acquisito ``ed è soggetto alla suddivisione delle parole in cui le parole vengono suddivise su newline. Ogni parola è alimentata come argomento per echo.

echo Christmas ...

Ogni argomento da echostampare viene separato da spazi, ottenendo l'output desiderato.


Non c'è nulla di veramente bashspecifico in questa soluzione. Si richiede GNU date, sede seqperò.
Kusalananda,


@NahuelFouilleul Grazie, bel trucco di usare la sostituzione del comando backtick per evitare xargs e usare eval per saltare su seq
Kritixi Lithos

2

C (gcc) , 157 byte

Pensavo che sarei stato in grado di evitare di includere, time.hma questo ha dato solo errori di segmento.

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

Provalo online!


IMO dovresti lasciare fuori il #include <stdlib.h>, non come se fa niente qui
ASCII-only

Suggerisci *t;f(u)invece di *t,u;f()e #import<time.h>invece di #include <time.h>e 5[t=localtime(&u)]invece dit=localtime(&u);t[5]
ceilingcat il


2

Python 3, 106 byte

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

2

Scala , 116 113 byte

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

Provalo online!

Dov'è l' c 25abbreviazione di Dec 25.


1
Penso che puoi usare contains("c 25")invece dimatches(".*c 25.*")
Mee

Grazie, tre byte in meno! 😁
Kjetil S.

wow, ben fatto, a String of date è stato bello
V. Courtois il

2

JavaScript, 86 77 byte

Usando REPL lo sarebbe

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

Complimenti a ASCII solo per -9 byte



Bravo! Hai fatto molto meglio di me. Posso offrirmi di radere un byte in più? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c o questa variante: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s entrambi sono 76 byte.
Targumon,

2

Lua , 137 118 byte.

118 byte

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 byte (precedente)

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

Vale la pena notare che non funziona in LuaJIT (errore di sintassi)


Benvenuti in PPCG! Bel primo post!
Rɪᴋᴇʀ

1

MySQL, 102 byte

praticamente uguale alla risposta T-SQL di Neil . Sembra che non ci sia modo più breve in SQL.

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

Provalo online .


1

MATLAB, 91 byte

n=datetime
x=datetime(year(n+6),12,25)
s='Christmas'
while days(x-n)>=1 n=n+1 s=[s,' Eve'] end

MATLAB Senza looper, 100 byte

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

1

Scala , 123 byte

Grazie al lavoro di solo ASCII.

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

Provalo online!

Scala + Joda-Time , 140 byte

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)

Non funziona in TIO poiché richiede la libreria Joda-Time.


no joda, 154 . purtroppo non riesco java.util.Datea lavorare qui: /
ASCII il


Ah @ solo ASCII non ho contato i object Main extends App{}caratteri nel mio conteggio (perché non ho nemmeno risposto alle altre mie scale). Se lo eliminiamo, mi picchi ^^
V. Courtois il

La withDate()chiamata è così costosa ...
V. Courtois,

1. ricordi che devi specificare la lingua come "Scala + Joda-Time" poiché usi una libreria esterna e 2. non utilizzerai le mie modifiche? è più breve e non ha bisogno di una libreria: P
ASCII il

1

05AB1E , 93 89 byte

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

Provalo online o Provalo online con una data auto-specificata emulata di "oggi" .

Spiegazione:

05AB1E non ha alcun builtin per le date, ad eccezione della ricezione dell'anno / mese / giorno / ore / minuti / secondi / microsecondi correnti, quindi la maggior parte dei byte viene utilizzata per i calcoli manuali.

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

Vedi questa mia risposta per capire come andiamo al giorno successivo. (PS: 1¾ǝè stato sostituito con T`ǝ, poiché usiamo anche counter_variablealtrove.)

Vedere questo 05AB1E punta del mio (sezioni come utilizzare il dizionario? E Come comprimere grandi numeri interi? ) Per capire perché '»ˆè "eve"; 'ŒÎè "christmas"; ed Ž9Úè 1225.


Golf intelligente!
MilkyWay90

0

C # (compilatore interattivo Visual C #) , 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)));

Provalo online!


1
Non credo che funzioni per il 30 novembre ...
Neil

Risolto ora, ho dimenticato di aggiungere un segno di spunta se era dicembre o no
Incarnazione dell'ignoranza il

Sei sicuro del mese> 25?
Neil,

Risolto il problema ora ...
Incarnazione dell'ignoranza il

Il? 1: 0 è nessesary? non restituisce un numero intero?
Me21,

0

Rosso , 89 86 84 78 76 byte

-10 byte grazie solo a ASCII!

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

Provalo online!



@ Solo ASCII Hmm, ovviamente! Grazie!
Galen Ivanov,



@ ASCII-only La tua versione a 76 byte non dà il risultato corretto se eseguita a Natale: la data come argomento mi sento stupida per non aver usato solo nowe non now/date. Grazie per i tuoi miglioramenti!
Galen Ivanov,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.