Codifique a data no formato da véspera de Natal

51

O dia em que este post foi publicado foi na véspera de Natal. Amanhã será Natal. Ontem foi véspera de Natal. Em dois dias será

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

.

Seu trabalho é pegar a data em que o programa é executado e codificá-lo no formato da véspera de Natal.

  • Se o seu programa for executado no Natal, ele deverá gerar a string "Christmas".
  • Se o seu programa não for executado no Natal, ele deverá gerar a string "Christmas", seguida pela string "Eve" nvezes repetidas , onde né o número de dias até o Natal.
    • Observe que isso deve ser baseado no próximo Natal. Por exemplo, se o dia for 26 de abril de 2019, você deverá fazer seu cálculo com base em 25 de dezembro de 2019, e não em qualquer outro Natal.
    • Lembre-se de contar dias bissextos.
  • O Natal é 25 de dezembro de cada ano.

Isso é , então o código mais curto vence! Observe, porém, que o objetivo não é encontrar o programa mais curto em qualquer idioma, mas encontrar o programa mais curto em cada idioma específico. Por exemplo, se você encontrar o programa C ++ mais curto, ele vence este concurso para C ++, mesmo que alguém encontre um programa mais curto no Python.

PyRulez
fonte
7
De alguma forma, eu sabia que esse seria um desafio do PPCG no momento em que vi o desenho animado - +1 de mim
Black Owl Kai
25
Um desenho animado xkcd publicado hoje. imgs.xkcd.com/comics/christmas_eve_eve.png
Black Owl Kai
7
@BlackOwlKai LMBO Eu nem vi esse quadrinho até o seu comentário. Eu já tinha planejado postar isso e estava apenas esperando a véspera de Natal. Grandes mentes pensam da mesma forma, eu acho?
PyRulez
11
A data pode ser um parâmetro?
Olivier Grégoire
11
@ OlivierGrégoire uhm, permitirei que, se o idioma não puder obter a data atual de outra maneira.
PyRulez

Respostas:

52

SmileBASIC, 73 71 67 bytes

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

O programa imprime "Natal", depois imprime "Eva" toda vez que um dia passa, até 25 de dezembro. (25/12 = 0,48)
Pode levar até um ano para ser executado.

12Me21
fonte
7
gênio puro ...
FlipTack
7
Isso me fez sorrir ...
Neil
3
Agradável! Uma das minhas soluções JavaScript usa uma abordagem semelhante. No entanto, em JavaScript, o tempo de espera é apenas o melhor esforço. Como a SmileBASIC está se saindo nesse sentido?
targumon
4
@ 12Me21 que obviamente falharia devido a segundos bissextos, esta versão parece muito melhor.
Rɪᴋᴇʀ
5
+1 por pensar fora da caixa e me fazer rir.
Tom
24

Fórmula do Excel, 59 bytes

="Christmas"&REPT(" Eve",DATE(YEAR(NOW()+6),12,25)-TODAY())
Richard Crossley
fonte
4
Eu acho que YEAR(TODAY()+6)sempre retorna o ano correto, evitando assim a condição.
30518 Neil
3
Eu acho que YEAR(NOW()+6)funciona bem com 2 bytes a menos.
Engineer Toast
2
Eu acho que = "Christmas" & REPT ("Eve", DATE (YEAR (NOW () + 6), 12,26) -NOW ()) é ainda mais curto e acredito que deve funcionar.
JeroendeK
11
NOW()inclui o horário, portanto não será um número inteiro e não tenho certeza se REPTisso permitiria.
12Me21
2
mas isso não dá "Natal" no dia de Natal. Verifique="Christmas"&REPT(" Eve",DATE(YEAR(DATE(2018,12,25)+6),12,26)-DATE(2018,12,25))
Anthony
12

Perl 6 , 61 47 bytes

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

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

Experimente online!

-14 bytes (!) Graças a Jo King

Date.today ...^ /12\-25/é a sequência de datas que começa hoje e termina no dia anterior ao Natal. (A expressão regular /12\-25/é comparada com a representação da sequência das datas.) A sequência " Eve"é replicada um número de vezes igual ao comprimento dessa sequência e é gerada após a sequência "Christmas".

Sean
fonte
Você poderia fazer "month> 11" para salvar um byte?
Chrixbittinx
2
Funcionaria /12.25/?
Kritixi Lithos
2
@ Cowsquack não, porque então pode coincidir com o ano em datas como12025-12-24
Jo King
Eu acho que é seguro supor que isso nunca aconteça #
12Me21 28/08/18
8

R , 112 106 72 bytes

Via @digEmAll e @ J.Doe

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

Experimente online!

Minha resposta original foi anterior ao esclarecimento de que o código deveria levar a data em que o código é executado como entrada. Pode ser modificado como acima para economizar muitos bytes, mas não vou me incomodar.

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

Experimente online!

Explicação: todo mundo está na igreja, então eu tenho tempo para fazer isso. Extraia o ano, coagir ao número inteiro. Faça um vetor do Xmas daquele ano e do Xmas do ano seguinte e subtraia a data de entrada para obter um vetor de duas diferenças entre a data de entrada e esses dois Xmas.

Escolha o não negativo e o cat"Natal" com tantos "Eves".

ngm
fonte
Você só usa yuma vez para poder usá-lo diretamente por 108 bytes.
Giuseppe
Também z[z>=0][1]funcionaria em vez de min?
Giuseppe
73 bytes . De acordo com o último comentário, o programa deve produzir o texto com base no dia em que é executado. Feliz Natal BTW! : D
digEmAll
11
Ajustou o seu para 72 bytes , @digEmAll. Feliz Natal!
J.Doe
8

Windows PowerShell , 67 64 63 bytes

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

Experimente online!

Conseguiu cortar 3 bytes 4 bytes (graças ao Cows charlatão ) usando o -foperador ormat em vez de .ToString()e subtraindo a sequência de datas do valor numérico 1225 em vez de fazer uma comparação com -ne. O número inteiro resultante será interpretado como um booleano para a condição condicional em 0que (o que acontecerá no Natal) é interpretada como False(não insira o loop) e qualquer outro valor é interpretado como True(insira o loop).

Como o número inteiro está à esquerda agora, a sequência de datas será convertida para o número inteiro e a matemática será feita, em oposição à versão anterior em que o 1225número inteiro foi convertido em sequência para a comparação.

Versão original


Windows PowerShell , 67 bytes

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

Experimente online!

Usando um forloop como um whileloop basicamente, porque é mais curto. Na condição de loop, verificamos a data atual ( date, uma forma abreviada de Get-Date), canalizada para ForEach-Objecto alias de %, usando o formulário que pode chamar um método pelo nome curinga; nesse caso, o método está AddDays()no DateTimeobjeto e o valor que atribuímos é $i.

Isso é canalizado ForEach-Objectnovamente para invocar o ToString()método, com formato string Md(mês, depois dia, dígitos mínimos, pois não nos importamos com o que vem a seguir). Essa sequência é testada para verificar se não é igual -neao número 1225, que será convertido em uma sequência para comparação, salvando-me as aspas.

É por isso que não importa que os meses e os dias sejam de um dígito, nunca será ambíguo, porque não há outro dia do ano em que isso se restrinja 1225.

O loop continua até que a string seja 1225 . No início do programa, $iserá zero, comparando a data de hoje, e o loop nunca será executado, mas em qualquer outro dia $iserá incrementado no corpo do loop, para que possamos contar quantos dias até o próximo Natal, representando automaticamente os anos bissextos e se o Natal passou ou não este ano.

Após o loop, apenas produzimos a string Christmasconcatenada com o resultado da multiplicação da string evepelo valor de $i(que, no dia de Natal, será 0, resultando em nenhum eves).

briantist
fonte
Aparentemente, o ;depois {$i++}é redundante? (também wow você tomou a liderança sobre o bash novamente)
Kritixi Lithos
@Cowsquack nice! como eu não percebi isso ?!
Briantist
7

C # (compilador interativo do Visual C #) , 89 bytes

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

Experimente online!

-3 bytes graças a @JeppeStigNielsen!

Minha estratégia é bem direta:

  1. Inicializar uma variável de loop tpara a data atual
  2. Imprimir Evese tnão for Natal
  3. Adicione um dia te repita

Tentei algumas coisas mais chiques, mas dessa maneira exigi o menor número de bytes.

dana
fonte
... você precisa atribuir t a si mesmo no incrementador? Não tenho os documentos à minha frente, mas, se não, você poderá salvar mais dois bytes.
Stackstuck
11
oh, é uma estrutura. Claro que é. Deixa pra lá.
Stackstuck
11
Você pode substituir t.Month<12|t.Day!=25pelo menor $"{t:Md}"!="1225". Ele usa uma sequência interpolada e uma sequência de formatação personalizada DateTime.
Jeppe Stig Nielsen
6

T-SQL, 92 88 bytes

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

Editar: salvou 4 bytes graças a @BradC.

Neil
fonte
Bom trabalho. Economize 2 com PRINT'Christmas'+...e mais 2 usando em DATEDIFF(D,vez deDATEDIFF(DAY,
BradC 7/01
@BradC Nice, obrigado!
Neil
5

APL (Dyalog Unicode) , 76 63 bytes SBCS

Programa completo. Assume ⎕IO←0(indexação zero).

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

Experimente online!

⎕CY'dfns'c o p y na biblioteca NDR

⎕TS atual t ime s tampo como [ano, mês, dia, hora, minuto, segundo, ms]
days[c]  encontrar o número de dias [n] uma vez 1899/12/31 00: 00: 00.000
(⍳366) adicionar os primeiros 366 inteiros (0 … 365) para que
date[c]  encontre as datas [n] que correspondem a esses números (tabela 366 × 7; uma coluna por unidade)
 transposta (tabela 7 × 366; uma linha por unidade)
1↓ descarte uma linha (os anos)
2↑ demoram as duas primeiras linhas (meses e dias)
12 25⍳⍨ localizam o índice do primeiro Natal
 multiplicado por quatro
' Eve'⍴⍨ que o usa para remodelar a lista de caracteres
'Christmas ', que o anexa a este

[c]  código dessa função
[n]  notas para essa função

Adão
fonte
5

Python 2 , 111 103 bytes

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

Experimente online!

Atualização inspirada na resposta de Richard Crossley .

Explicação:

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
fonte
4

Ruby , 80 bytes

require'date'
t=Date.today
puts'Christmas'+' Eve'*(Date.new((t+6).year,12,25)-t)

Experimente online!

Obrigado a tsh por sua ideia

iBug
fonte
77 bytes (ou seja, salve 3 bytes) substituindo putspor p: Link Try It Online
Spencer D
4

PHP, 61 bytes

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

Corra com -nou experimente online .

Titus
fonte
4

JavaScript, 135 131 121 92 88 bytes

Minha primeira solução (ingênua) ( 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)

Ele define duas datas: agora e Natal deste ano. Se o último ainda não passou, apenas os diferencia, se já passou, difere do Natal do próximo ano. Usa diffs para o número de repetições.

(Tentando) Pensar fora da caixa ( 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()

O desafio especifica que saída é necessária ao executar o programa em um determinado dia, mas não especifica WHEN para devolvê-lo ...

Isso apenas 'dorme' por um dia, incrementa um contador em 1 e repita até o Natal, a fim de fornecer a saída.

Como o JavaScript não garante o tempo de 'suspensão', o resultado real pode estar desativado.

Também é feio para usar a alertfunção, o que significa que na verdade não estávamos lidando com JavaScript puro, mas também com APIs do navegador (podemos usar console.logo custo de 6 bytes extras).

Uma abordagem melhor ( 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 partir de hoje, aumente a data por um dia até que seja Natal, depois use o contador desse loop para o número de repetições necessárias.

Melhorando (incluindo passar por um minificador e usar o truque do 12Me21 para economizar 5b extras) ( 92b ):

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

Toques finais ( 88b ):

for(s='Christmas',t=new Date;t.getMonth()/(d=t.getDate())-.44;t.setDate(d+1))s+=' Eve';s
  • Para todas as opções acima, o REPL é assumido.
  • Veja a submissão de Vadim - muito melhor que a minha!
targumon
fonte
11
Eu acho que você pode usar t.getMonth()/t.getDate-.48para verificar se a data não é 25 de dezembro
12Me21
11
Bem vindo ao site! Você pode usar um recuo de 4 espaços para melhorar a aparência dos blocos de código.
Wheat Wizard
11
Bem-vindo ao PPCG!
Shaggy
11
98 , printé necessário uma vez que este é um programa não uma função, a menos 1. você transformá-lo em um lambda ou 2. você estado que você está usando um REPL
ASCII-only
11
t=new Date(+t+864e5)é 1 byte mais curto.
Andrew Svietlichnyy
3

VBA (Excel), 108 bytes

Copie em um módulo em branco. Imprime na janela Imediata:

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: Usar em :vez de quebras de linha salva dois bytes por linha.

Observe que o editor do VBA irá inserir espaços adicionais entre palavras-chave, operadores, etc ... e parênteses após a definição de Sub, mas se você copiar e colar esse código, ele funcionará (não consegui me livrar desse espaço antes do &).

Nada mal para o VBA (pela primeira vez).

Barranka
fonte
11
* Christmas: |
somente ASCII
@ ASCII-only: removendo o espaço antes do &lança um erro
Barranka
-1 bytes. Graças ao @ ASCII somente para pegar o erro de digitação
Barranka
11
Você pode reduzir para 71 caracteres convertendo-o em uma função de janela imediata e removendo a variável temporária para now. Quando você faz isso, deve ser algo como?"Christmas";:For i=1To DateSerial(Year(Now+6),12,25)-Now:?" Eve";:Next
Taylor Scott
3

Data do Bash + GNU, 72 73 bytes

for((d=0;1`date +%d%m -d$d\day`-12512;d++));{ x+=\ Eve;};echo Christmas$x
  • um byte salvo substituindo !=por-
  • outro removendo espaço extra
  • corrigir -3 bytes d=0, porque date -ddayé a data + 1 e não funciona em 25/12

Experimente online

Nahuel Fouilleul
fonte
Hmmm, por que =~não funciona no condicional for-loop?
Kritixi Lithos
porque o circuito para a condição é uma expressão aritmética, as palavras são forçados para inteiro também número começando com 0 são assumidos em octal, é por isso que uma é prefixado
Nahuel FOUILLEUL
3

Bash , 68 65 61 bytes

Golpeou 4 bytes graças a Nahuel Fouilleul usando ``substituição de comando e evalno lugar de sed eexargs

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

Experimente online!

Dentro da `` substituição de comando , temos

eval execute a seguinte cadeia como comandos shell

  • date\ -d{0..366}day\;sob expansão cinta de {0..366}, isto resulta na cadeia date -d0day; date -d1day; date -d2day; ... date -d366day;, cada comando nesta cadeia de computação a data, entre os 0 e os 366 dias do presente resultando na saída do formato Wed Dec 26 18:22:33 UTC 2018, com cada um na sua própria linha de

|sed no qual, chame os seguintes comandos sed

  • /c.25/Qse o regex /c.25/for correspondido, Quse sem imprimir

  • \;cEve caso contrário, altere a linha para Eve

Todo o número necessário de Eves é produzido cada um em sua própria linha. Essa saída é capturada ``e está sujeita à divisão de palavras, onde as palavras são divididas em novas linhas. Cada palavra é alimentada como argumento para echo.

echo Christmas ...

Cada argumento para echoé impresso sendo separado por espaços, resultando na saída desejada.

Kritixi Lithos
fonte
Não há nada realmente bashespecífico nessa solução. Requer GNU date, sede seqembora.
Kusalananda
-4 bytes
Nahuel Fouilleul
@NahuelFouilleul Obrigado, bom truque de usar a substituição de comando backtick para evitar xargs e usar eval para pular para fora em seq
Kritixi Lithos
2

C (gcc) , 157 bytes

Eu pensei que seria capaz de evitar a inclusão, time.hmas isso apenas causava falhas no 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"));}

Experimente online!

ErikF
fonte
OMI você deve deixar de fora o #include <stdlib.h>, não é como ele faz alguma coisa aqui
ASCII-only
Sugerir em *t;f(u)vez de *t,u;f()e em #import<time.h>vez de #include <time.h>e em 5[t=localtime(&u)]vez de #t=localtime(&u);t[5]
tetocat
2

Groovy , 66 bytes

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

Experimente online!

Cortesia de @ ASCII-only

bdkosher
fonte
Você precisa imprimi-lo, pois este é um programa completo, não uma função
somente ASCII
> Chistmas: /
somente ASCII
fixo, 149
somente ASCII
123
Somente ASCII
pegar o primeiro e usar o Groovy 2.5 reduz para 115 .
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
fonte
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)}

Experimente online!

Onde c 25é curto Dec 25.

Kjetil S.
fonte
11
Eu acho que você pode usar em contains("c 25")vez dematches(".*c 25.*")
12Me21
Obrigado, três bytes a menos! Jet
Kjetil S.
Uau, muito bem, toString of date was nice
V. Courtois
2

JavaScript, 86 77 bytes

Usando o REPL, seria

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

Elogios a ASCII somente por -9 bytes

Vadim
fonte
77
somente ASCII
Bravo! Você fez muito melhor que eu. Posso me oferecer para raspar um byte extra? for(c='Christmas',d=new Date;!/c 25/.test(d=new Date(+d+864e5));)c+=' Eve';c ou esta variante: for(s='Christmas',t=Date.now();!/c 25/.test(new Date(t+=864e5));)s+=' Eve';s ambos são 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 (anterior)

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 ressaltar que ele não funciona no LuaJIT (erro de sintaxe)

Tae Hanazono
fonte
Bem-vindo ao PPCG! Bom primeiro post!
Rɪᴋᴇʀ
1

MySQL, 102 bytes

praticamente o mesmo que a resposta T-SQL de Neil . Parece não haver uma maneira mais curta no SQL.

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

Experimente online .

Titus
fonte
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 Não-looper, 100 bytes

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

Scala , 123 bytes

Graças ao trabalho apenas do ASCII.

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

Experimente online!

Tempo de Scala + Joda , 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)

Não é executado no TIO, pois requer a biblioteca Joda-Time.

V. Courtois
fonte
no joda, 154 . infelizmente não consigo java.util.Datetrabalhar aqui: /
ASCII-only
148
Somente ASCII
Ah, apenas no ASCII, não contei object Main extends App{}caracteres na minha contagem (porque também não contei nas minhas outras respostas do Scala). Se tirarmos isso, você me venceu ^^
V. Courtois
A withDate()ligação é tão cara ...
V. Courtois
1. lembre-se de especificar o idioma como "Scala + Joda-Time", pois você usa uma biblioteca externa e 2. não vai usar minhas alterações? é mais curto e não precisa de uma biblioteca: P
somente 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™

Experimente online ou Experimente online com uma data emulada e especificada automaticamente de 'hoje' .

Explicação:

05AB1E não possui nenhum built-in para datas, exceto para receber o ano / mês / dia / horas / minutos / segundos / microssegundos atual, portanto, a maioria dos bytes é usada para cálculos manuais.

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

Veja esta minha resposta para entender como vamos para o dia seguinte. (PS: 1¾ǝfoi substituído por T`ǝ, já que usamos o counter_variableoutro lugar também.)

Veja esta minha dica do 05AB1E (seções Como usar o dicionário? E Como comprimir números inteiros grandes? ) Para entender por que '»ˆé "eve"; 'ŒÎé "christmas"; e Ž9Úé 1225.

Kevin Cruijssen
fonte
Golfe inteligente!
MilkyWay90 5/01
0

C # (compilador interativo do Visual C #) , 141 bytes

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

Experimente online!

Modalidade de ignorância
fonte
11
Eu não acho que isso funcione para o dia 30 de novembro ...
Neil
Corrigido agora, eu esqueci de adicionar um cheque para se era dezembro ou não
Incorporação da Ignorância
Você tem certeza do mês> 25?
30518 Neil
Corrigido agora ...
Modalidade de Ignorância
O? 1: 0 é necessário? não retorna um número inteiro?
12Me21
0

Vermelho , 89 86 84 78 76 bytes

-10 bytes graças apenas ao ASCII!

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

Experimente online!

Galen Ivanov
fonte
84
Somente ASCII
@ Somente ASCII Hmm, é claro! Obrigado!
Galen Ivanov
78
somente ASCII
76
somente ASCII
@ Somente ASCII Sua versão de 76 bytes não fornece o resultado correto quando executada no Natal: Data como argumento, eu me sinto estúpido por não usar apenas nowe não now/date. Obrigado por suas melhorias!
Galen Ivanov
0

Perl 5 , 68 bytes

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

Experimente online!

Onde c 25é curto Dec 25.

Kjetil S.
fonte