Joyeux Golfmas, tout le monde!


35

C'est Noël tout le monde, et voici un défi de code-golf à célébrer. Vous devez créer un programme pour imprimer un cadeau. Plus précisément, les mots "Joyeux Noël". MAIS, il ya un problème: ce programme ne doit fonctionner que s’il s’agit du 25 décembre. Si le code est exécuté un autre jour, le programme doit se bloquer.

C'est Code-Golf, donc la réponse avec le moins d'octets l'emporte.

Joyeux Noël!


5
Ouais c'était ermmmmm. .. ouais 25 désolé
Leo


3
Golfy Codemas ! :)
Luis Mendo

1
Non, ça doit être un crash. Vous ne pouvez pas quitter l'application
Leo

2
@PhiNotPi Ces défis sont différents. Ceci ne demande pas un compte à rebours et n'implique pas d'attendre pour donner une sortie
Leo

Réponses:


8

Pyke, 21 octets

.dↄґ6C65h*325q/Al

Essayez-le ici!

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

Ou 18 octets non compétitif.

.dↄґ6Cs6Y1q/Al

Exactement la même chose sauf pour cette section:

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

Essayez-le ici!


Cela échoue si nous sommes le 30 octobre, n'est-ce pas?
Magic Octopus Urn

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

6

JavaScript, 55 53 46 octets

Remarque: ceci n’a été testé que dans Google Chrome, le programme peut se comporter différemment d’un navigateur à l’autre (ou d’un appareil à l’autre).

2 octets sauvés grâce à @ ConorO'Brien

7 octets sauvegardés grâce à @ETHProductions

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

Quitte avec Uncaught ReferenceError: a is not definedsi la date n'est pas Dec 25. Je ne sais pas vraiment si cela compte comme un crash

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


Que diriez- .slice(6,10)=="c 25"vous
Conor O'Brien

@ ConorO'Brien Merci! C'est malin :)
Kritixi Lithos

@ETHproductions Je ne peux penser à aucun jour ou mois qui se termine dans c( Octse rapproche mais ne satisfait toujours pas l'expression régulière). Merci pour le conseil!
Kritixi Lithos

Le résultat de Date()dépend complètement de la mise en œuvre. Par exemple, je pense que cela varie avec la langue et l'emplacement de la machine.
Oriol

@Oriol Ensuite, je spécifierai le navigateur dans ma réponse
Kritixi Lithos

5

Python 3, 66 63 octets

Grâce aux idées de réponses JavaScript / ES ici, j'ai réussi à serrer quelques octets. Indexer un dictionnaire - des clés inexistantes vont générer un KeyError. Le code suivant fonctionne dans le fuseau horaire local

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

Le format de sortie pour ctimen'est pas dépendant de la localisation - le format est toujours ~ 'Sun Dec 25 19:23:05 2016'. Comme l'abréviation de 3 lettres prend fin uniquement en décembre c, son utilisation est sûre 'c 25'in time.ctime()ici.


La version précédente:

Cela fonctionne dans le fuseau horaire UTC. Pour le fuseau horaire local, il faut s/gm/local3 octets supplémentaires. Pour Python 2, on peut supprimer les parenthèses de print65 octets.

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

La construction jette KeyErrorsur d'autres dates:

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

Est-ce que cet accident se produit d'autres jours (c'est censé le faire)?
Erresen

2
Je n'arrive pas à faire fonctionner celui-ci car il s'oppose au tuple en tant que clé. Essayez-le en ligne! . Si vous le changez en import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]libellé Python 2, il reste 66 octets et plante avec une KeyError à des dates autres que le 25 décembre.
ElPedro

@ElPedro oops: D aurait dû être 1:3, j'ai copié mon code de test par accident
Antti Haapala

Je l'ai compris quand j'ai emprunté votre gmtime()idée pour ma réponse. J'espère que cela ne vous dérange pas :-)
ElPedro

5

PHP, 39 38 octets, pas en compétition (ne plante pas)

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

ou

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

ou

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

Quelqu'un peut-il avoir 4 octets de golf date(Lz)%1001-358? : D
Titus

3
Est-ce que ce crash?
Edc65

Vous pouvez laisser ""dans le premier code ce qui vous permet d'économiser 2 octets. S'il n'a pas été pendant des années bissextiles putain, vous pourriez économiser 2 Byte plus en remplaçant mdpar zet 1225par le nombre de jour de l'année du 25 Décembre.
UTF-8

1
Une alternative: eval((date(md)^TQZZ).'"Merry Christmas";');(43 bytes)
Ismael Miguel

1
@ UTF-8: Vous avez raison. J'utilise principalement l'Elvis pour les valeurs booléennes; et cela imprimerait 1. Cela afficherait le résultat du calcul. et 0104-1225est 1121.
Titus

4

Python 2 , 68 67 65 octets

-1 grâce à @muddyfish

Merci à @AnttiHaapala pour l'idée d'avoir sauvé un autre couple.

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

Essayez-le en ligne!

Lance une IndexError sinon le 25 décembre

Version non concurrente pour 59 octets car elle ne fonctionne que pour les années non bissextiles (utilise le jour de l'année qui est de 360 ​​cette année mais 361 les années bissextiles)

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

Ne pouvez-vous pas sauvegarder un octet en utilisant une liste au lieu d'un tuple?
Bleu

@muddyfish Merci, bonne prise.
ElPedro

Belle, mon idée était de 2 octets supplémentaires : P
FlipTack

Merci. C'était aussi ma version de 67 octets jusqu'à ce que je commente la réponse de @AnttiHaapala et que je pense à en réduire le nombre gmtime(). Je dois admettre que je souhaiterais cependant pouvoir faire plus avec l'idée du jour de l'année.
ElPedro

Vous pouvez économiser 1 octet avec: time.ctime () [6:10]! = 'C 25'
Max

4

R, 52 61 58 octets

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

Si la date actuelle n'est pas le 25 décembre, une erreur est renvoyée car aucun troisième argument n'est fourni à if.

Edit: Correction d'une erreur idiote


Désolé pour ma petite faute de frappe. Je voulais dire 25tg
Leo

Cela ne fonctionne que cette année si!
Erresen

@ Erresen Ah oui, erreur stupide. Correction maintenant si.
Billywob

4

Ma première fois ici ... Commencé avec la meilleure langue pour ce travail:

Java, 200 188 octets (merci à @Daniel Gray), 186 octets supprimant "ln" de l'impression.

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

Essayez-le ici!


1
Bienvenue chez PPCG! Bon premier post, même si Java n'est pas le plus court.
Rɪᴋᴇʀ

1
Vous pouvez changer le Calendarpour *et sauvegarder quelques octets. Vous pouvez également raccourcir le nom du argsparamètre dans la méthode principale, je pense ...
Daniel Gray

@ Daniel Gray, vous avez absolument raison, merci!
Bonifacio

1
Bienvenue! Vous pouvez économiser 10 octets si vous remplacez "public class" par "interface" et supprimez le modificateur public de main, ce qui en fait une "interface a {static void main ...". Toutefois, cela empêchera Compilejava de l'exécuter. en ligne.
Zavada

3

MATL , 34 33 octets

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

Cela fonctionne dans la version actuelle (19.7.0) du langage. Pour provoquer l'erreur, le code suivant exploite le fait que le logarithme d'une chaîne génère une erreur (celle-ci peut changer dans les versions futures).

Essayez-le en ligne!

Explication

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

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

Explication:

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

Cela suppose la MM-DDnotation de date américaine . Ce serait plus court si je réalisais enfin une fonction Substring dans QBIC.


Que se passe-t-il les jours qui ne sont pas Noël? Est-ce que ça plante comme il est supposé?
Erresen

@ Erresen il fait maintenant.
Steenbergh

3

05AB1E ,32 21 octets

Sauvegardé 11 octets grâce à la compression de chaînes d'Adnan :).

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

Explication

 ž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

Essayez-le en ligne!

J'ai fait ce qui me venait à l'esprit en premier, alors il pourrait y avoir de meilleures approches pour celui-ci. Mais PPCG mérite également un joyeux Noël en 05AB1E;).


Aussi, xest court pour dupliquer et doubler :).
Adnan

3

C # / CS Script 106 100 99 octets

Solution de 99 octets

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

Essayez-le ici!

Solution de 100 octets (préférez celle-ci ... un peu différente)

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

A expliqué:

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==1est un octet plus court qu'un DateTime.Now.ToString("ddMM")=="2512"mais un octet plus long queDateTime.Now.ToString("dM")=="2512"


1
Vous pouvez utiliser $"{DateTime.Now:dM}"=="2512". dMest ambigu, mais pas pour "2512".
Kobi

@Kobi Je ne peux pas utiliser l'interpolation de chaîne pour CS Script :(
Erresen

1
Vous pouvez si vous utilisez LinqPad (par exemple, $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 octets) =)
Kenneth K.

Pourquoi int iet pas juste 1/0?
NoOneIsHere

1
@ Erresen Ah, c'est mon erreur. Je n'ai pas testé suffisamment. Tweaked: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 bytes)
Kenneth K.

2

Script C # / CS, 96 octets, principalement plagié d'Erresen

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

Supprime la int idéclaration en faveur du codage en dur de la division. Je laisserais cela comme un commentaire mais je n’ai pas la réputation.


Bienvenue chez PPCG! Nice premier post! Ne vous inquiétez pas pour le commentaire / la réponse, cela n'a pas d'importance.
Rɪᴋᴇʀ

2

utilitaires bash + Unix, 51 49 47 octets

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

* Merci à @ KenY-N pour avoir signalé que les guillemets de l'écho peuvent être supprimés et à @IporSircer pour avoir réduit la taille de la condition de 2 octets.


Cela me donne une bash: ${}: bad substitutionerreur. Vous pouvez aussi supprimer les citations de Joyeux Noël pour économiser deux octets. En outre, [ `date +%m%d` = 1225 ]&&echo Merry Christmasfonctionne pour moi, égal à mes 45 octets .
Ken YN

1
@ KenY-N L'erreur est intentionnelle: le programme est censé se bloquer les jours autres que Noël. Merci de mentionner que les citations de l'écho peuvent être supprimées. J'ai manqué ça.
Mitchell Spector

Oups, raté cette exigence! Testé en changeant la chaîne de date, et je vois maintenant que ça ne plante pas. Supprimé ma réponse ... Mais, j'ai une alternative, alors laissez-moi la mettre à jour.
Ken YN

Essayez de remplacer ${}par !-pour me battre par un octet. Je vous vote comme vous gagnez.
Ken YN

1
@ KenY-N Merci, mais je ne vais pas changer $ {} en! personnages).
Mitchell Spector

1

Groovy, 57 octets

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

Accidents sur des dates autres que 25.12. avec groovy.lang.MissingPropertyExceptionparce que bn'est pas défini.


1

Empilés , 42 octets

Essayez-le ici!

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

Cela crée un tableau à un seul élément contenant à savoir 'Merry Christmas!'. Après, il met la date dans une chaîne avec le mois suivi du jour. Il vérifie l'égalité avec '1225'(Christmas), l'inverse avec ¬, puis obtient ce membre du tableau précédent. Si ce n'est pas Noël, cela provoquera une erreur d'index. Sinon, ça imprime Merry Christmas. (Modifiez la date dans la chaîne pour voir comment cela fonctionne les autres jours.)


1

Lot, 66 octets

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

Le retour à la ligne final est significatif car il entraîne l' iféchec de l'analyse syntaxique de l' instruction. Vous devrez peut-être modifier la vérification de la date pour qu'elle corresponde au format de date local.


1

Python 2, 69 77 75 ou 72 70 octets

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

Si cela n'a pas d'importance s'il se termine par une erreur à l'approche de Noël, alors:

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

MODIFIER:

Merci @ Flp.Tkc pour avoir signalé que j'avais besoin d'une erreur

-2 octets de @Max pour signaler la suppression de deux points de la fonction strftime


1
Il est prévu de planter si ce n'est pas Noël, cela se produit normalement.
FlipTack

Vous pouvez économiser 2 octets en supprimant les deux points -> '% d% m' == '2512'
Max

@ Max OK, merci pour le tuyau. Je n'avais jamais utilisé cette fonction auparavant, donc je n'y avais pas pensé
sonrad10

économisez encore 3 octets avec: time.ctime () [6:10] == 'c 25'
Max

1

CJam, 28 ans

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

Essayez-le en ligne

Explication:

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 octets

Économisé 8 octets grâce à Kritixi Lithos

Sauvegardé 1 octet grâce à Kritixi Lithos, encore une fois;)

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 non-golfée alternative:

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

Ne pouvez-vous pas donner au programme un nom de classe plus court?
Kritixi Lithos

Vous pouvez supprimer certains octets en remplaçant "NotChristmasException" par quelque chose de plus court.
Léo

@FishProHD Le NotChristmasExceptionn'est que dans la variante non-golfée.
devRicher

@KritixiLithos Merci, cela a changé.
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()note combinée si les déclarations et la suppression des accolades autour du Console.Writeet remplacer returnpar else. Changez aussi, var d=DateTime.Nowvous pouvez vous débarrasser des exceptions avec peut-être args[-1];après avoir renommé les arguments aainsi a[-1];(ceci n'est pas identique à la division par des zéros utilisés ailleurs)
pinkfloydx33

0

Mathematica, 46 octets

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

Nowsauve 2 octets de plusToday
Kelly Lowder

En outre, vous avez besoin d'un crash dans le résultat False, donc je pense que quelque chose comme Quit[]ou 1/0devrait suffire.
Kelly Lowder

0

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

Se bloque avec une fonction non définie si la date n'est pas correcte.


0

awk, 29 octets (+ longueur ("Joyeux Noël"))

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

Le lancer:

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

La salutation de saison est canalisée à awk. strftimeretourne mois + jour (par exemple 1226) et s'il est 1225 $0enregistré , l' enregistrement est sorti. Le résultat de la comparaison 1225==1226est placé dans vvar qui est utilisé pour diviser 1 si la comparaison de date échoue.


0

Haskell, 116

Crashes avec "motifs non exhaustifs dans la fonction f" si ce n'est pas Noël.

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

Malheureusement, aucune fonction ne vous permet d’obtenir immédiatement l’heure dans un format utile. La plupart de ces opérations consistent donc à convertir les formats de date.


0

C #, 122 104 octets

18 octets sauvés, grâce à @raznagul

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

Il ajoute 7 jours au jour actuel et vérifie si c'est le premier jour de l'année. Si oui, il affiche "Joyeux Noël", sinon il se divise par zéro.


Le returnn'est pas nécessaire. Utilisez iau lieu de ().
Raznagul

0

Ruby, 69 octets

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

Fonctionne en 2016. Ne fait pas la différence entre les années normales et les années bissextiles; il peut être nécessaire d'ajuster les années non bissextiles.


0

ForceLang, 180 octets

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

(N'oubliez pas que cela datetime.toDateStringdépend des paramètres régionaux, donc cela peut ne pas fonctionner en fonction de vos paramètres régionaux)


0

C #, 90 octets

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

Lève une exception IndexOutOfRangeException si ce n'est pas Noël.

Essayez-le ici!


0

ligne de commande bash, 45 48 49 48 octets

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

Semblable à celui de Mitchell Spector , mais utiliser grepen mode silencieux pour vérifier une correspondance, puis &&s'assurera qu'il n'imprime qu'en cas de succès, et ||qu'il provoque l'historique avec !-, ce qui me donne ceci:

-bash: !-: event not found

Et cela arrête l'exécution comme le !- ; echo foodémontre. La bashdocumentation indique que cela !-nfait référence à la commande en cours moins n, elle est donc peut-être interprétée comme !-0donnant un message d'erreur identique (et non localisé).


Bonne idée, mais cela ne tombe pas en panne les jours autres que Noël, comme c'est supposé le faire, n'est-ce pas?
Mitchell Spector

Il donne maintenant une erreur en cas d'échec.
Ken YN

1
Ceci affiche un message d'erreur mais continue. ça ne plante pas réellement. Si vous remplacez le. avec $ {} alors il va planter plutôt que d’imprimer un message d’erreur et de continuer. Je pense que le crash nécessite que le programme soit terminé à ce stade. Vous pouvez dire que le vôtre ne se termine pas en ajoutant un "; écho x" à la fin et en veillant à ce qu'il soit exécuté. (C’est la raison pour laquelle j’ai utilisé $ {} au lieu de. Dans ma réponse.) Je ne sais pas s’il existe une séquence de 1 ou 2 caractères pouvant provoquer un crash.
Mitchell Spector

@MitchellSpector: j'ai trouvé une séquence de 2 caractères!
Ken YN

Et maintenant, revenons à 48 en basculant la logique afin que je puisse utiliser ;au lieu de ||.
Ken YN
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.