Merry Golfmas, a tutti!


35

È Natale per tutti, ed ecco una sfida di code-golf da festeggiare. È necessario creare un programma per stampare un regalo. In particolare, le parole "Buon Natale". MA c'è un problema: questo programma deve funzionare solo se è il 25 dicembre. Se il codice viene eseguito in qualsiasi altro giorno, il programma dovrebbe bloccarsi.

Questo è Code-Golf, quindi vince la risposta con il minor numero di byte.

Buon Natale!


5
Sì, quello era ermmmmm. .. Sì 25 scusa
Leo


3
Codemas da golf ! :)
Luis Mendo il

1
No, deve essere un incidente. Non è possibile abbandonare l'applicazione
Leo

2
@PhiNotPi Queste sfide sono diverse. Questo non richiede un conto alla rovescia e non comporta l'attesa di dare un output
Leone

Risposte:


8

Pyke, 21 byte

.dↄґ6C65h*325q/Al

Provalo qui!

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

O 18 byte non competitivi.

.dↄґ6Cs6Y1q/Al

Esattamente lo stesso tranne per questa sezione:

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

Provalo qui!


Ciò fallisce se è il 30 ottobre, vero?
Magic Octopus Urn il

1
@carusocomputing 30 * (10+1)= 330 non 325
Blue

6

JavaScript, 55 53 46 byte

Nota: questo è stato testato solo in Google Chrome, il programma potrebbe comportarsi in modo diverso da browser a browser (o da dispositivo a dispositivo)

2 byte salvati grazie a @ ConorO'Brien

7 byte salvati grazie a @ETHProductions

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

Esce con Uncaught ReferenceError: a is not definedse la data non lo è Dec 25. Non sono davvero sicuro se questo conta come crash

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


Che ne dici .slice(6,10)=="c 25"?
Conor O'Brien,

@ConorO'Brien Grazie! È intelligente :)
Kritixi Lithos il

@ETHproductions Non riesco a pensare a nessun giorno o mese che finisca c( Octsi avvicina, ma non soddisfa ancora la regex). Grazie per il consiglio!
Kritixi Lithos,

Il risultato Date()dipende completamente dall'implementazione. Ad esempio, mi aspetto che vari con la lingua e la posizione della macchina.
Oriol,

@Oriol Quindi specificherò il browser nella mia risposta
Kritixi Lithos il

5

Python 3, 66 63 byte

Grazie alle idee provenienti dalle risposte JavaScript / ES qui sono riuscito a spremere alcuni byte. Indicizza un dizionario: le chiavi inesistenti genereranno a KeyError. Il seguente codice funziona nel fuso orario locale

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

Il formato di output per ctimenon dipende dalle impostazioni locali - il formato è sempre ~ 'Sun Dec 25 19:23:05 2016'. Poiché solo a dicembre termina l'abbreviazione di 3 lettere c, è sicuro utilizzarla 'c 25'in time.ctime()qui.


Versione precedente:

Funziona nel fuso orario UTC. Per il fuso orario locale è necessario s/gm/localper altri 3 byte. Per Python 2, è possibile rimuovere le parentesi da printper 65 byte.

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

Il costrutto genera KeyErroraltre date:

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

Questo arresto in altri giorni (dovrebbe)?
Erresen,

2
Non riesco a far funzionare questo come oggetto della tupla come chiave Provalo online! . Se lo cambi import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]e lo etichetti in Python 2 è ancora 66 byte e si arresta in modo anomalo con un KeyError in date diverse dal 25 dicembre.
ElPedro il

@ElPedro oops: D avrebbe dovuto essere 1:3, ho copiato il mio codice di prova per caso
Antti Haapala il

Ho capito quando ho preso in prestito la tua gmtime()idea per la mia risposta. Spero non ti dispiaccia :-)
ElPedro il

5

PHP, 39 38 byte, non in competizione (non si blocca)

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

o

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

o

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

Qualcuno può golf 4 byte di sconto date(Lz)%1001-358? : D
Tito

3
Questo si blocca?
edc65,

È possibile tralasciare ""il primo codice che consente di risparmiare 2 byte. Se non fosse stato per anni bisestili maledetto, si potrebbe risparmiare 2 byte più sostituendo mdda ze 1225per il numero di giorno dell'anno del 25 dicembre.
UTF-8

1
Un'alternativa: eval((date(md)^TQZZ).'"Merry Christmas";');(43 byte)
Ismael Miguel il

1
@ UTF-8: hai ragione. Uso principalmente Elvis per valori booleani; e questo sarebbe stampato 1. Ciò stamperebbe il risultato del calcolo. ed 0104-1225è 1121.
Tito

4

Python 2 , 68 67 65 byte

-1 grazie a @muddyfish

Grazie a @AnttiHaapala per l'idea che ha salvato un'altra coppia.

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

Provalo online!

Genera un IndexError se non il 25 dicembre

Versione non competitiva per 59 byte in quanto funziona solo per anni non salti (utilizza il giorno dell'anno che è 360 quest'anno ma 361 negli anni bisestili)

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

Non riesci a salvare un byte utilizzando un elenco anziché una tupla?
Blu,

@muddyfish Grazie, ottima cattura.
ElPedro,

Bello, la mia idea era di 2 byte extra : P
FlipTack il

Grazie. Questa era anche la mia versione a 67 byte fino a quando non ho commentato la risposta di @AnttiHaapala e ho pensato gmtime()di radere un paio. Devo ammetterlo, vorrei però che potessi fare di più con l'idea del giorno dell'anno.
ElPedro,

Puoi salvare 1 byte con: time.ctime () [6:10]! = 'C 25'
Max

4

R, 52 61 58 byte

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

Se la data corrente non è il 25 dicembre, viene restituito un errore perché non viene fornito alcun terzo argomento if.

Modifica: risolto un errore stupido


Scusa per il mio piccolo errore di battitura. Volevo dire 25tg
Leo

Questo funziona solo quest'anno però!
Erresen,

@ Erresen Ah giusto, errore sciocco. Risolto ora però.
Billywob,

4

La mia prima volta qui ... Ho iniziato con la migliore lingua di sempre per questo lavoro:

Java, 200 188 byte (grazie a @Daniel Gray), 186 byte rimuovendo "ln" dalla stampa.

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

Provalo qui!


1
Benvenuti in PPCG! Bel primo post, anche se Java non è il più breve.
Rɪᴋᴇʀ

1
È possibile modificare il Calendarfor *e salvare alcuni byte. Potresti anche abbreviare il nome del argsparametro nel metodo principale, credo ...
Daniel Gray il

@ Daniel Gray, hai assolutamente ragione, grazie!
Bonifacio,

1
Benvenuto! Puoi salvare 10 byte se sostituisci "public class" con "interface" e rimuovi il modificatore pubblico da main, rendendolo "interfaccia a {static void main ..." Questo, tuttavia, impedirà a Compilejava di essere in grado di eseguirlo in linea.
Zavada,

3

MATL , 34 33 byte

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

Funziona con la versione corrente (19.7.0) della lingua. Per causare l'errore, il codice seguente sfrutta il fatto che il logaritmo di una stringa genera un errore (ciò potrebbe cambiare nelle versioni future).

Provalo online!

Spiegazione

'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 byte

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

Spiegazione:

~             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.

Questo presuppone la MM-DDnotazione della data americana . Questo sarebbe più breve se avessi finalmente creato una funzione Substring in QBIC.


Cosa succede nei giorni che non sono Natale? Si blocca come dovrebbe?
Erresen,

@Eresres ora.
Steenbergh,

3

05AB1E ,32 21 byte

Salvato 11 byte grazie alla compressione della stringa di Adnan :).

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

Spiegazione

 ž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

Provalo online!

Ho fatto quello che mi è venuto in mente per primo, quindi potrebbero esserci approcci migliori per questo. Ma PPCG merita un buon Natale anche in 05AB1E;).


Inoltre, xè l'abbreviazione di duplicati e doppi :).
Adnan,

3

Script C # / CS 106 100 99 byte

Soluzione a 99 byte

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

Provalo qui!

Soluzione da 100 byte (preferire questa ... un po 'diversa)

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

Ha spiegato:

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è un byte più corto di DateTime.Now.ToString("ddMM")=="2512"ma 1 byte più lungo diDateTime.Now.ToString("dM")=="2512"


1
È possibile utilizzare $"{DateTime.Now:dM}"=="2512". dMè ambiguo, ma non per "2512".
Kobi,

@Kobi Non riesco a usare l'interpolazione di stringhe per CS Script :(
Erresen il

1
Puoi usare LinqPad (es. $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 byte) =)
Kenneth K. il

Perché int ie non solo 1/0?
NoOneIsHere il

1
@Erresen Ah, errore mio. Non ho provato abbastanza a fondo. Ottimizzato: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 byte)
Kenneth K.,

2

Script C # / CS, 96 byte, prevalentemente plagiato da Erresen

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

Elimina la int idichiarazione a favore della codifica rigida della divisione. Vorrei lasciare questo come commento ma non ho la reputazione.


Benvenuti in PPCG! Bel primo post! Non preoccuparti del commento / risposta, non importa troppo.
Rɪᴋᴇʀ

2

bash + utility Unix, 51 49 47 byte

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

* Grazie a @ KenY-N per aver sottolineato che le virgolette nell'eco possono essere rimosse e a @IporSircer per ridurre la dimensione della condizione di 2 byte.


Questo mi dà bash: ${}: bad substitutionerrore. Inoltre puoi eliminare le virgolette da Buon Natale per salvare due byte. Inoltre, [ `date +%m%d` = 1225 ]&&echo Merry Christmasfunziona per me, eguagliando i miei 45 byte .
Ken YN,

1
@ KenY-N L'errore è intenzionale: il programma dovrebbe andare in crash in giorni diversi da Natale. Grazie per aver menzionato che le virgolette nell'eco possono essere eliminate; Ho perso questo.
Mitchell Spector,

Oops, ho perso questo requisito! Testato cambiando la stringa della data e ora vedo che non si arresta in modo anomalo. Ho cancellato la mia risposta ... Ma ho un'alternativa, quindi lasciatemi aggiornare.
Ken YN,

Prova a sostituire ${}con !-per battermi di un byte. Ti voterò mentre vinci.
Ken YN,

1
@ KenY-N Grazie, ma non cambierò $ {} in! personaggi).
Mitchell Spector,

1

Groovy, 57 byte

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

Arresti anomali in date diverse dal 25.12. con groovy.lang.MissingPropertyExceptionperché bnon è definito.


1

Impilato , 42 byte

Provalo qui!

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

Questo crea una matrice a singolo elemento contenente ie 'Merry Christmas!'. Successivamente, inserisce la data in una stringa con il mese seguito dal giorno. Verifica l'uguaglianza con '1225'(Natale), lo inverte con ¬, quindi ottiene quel membro dall'array precedente. Se non è Natale, questo errore con un indice indice. Altrimenti, stampa Merry Christmas. (Cambia la data nella stringa per vedere come funziona negli altri giorni.)


1

Lotto, 66 byte

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

La newline finale è significativa, in quanto fa iffallire l'analisi dell'istruzione. Potrebbe essere necessario modificare il controllo della data in modo che corrisponda al formato della data locale.


1

Python 2, 69 77 75 o 72 70 byte

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

Se non importa se esce con un errore quando è Natale, allora:

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

MODIFICARE:

Grazie @ Flp.Tkc per aver sottolineato che avevo bisogno di sollevare un errore

-2 byte da @Max per sottolineare come rimuovere i due punti dalla funzione strftime


1
Dovrebbe andare in crash se non è Natale, questo esce normalmente.
FlipTack il

Puoi salvare 2 byte rimuovendo i due punti -> '% d% m' == '2512'
Max

@Max OK, grazie per il suggerimento. Non avevo mai usato questa funzione prima, quindi non avevo pensato di farlo
sonrad10,

salva altri 3 byte con: time.ctime () [6:10] == 'c 25'
Max

1

CJam, 28

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

Provalo online

Spiegazione:

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 byte

Risparmiato 8 byte grazie a Kritixi Lithos

Salvato 1 byte grazie a Kritixi Lithos, di nuovo;)

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, non golfata:

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!
}

Non puoi dare al programma un nome di classe più breve?
Kritixi Lithos,

È possibile rimuovere alcuni byte modificando "NotChristmasException" in qualcosa di più breve.
Leone,

@FishProHD Il NotChristmasExceptionè solo nella variante ungolfed.
devRicher,

@KritixiLithos Grazie, l'ho cambiato.
devRicher,

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()nota combinata se le istruzioni e la rimozione di parentesi graffe intorno al Console.Writee sostituiscono returncon else. Inoltre var d=DateTime.Now, puoi sbarazzarti del lancio dell'eccezione con forse args[-1];dopo aver rinominato args in questo amodo a[-1];(questo non è identico a dividere per zeri usati altrove)
pinkfloydx33,

0

Mathematica, 46 byte

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

Nowsalva 2 byte suToday
Kelly Lowder il

Inoltre, hai bisogno di un arresto nel risultato Falso, quindi penso che qualcosa di simile Quit[]o 1/0dovrebbe bastare.
Kelly Lowder,

0

Lisp comune, 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)))

Si blocca con una funzione indefinita se la data non è corretta.


0

awk, 29 byte (+ lunghezza ("Merry xmas"))

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

Eseguendolo:

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

Viene salutato il saluto della stagione awk. strftimerestituisce mese + giorno (ad esempio 1226) e se corrisponde al 1225 $0record viene emesso. Il risultato del confronto 1225==1226viene posizionato su vvar che viene utilizzato per dividere 1 se il confronto della data fallisce.


0

Haskell, 116

Si blocca con "Schemi non esaustivi nella funzione f" se non è Natale.

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

Sfortunatamente, non esiste alcuna funzione che ti consenta di ottenere immediatamente l'ora in un formato utile, quindi la maggior parte di questo sta convertendo i formati di data.


0

C #, 122 104 byte

18 byte salvati, grazie a @raznagul

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

Aggiunge 7 giorni al giorno corrente e verifica se è il primo giorno dell'anno, in caso affermativo visualizza "Buon Natale", altrimenti si divide per zero.


Non returnè necessario. Usa iinvece di ().
raznagul,

0

Rubino, 69 byte

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

Funziona nel 2016. Non distingue tra anni normali e bisestili, potrebbe essere necessario modificarli per anni non bisestili.


0

ForceLang, 180 byte

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

(Ricorda che datetime.toDateStringdipende dalle impostazioni locali, quindi potrebbe non funzionare a seconda delle impostazioni locali)


0

C #, 90 byte

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

Genera IndexOutOfRangeException se non è natale.

Provalo qui!


0

riga di comando bash, 45 48 49 48 byte

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

Simile a Mitchell Spector , ma utilizza grepin modalità silenziosa per verificare la presenza di una corrispondenza, quindi &&assicurerà che stampa solo in caso di successo e le ||cause con cui cerca la cronologia !-, il che mi dà questo:

-bash: !-: event not found

E interrompe l'esecuzione come !- ; echo foodimostra. La bashdocumentazione dice che si !-nriferisce al comando corrente meno n, quindi forse viene interpretato come !-0, il che dà un messaggio di errore identico (e non localizzato).


Buona idea, ma questo non si blocca in giorni diversi dal Natale, come dovrebbe, vero?
Mitchell Spector il

Ora fornisce un errore in caso di errore.
Ken YN il

1
Questo stampa un messaggio di errore ma continua; in realtà non si blocca. Se si sostituisce il. con $ {} allora si bloccherà piuttosto semplicemente stampando un messaggio di errore e continuando. Penso che l'arresto anomalo richieda che il programma sia terminato a quel punto. Puoi dire che il tuo non termina mettendo un extra "; echo x" alla fine e vedendo che viene eseguito. (Ecco perché ho usato $ {} invece di. Nella mia risposta.) Non so se c'è una sequenza di 1 o 2 caratteri che puoi usare che provocherà un vero crash.
Mitchell Spector,

@MitchellSpector: ho trovato una sequenza di 2 caratteri!
Ken YN,

E ora torniamo a 48 cambiando la logica in modo che io possa usare al ;posto di ||.
Ken YN,
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.