Golfmas alegre, todos!


35

Todo mundo é Natal, e aqui está um desafio do código-golfe para comemorar. Você precisa criar um programa para imprimir um presente. Especificamente, as palavras "Feliz Natal". MAS, há um problema: este programa só deve funcionar se for 25 de dezembro. Se o código for executado em outro dia, o programa deverá falhar.

Este é o Code-Golf, então a resposta com a menor quantidade de bytes vence.

Feliz Natal!


5
Sim, isso foi ermmmmm. .. sim 25 desculpe
Leo


3
Codemas de golfe ! :)
Luis Mendo

11
Não, deve ser um acidente. Você não pode sair da aplicação #
Leo

2
@PhiNotPi Esses desafios são diferentes. Isso não está pedindo uma contagem regressiva e não envolve esperando para dar saída
Leo

Respostas:


8

Pyke, 21 bytes

.dↄґ6C65h*325q/Al

Experimente aqui!

     C65h*        -   multiply the day by the (current month + 1)
          325q    -  ^ == 325
    6         /   - 6 / ^
.dↄґ              -  load "merry christmas"
               Al - ^.capwords()

Ou 18 bytes não competitivos.

.dↄґ6Cs6Y1q/Al

Exatamente o mesmo, exceto nesta seção:

Cs6Y1q 
C      -    get_time()
 s6    -   add 1 week
   Y   -  get day of the year
    1q - ^ == 1

Experimente aqui!


Isso falha se for 30 de outubro, não é?
Urna Mágica de Polvo

11
@carusocomputing 30 * (10+1)= 330 não 325
Azul

6

JavaScript, 55 53 46 bytes

Nota: isso só foi testado no Google Chrome, o programa pode se comportar de maneira diferente de navegador para navegador (ou dispositivo para dispositivo)

2 bytes salvos graças a @ ConorO'Brien

7 bytes salvos graças a @ETHProductions

alert(/c 25/.test(Date())?"Merry Christmas":a)

Sai com Uncaught ReferenceError: a is not definedse a data não for Dec 25. Eu não tenho certeza se isso conta como falhar

alert(/c 25/.test(Date())?"Merry Christmas":a)


Que tal .slice(6,10)=="c 25"?
Conor O'Brien

@ ConorO'Brien Obrigado! Isso é esperto :) #
314 Kritixi Lithos

@ETHproductions Não consigo pensar em nenhum dia ou mês que termine c( Octchega perto, mas ainda não satisfaz a regex). Obrigado pela dica!
Kritixi Lithos

O resultado de Date()é completamente dependente da implementação. Por exemplo, espero que varie com o idioma e a localização da máquina.
Oriol

@Oriol Em seguida, especificarei o navegador na minha resposta
Kritixi Lithos

5

Python 3, 66 63 bytes

Graças às idéias das respostas JavaScript / ES aqui, consegui espremer alguns bytes. Indexar um dicionário - chaves inexistentes aumentarão a KeyError. O código a seguir funciona no fuso horário local

import time;print({1:'Merry Christmas'}['c 25'in time.ctime()])

O formato de saída para ctimenão depende da localidade - o formato é sempre ~ 'Sun Dec 25 19:23:05 2016'. Como somente em dezembro termina a abreviação de três letras c, é seguro usá-lo 'c 25'in time.ctime()aqui.


Versão anterior:

Isso funciona no fuso horário UTC. Para o fuso horário local, é necessário s/gm/localmais 3 bytes. No Python 2, pode-se remover parênteses de print65 bytes.

import time;print({(12,25):'Merry Christmas'}[time.gmtime()[1:3]])

A construção lança KeyErrorem outras datas:

>>> import time;print({(1,1):'Happy New Year'}[time.gmtime()[1:3]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (12, 25)

Essa falha ocorre em outros dias (como deveria)?
Erresen

2
Não consigo executar este aqui, pois ele objetiva a tupla como uma chave Experimente on-line! . Se você o alterar import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]e o rotular como Python 2, ele ainda terá 66 bytes e trava com um KeyError em datas diferentes de 25 de dezembro.
ElPedro

@ElPedro oops: D deveria ter sido 1:3, eu copiei o meu código de teste por acidente
Antti Haapala

Entendi isso quando peguei emprestada sua gmtime()idéia pela minha resposta. Espero que você não se importe :-)
ElPedro

5

PHP, 39 38 bytes, não competindo (não trava)

<?=date(md)-1225?"":"Merry Christmas";

ou

<?date(md)-1225?die:0?>Merry Christmas

ou

<?=["Merry Christmas"][date(md)-1225];

Alguém pode jogar fora 4 bytes date(Lz)%1001-358? : D
Titus

3
Isso falha?
edc65

Você pode deixar de fora ""o primeiro código que economiza 2 bytes. Se não fosse por anos bissextos, você poderia economizar mais 2 bytes, substituindo mdpor ze 1225pelo número do dia do ano 25 de dezembro.
UTF-8

11
Uma alternativa: eval((date(md)^TQZZ).'"Merry Christmas";');(43 bytes)
Ismael Miguel

11
@ UTF-8: Você está certo. Eu principalmente uso o Elvis para valores booleanos; e isso seria impresso 1. Isso imprimiria o resultado do cálculo. e 0104-1225é 1121.
Titus

4

Python 2 , 68 67 65 bytes

-1 com agradecimentos a @muddyfish

Obrigado a @AnttiHaapala pela ideia que salvou outro casal.

import time;print['Merry Christmas'][(12,25)!=time.gmtime()[1:3]]

Experimente online!

Lança um IndexError se não for 25 de dezembro

Versão não concorrente para 59 bytes, pois funciona apenas em anos não bissextos (usa o dia do ano que é 360 este ano, mas 361 em anos bissextos)

import time;print['Merry Christmas'][360!=time.gmtime()[7]]

Você não pode salvar um byte usando uma lista em vez de uma tupla?
Azul

@muddyfish Obrigado, boa captura.
ElPedro

Bom, minha idéia foi de 2 bytes extras : P
FlipTack 25/12/16

Obrigado. Essa também foi a minha versão de 67 bytes, até que comentei a resposta de @AnttiHaapala e pensei em gmtime()me depilar. Eu tenho que admitir, eu gostaria que houvesse mais que eu pudesse fazer com a idéia do dia do ano.
ElPedro

Você pode salvar 1 byte com: time.ctime () [6:10]! = 'C 25'
Máx.

4

R, 52 61 58 bytes

`if`(format(Sys.Date(),"%m%d")=="1225","Merry Christmas",)

Se a data atual não for 25 de dezembro, um erro será retornado porque nenhum terceiro argumento é fornecido if.

Edit: Corrigido um erro bobo


Desculpe pelo meu pequeno erro de digitação. Eu quis dizer 25tg
Leo

Isso só funciona este ano!
Erresen

@ Erresen Ah certo, erro bobo. Corrigido agora.
Billywob

4

Minha primeira vez por aqui ... Começou com a melhor linguagem de sempre para este trabalho:

Java, 200 188 bytes (graças a @Daniel Gray), 186 bytes removendo "ln" da impressão.

import java.util.*;public class a{public static void main(String[]r){Calendar c=Calendar.getInstance();if(!(c.get(2)==11&&c.get(5)==25)){int i=1/0;}System.out.print("Merry Christmas");}}

Experimente aqui!


11
Bem-vindo ao PPCG! Bom primeiro post, mesmo que o java não seja o mais curto.
Rɪᴋᴇʀ

11
Você pode alterar Calendarpara *e salvar alguns bytes. Você também pode encurtar o nome do argsparâmetro no método principal, eu acho ...
Daniel Grey

@ Daniel Gray, você está absolutamente certo, obrigado!
Bonifacio

11
Bem vinda! Você pode salvar 10 bytes se substituir "public class" por "interface" e remover o modificador público de main, tornando-o "interface um {static void main ..." Isso, no entanto, impedirá o Compilejava de executá-lo conectados.
Zavada

3

MATL , 34 33 bytes

'Merry Christmas'IHh&Z'5U12h=?}Yl

Isso funciona na versão atual (19.7.0) do idioma. Para causar o erro, o código a seguir explora o fato de que o logaritmo de uma seqüência de caracteres gera um erro (isso pode mudar em versões futuras).

Experimente online!

Explicação

'Merry Christmas'  % Push this string
IHh                % Push 3, then 2, concatenate: gives array [3 2]
&Z'                % Get 3rd and 2nd outputs of clock vector: current day and month
5U12h              % Push 5, square, push 12, concatenate: gives [25 12]
=                  % Compare if corresponding entries are equal in the two arrays
?                  % If all entries are equal: do nothing
}                  % Else
  Yl               %   Logarithm. Gives an error when applied on a string
                   % End (implicit). Display (implicit)

3

QBIC , 48 bytes

~left$$|(_D,5)=@12-25||?@Merry Christmas|\?a(12)

Explicação:

~             IF
left$$|(_D,5) the date string starts with
=@12-25|      the string "12-25"
|             THEN
?@Me..as|     PRINT "Merry Christmas"
\             ELSE
?a(12)        Print the twelfth index of an undefined array. 
              Since there are only 11 elements in undefined arrays, this 
              results in an index-out-of-bounds error.    
The the IF statement is auto-closed by QBIC.

Isso assume a MM-DDnotação de data americana . Isso seria mais curto se eu finalmente fizesse uma função Substring no QBIC.


O que acontece em dias que não são de Natal? Falha como deveria?
Erresen

@Erresen faz agora.
steenbergh

3

05AB1E ,32. 21 bytes

Economizou 11 bytes graças à compressão de strings de Adnan :).

1žfže‚12D·>‚Q÷”ÞٌΔ×

Explicação

 žfže‚                Push [current month, current day]
      12D·>‚          Push [12, 25]
            Q         Push tmp = 1 if the two arrays are equal, tmp = 0 otherwise
1            ÷        Evaluate x = 1/tmp. If tmp = 0 a division by 0 exception is thrown
              ”ÞÙŒÎ”× Implicitly display "Merry Christmas" x times

Experimente online!

Eu fiz o que me veio à mente primeiro, para que possa haver melhores abordagens para este. Mas o PPCG também merece um Feliz Natal em 05AB1E;).


Além disso, xé a abreviação de duplicado e duplo :).
Adnan

3

Script em C # / CS 106 100 99 bytes

Solução de 99 bytes

using System;int i;Console.WriteLine(DateTime.Now.ToString("dM")=="2512"?"Merry Christmas":i/0+"");

Experimente aqui!

Solução de 100 bytes (prefira esta ... um pouco diferente)

using System;int i;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":i/0+"");

Explicado:

using System;
int i;

// if today plus 7 days is the first day of the year, then it's xmas!
Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1
    ? "Merry Christmas"

// otherwise divide i by 0
    : i/0+"");

DateTime.Now.AddDays(7).DayOfYear==1é um byte menor que, DateTime.Now.ToString("ddMM")=="2512"mas 1 byte maior queDateTime.Now.ToString("dM")=="2512"


11
Você pode usar $"{DateTime.Now:dM}"=="2512". dMé ambíguo, mas não para "2512".
Kobi

@Kobi Não consigo usar a interpolação de cadeias de caracteres para script CS :(
Erresen

11
Você pode se usar o LinqPad (por exemplo, $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 bytes) =)
Kenneth K.

Por que int ie não justo 1/0?
NoOneIsHere

11
@ Erresen Ah, meu erro. Eu não testei completamente o suficiente. Tweaked: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 bytes)
Kenneth K.

2

Script C # / CS, 96 bytes, plagiado principalmente de Erresen

using System;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":1/0+"");

Exclui a int ideclaração em favor da codificação codificada da divisão. Eu deixaria isso como um comentário, mas não tenho reputação.


Bem-vindo ao PPCG! Bom primeiro post! Não se preocupe com o comentário / resposta, isso não importa muito.
Rɪᴋᴇʀ

2

utilitários bash + Unix, 51 49 47 bytes

((`date +%m%d`-1225))&&${};echo Merry Christmas

* Agradecemos a @ KenY-N por apontar que as aspas no eco podem ser removidas e a @IporSircer por reduzir o tamanho da condição em 2 bytes.


Isso me dá bash: ${}: bad substitutionerro. Além disso, você pode soltar as aspas de Feliz Natal para economizar dois bytes. Além disso, [ `date +%m%d` = 1225 ]&&echo Merry Christmasfunciona para mim, igualando meus 45 bytes .
precisa

11
@ KenY-N O erro é intencional: o programa deve travar em outros dias que não o Natal. Obrigado por mencionar que as aspas no eco podem ser eliminadas; Eu senti falta disso.
Mitchell Spector

Ops, perdi esse requisito! Testado alterando a string de data, e agora vejo que ela não falha. Excluiu minha resposta ... Mas, eu tenho uma alternativa, então deixe-me atualizá-la.
Ken YN

Tente substituir ${}com !-a bater-me por um byte. Eu vou te votar enquanto você ganha.
Ken YN

11
@ KenY-N Obrigado, mas não vou mudar $ {} para! - já que acho que o último só funcionará corretamente na linha de comando, não em um script (a menos que você ative a substituição do histórico, o que exigiria mais personagens).
Mitchell Spector

1

Groovy, 57 bytes

print new Date().format("Md")=="1225"?"Merry Christmas":b

Falhas em datas que não sejam 25.12. com groovy.lang.MissingPropertyExceptionporque bnão está definido.


1

Empilhados , 42 bytes

Experimente aqui!

('Merry Christmas')'MMDD'date'1225'=¬#out

Isso cria uma matriz de elemento único que contém, nomeadamente 'Merry Christmas!'. Depois, coloca a data em uma sequência com o mês seguido pelo dia. Ele verifica a igualdade com '1225'(Christmas), inverte-a ¬e obtém esse membro da matriz anterior. Se não for Natal, isso causará um erro no índice. Caso contrário, ele imprime Merry Christmas. (Altere a data na string para ver como funciona em outros dias.)


1

Lote, 66 bytes

@echo off
if %date:~0,5%==25/12 echo Merry Christmas&exit/b
if

A nova linha à direita é significativa, pois causa iffalha na análise da instrução. Pode ser necessário ajustar a verificação da data para corresponder ao seu formato de data local.


1

Python 2, 69 77 75 ou 72 70 bytes

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
else:1/0

Se não importa se sai com erro quando é Natal, então:

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
1/0

EDITAR:

Obrigado @ Flp.Tkc por apontar que eu precisava gerar um erro

-2 bytes do @Max para indicar como remover dois pontos da função strftime


11
Ele deve travar se não for Natal, isso sai normalmente.
FlipTack

Você pode salvar 2 bytes removendo os dois pontos -> '% d% m' == '2512'
Máx.

@ Max OK, obrigado pela dica. Eu não tinha usado essa função antes, então eu não tinha pensado em fazer isso
sonrad10

salve outros 3 bytes com: time.ctime () [6:10] == 'c 25'
Máx.

1

CJam, 28

et[C25]#1="Merry Christmas"/

Experimente online

Explicação:

et                   push an array of current [year month day hour ...]
[C25]                push the array [12 25] (C=12)
#                    find the position of the 2nd array within the first one
1=                   compare it with 1, resulting in 1 for 1 and 0 otherwise
"Merry Christmas"/   split "Merry Christmas" into pieces of that length
                      (it crashes if the length is 0)
                     at the end, all the pieces are concatenated
                      and printed automatically

0

C # .NET, 180 172 171 bytes

Economizou 8 bytes graças a Kritixi Lithos

Guardado 1 byte graças a Kritixi Lithos, novamente;)

namespace System{class P{static void Main(string[] args){var d=DateTime.Today;if(d.Day==25)if(d.Month>11){Console.Write("Merry Christmas!");return;}throw new Exception();}}}

Variante alternativa não-gasta:

namespace System //In System, so we don't have to use system.
{
    class Program
    {
        static void Main(string[] args) //Main function.
        {
            var d = DateTime.Today; //Get Today.
            if (d.Day == 25) if (d.Month == 12) //Day has to be 25th, Month has to be 12nd.
                {
                    Console.Write("Merry Christmas!"); return; //Prints.
                }
            throw new NotChristmasException(); //Errors/Crashes the program.
        }
    }
    class NotChristmasException : Exception { } //Holiday exception, hooray!
}

Você não pode dar ao programa um nome de classe mais curto?
Kritixi Lithos

Você pode remover alguns bytes alterando a "NotChristmasException" para algo mais curto.
Leo

@ FishishHD O NotChristmasExceptioné apenas na variante não destruída.
devRicher

@KritixiLithos Obrigado, mudou isso.
devRicher

11
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()observe as declarações if combinadas e a remoção de chaves ao redor da Console.Writee substitua returnpor else. Mudar também var d=DateTime.Nowvocê pode se livrar de lance exceção com talvez args[-1];depois de renomear args para aassim a[-1];(isso para não idêntico ao dividir por zeros usados em outros lugares)
pinkfloydx33

0

Mathematica, 46 bytes

If[Today[[1,2;;]]=={12,25},"Merry Christmas!"]

Noweconomiza 2 bytesToday
Kelly Lowder

Além disso, você precisa de uma falha no resultado False, então acho que algo como Quit[]ou 1/0deveria ser suficiente.
Kelly Lowder

0

Lisp comum, 140

(let((m(multiple-value-list(decode-universal-time(get-universal-time)))))(if(and(eq(nth 3 m)25)(eq(nth 4 m)12))(write"Merry Christmas")(c)))

Falha com a função indefinida se a data não estiver correta.


0

awk, 29 bytes (+ comprimento ("Feliz Natal"))

v=1225==strftime("%m%d")||1/0

Executando:

$ echo Merry xmas | awk 'v=1225==strftime("%m%d")||1/0'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: division by zero attempted

A saudação de temporada é canalizada para awk. strftimeretorna mês + dia (por exemplo 1226) e, se corresponder, o 1225 $0registro será gerado. O resultado da comparação 1225==1226é colocado em vvar, que é usado para dividir 1 se a comparação da data falhar.


0

Haskell, 116

Falha com "Padrões não exaustivos na função f" se não for Natal.

import Data.Time
f(_,12,25)="Merry Christmas"
main=getZonedTime>>=print.f.toGregorian.localDay.zonedTimeToLocalTime

Infelizmente, não há nenhuma função que permita que você obtenha imediatamente a hora em um formato útil; portanto, a maior parte disso é a conversão dos formatos de data.


0

C #, 122 104 bytes

18 bytes salvos, graças a @raznagul

using System;i=>{if(DateTime.Now.AddDays(7).DayOfYear==1)Console.Write("Merry Christmas");else{i/=0;};};

Adiciona 7 dias ao dia atual e verifica se é o primeiro dia do ano; se sim, exibe "Feliz Natal"; caso contrário, divide por zero.


O returnnão é necessário. Use em ivez de ().
raznagul

0

Ruby, 69 bytes

if Time.now.strftime("%j")=="360";puts "Merry Christmas";else 0/0;end

Funciona em 2016. Não diferencia entre anos normais e bissextos, pode precisar ser ajustado para anos não bissextos.


0

ForceLang, 180 bytes

set s datetime.toDateString datetime.now()
set t "Dec 25"
def c s.charAt i
def d t.charAt i
set i -1
label 1
set i 1+i
if i=6
 io.write "Merry Christmas!"
 exit()
if c=d
goto 1
z.z

(Lembre-se de que datetime.toDateStringdepende da localidade, portanto, isso pode não funcionar dependendo da localidade)


0

C #, 90 bytes

using System;Console.Write(new[]{"Merry Christmas"}[DateTime.Now.AddDays(7).DayOfYear-1]);

Lança IndexOutOfRangeException se não for natal.

Experimente aqui!


0

linha de comando do bash, 45 48 49 48 bytes

date +%m%d|grep -q 1225&&echo Merry Christmas||!-
date +%m%d|grep -q 1225||!-;echo Merry Christmas

Semelhante ao de Mitchell Spector , mas usado grepno modo silencioso para verificar uma correspondência, &&garantirá que ela seja impressa apenas com êxito e ||faça com que ela pesquise o histórico !-, o que me dá o seguinte:

-bash: !-: event not found

E para a execução como !- ; echo foodemonstra. A bashdocumentação diz que !-nse refere ao comando atual menos n, então talvez ele esteja sendo interpretado como !-0, o que fornece uma mensagem de erro idêntica (e não localizada).


Boa ideia, mas isso não falha em outros dias que não o Natal, como deveria, não é?
Mitchell Spector

Agora ele apresenta um erro na falha.
Ken YN

11
Isso imprime uma mensagem de erro, mas continua; na verdade, não trava. Se você substituir o. com $ {}, ele realmente travará, simplesmente imprimindo uma mensagem de erro e continuando. Eu acho que falhar exige que o programa seja encerrado nesse ponto. Você pode dizer que o seu não termina colocando um "; echo x" extra no final e vendo que ele é executado. (Foi por isso que usei $ {} em vez de. Na minha resposta.) Não sei se existe uma sequência de 1 ou 2 caracteres que pode causar uma falha real.
Mitchell Spector

@ MitchellSpector: Encontrei uma sequência de 2 caracteres!
Ken YN

E agora voltando ao 48, alternando a lógica para que eu possa usar em ;vez de ||.
Ken YN
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.