Merry Golfmas, todos!


35

Es Navidad para todos, y aquí hay un desafío de código de golf para celebrar. Necesita hacer un programa para imprimir un regalo. Específicamente, las palabras "Feliz Navidad". PERO, hay una trampa: este programa solo debe funcionar si es el 25 de diciembre. Si el código se ejecuta en cualquier otro día, entonces el programa debería bloquearse.

Este es Code-Golf, por lo que gana la respuesta con la menor cantidad de bytes.

¡Feliz Navidad!


55
Sí, eso fue ermmmmm. .. sí 25 lo siento
Leo


3
¡Codemas de golf ! :)
Luis Mendo

1
No, debe ser un accidente. No puede salir de la aplicación
Leo

2
@PhiNotPi Esos desafíos son diferentes. Esto no está pidiendo una cuenta regresiva y no implica esperar para dar salida
Leo

Respuestas:


8

Pyke, 21 bytes

.dↄґ6C65h*325q/Al

Pruébalo aquí!

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

O 18 bytes no competitivos.

.dↄґ6Cs6Y1q/Al

Exactamente lo mismo excepto por esta sección:

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

Pruébalo aquí!


Esto falla si es el 30 de octubre, ¿no es así?
Urna de pulpo mágico

1
@carusocomputing 30 * (10+1)= 330 no 325
Azul

6

JavaScript, 55 53 46 bytes

Nota: esto solo se ha probado en Google Chrome, el programa puede comportarse de manera diferente de un navegador a otro (o de un dispositivo a otro)

2 bytes guardados gracias a @ ConorO'Brien

7 bytes guardados gracias a @ETHProductions

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

Sale con Uncaught ReferenceError: a is not definedsi la fecha no es Dec 25. No estoy realmente seguro si esto cuenta como estrellarse

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


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

@ ConorO'Brien Gracias! Eso es inteligente :)
Kritixi Lithos

@ETHproductions No puedo pensar en ningún día o mes que termine en c( Octse acerca, pero aún así no satisface la expresión regular). ¡Gracias por el consejo!
Kritixi Lithos

El resultado de Date()es completamente dependiente de la implementación. Por ejemplo, espero que varíe con el idioma y la ubicación de la máquina.
Oriol

@Oriol Luego especificaré el navegador en mi respuesta
Kritixi Lithos

5

Python 3, 66 63 bytes

Gracias a las ideas de las respuestas de JavaScript / ES aquí, logré exprimir algunos bytes. Indexar un diccionario: las claves inexistentes elevarán a KeyError. El siguiente código funciona en la zona horaria local

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

El formato de salida para ctimeno depende de la configuración regional: el formato siempre es ~ 'Sun Dec 25 19:23:05 2016'. Dado que solo en diciembre termina la abreviatura de 3 letras c, es seguro usarla 'c 25'in time.ctime()aquí.


Versión previa:

Esto funciona en la zona horaria UTC. Para la zona horaria local, se necesitan s/gm/local3 bytes más. Para Python 2, se pueden eliminar paréntesis de print65 bytes.

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

La construcción arroja KeyErroren otras fechas:

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

¿Se bloquea esto en otros días (se supone que debe hacerlo)?
Erresen

2
No puedo hacer que este se ejecute, ya que se opone a la tupla como clave . . Si lo cambia import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]y lo etiqueta como Python 2, todavía tiene 66 bytes y se bloquea con un KeyError en fechas distintas del 25 de diciembre.
ElPedro

@ElPedro oops: D debería haber sido 1:3, copié mi código de prueba por accidente
Antti Haapala

Entendí eso cuando tomé prestada tu gmtime()idea para mi respuesta. Espero que no te
importe

5

PHP, 39 38 bytes, no compite (no se bloquea)

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

o

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

o

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

¿Alguien puede jugar 4 bytes date(Lz)%1001-358? : D
Titus

3
¿Se cuelga esto?
edc65

Puede omitir ""en el primer código que le ahorra 2 bytes. Si no fuera por años bisiestos maldita, podría ahorrar más de 2 bytes mediante la sustitución mdpor zy 1225por el número del día del año del 25 de diciembre.
UTF-8

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

1
@ UTF-8: Tienes razón. Principalmente uso el Elvis para valores booleanos; y eso se imprimiría 1. Esto imprimiría el resultado del cálculo. y 0104-1225es 1121.
Tito

4

Python 2 , 68 67 65 bytes

-1 con agradecimiento a @muddyfish

Gracias a @AnttiHaapala por la idea que salvó a otra pareja.

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

Pruébalo en línea!

Lanza un IndexError si no el 25 de diciembre.

Versión no competitiva para 59 bytes, ya que solo funciona para años no bisiestos (utiliza el día del año, que es 360 este año pero 361 en años bisiestos)

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

¿No puedes guardar un byte usando una lista en lugar de una tupla?
Azul

@muddyfish Gracias, buena captura.
ElPedro

Buena idea, mi idea era 2 bytes adicionales : P
FlipTack

Gracias. Esa fue también mi versión de 67 bytes hasta que comenté la respuesta de @AnttiHaapala y pensé gmtime()en afeitarme un par. Tengo que admitir que desearía que hubiera más cosas que pudiera hacer con la idea del día del año.
ElPedro

Puede guardar 1 byte con: time.ctime () [6:10]! = 'C 25'
Máximo

4

R, 52 61 58 bytes

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

Si la fecha actual no es el 25 de diciembre, se devuelve un error porque no se proporciona ningún tercer argumento if.

Editar: se corrigió un error tonto


Perdón por mi pequeño error tipográfico. Quise decir 25 tg
Leo

¡Esto solo funciona este año!
Erresen

@Erresen Ah, cierto, error tonto. Ahora arreglado sin embargo.
Billywob

4

Mi primera vez por aquí ... Comencé con el mejor idioma para este trabajo:

Java, 200 188 bytes (gracias a @Daniel Gray), 186 bytes eliminando "ln" de la impresión.

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

Pruébalo aquí!


1
Bienvenido a PPCG! Bonita primera publicación, aunque Java no es la más corta.
Rɪᴋᴇʀ

1
Puede cambiar el Calendarfor *y guardar algunos bytes. También podría acortar el nombre del argsparámetro en el método principal, creo ...
Daniel Gray

@Daniel Gray, tienes toda la razón, ¡gracias!
Bonifacio

1
¡Bienvenido! Puede guardar 10 bytes si reemplaza "public class" con "interface" y elimina el modificador público de main, convirtiéndolo en "interface a {static void main ..." Esto, sin embargo, impedirá que Compilejava pueda ejecutarlo en línea.
Zavada

3

MATL , 34 33 bytes

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

Esto funciona en la versión actual (19.7.0) del lenguaje. Para causar el error, el siguiente código explota el hecho de que el logaritmo de una cadena da un error (esto puede cambiar en futuras versiones).

Pruébalo en línea!

Explicación

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

Explicación:

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

Esto supone la MM-DDnotación de fecha estadounidense . Esto sería más corto si finalmente hiciera una función de subcadena en QBIC.


¿Qué pasa en los días que no son Navidad? ¿Se estrella como se supone que debe?
Erresen

@Erresen lo hace ahora.
steenbergh

3

05AB1E ,32 21 bytes

Guardado 11 bytes gracias a la compresión de cadena de Adnan :).

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

Explicación

 ž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

Pruébalo en línea!

Hice lo que se me ocurrió primero, por lo que puede haber mejores enfoques para este. Pero PPCG también merece una Feliz Navidad en 05AB1E;).


Además, xes la abreviatura de duplicado y doble :).
Adnan

3

C # / CS de script 106 100 99 bytes

Solución de 99 bytes

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

Pruébalo aquí!

Solución de 100 bytes (prefiera esta ... un poco 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==1es un byte más corto que DateTime.Now.ToString("ddMM")=="2512"pero 1 byte más largo queDateTime.Now.ToString("dM")=="2512"


1
Puedes usar $"{DateTime.Now:dM}"=="2512". dMes ambiguo, pero no para "2512".
Kobi

@ Kobi No puedo usar la interpolación de cadenas para CS Script :(
Erresen

1
Puede hacerlo si usa LinqPad (por ejemplo, $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 bytes) =)
Kenneth K.

¿Por qué int iy no solo 1/0?
NoOneIsHere

1
@ Erresen Ah, mi error. No probé lo suficiente. Tweaked: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 bytes)
Kenneth

2

C # / CS Script, 96 Bytes, mayormente plagiado de Erresen

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

Elimina la int ideclaración a favor de la codificación rígida de la división. Dejaría esto como un comentario pero no tengo la reputación.


Bienvenido a PPCG! Bonito primer post! No te preocupes por el comentario / respuesta, no importa demasiado.
Rɪᴋᴇʀ

2

bash + utilidades Unix, 51 49 47 bytes

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

* Gracias a @ KenY-N por señalar que las comillas en el eco se pueden eliminar, y a @IporSircer por reducir el tamaño de la condición en 2 bytes.


Eso me da un bash: ${}: bad substitutionerror. También puede descartar las citas de Feliz Navidad para guardar dos bytes. Además, [ `date +%m%d` = 1225 ]&&echo Merry Christmasfunciona para mí, igualando mis 45 bytes .
Ken YN

1
@ KenY-N El error es intencional: se supone que el programa se bloquea en días que no sean Navidad. Gracias por mencionar que las citas en el eco pueden descartarse; Me lo perdí.
Mitchell Spector

¡Vaya, se perdió ese requisito! Probado cambiando la cadena de fecha, y ahora veo que no se bloquea. Eliminé mi respuesta ... Pero, tengo una alternativa, así que permítanme actualizarla.
Ken YN

Trate de reemplazar ${}con !-que yo por un byte. Te votaré a medida que ganes.
Ken YN

1
@ KenY-N Gracias, pero no voy a cambiar $ {} a! - ya que creo que este último solo funcionará correctamente en la línea de comando, no en un script (a menos que active la sustitución del historial, lo que requeriría más caracteres).
Mitchell Spector

1

Groovy, 57 bytes

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

Se bloquea en fechas distintas de 25.12. con groovy.lang.MissingPropertyExceptionporque bno está definido.


1

Apilado , 42 bytes

Pruébalo aquí!

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

Esto crea una matriz de un solo elemento que contiene a saber 'Merry Christmas!'. Después, pone la fecha en una cadena con el mes seguido del día. Comprueba la igualdad con '1225'(Navidad), lo invierte y ¬luego obtiene ese miembro de la matriz anterior. Si no es Navidad, esto generará un error de índice. De lo contrario, se imprime Merry Christmas. (Cambie la fecha en la cadena para ver cómo funciona en otros días).


1

Lote, 66 bytes

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

La nueva línea final es significativa, ya que hace que el análisis de la ifdeclaración falle. Es posible que deba ajustar la verificación de fecha para que coincida con su formato de fecha local.


1

Python 2, 69 77 75 o 72 70 Bytes

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

Si no importa si sale con un error cuando es Navidad, entonces:

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

EDITAR:

Gracias @ Flp.Tkc por señalar que necesitaba generar un error

-2 bytes de @Max para señalar sobre la eliminación de dos puntos de la función strftime


1
Está destinado a estrellarse si no es Navidad, esto simplemente sale normalmente.
FlipTack

Puede guardar 2 bytes eliminando los dos puntos -> '% d% m' == '2512'
Máximo

@Max OK, gracias por el consejo. No había usado esta función antes, así que no había pensado en hacerlo
Sonrad10

guarde otros 3 bytes con: time.ctime () [6:10] == 'c 25'
Max

1

CJam, 28

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

Pruébalo en línea

Explicación:

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

Guardado 8 bytes gracias a Kritixi Lithos

Guardado 1 byte gracias a Kritixi Lithos, de nuevo;)

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

Alternativa, variante sin golf:

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

¿No puedes darle al programa un nombre de clase más corto?
Kritixi Lithos

Puede eliminar algunos bytes cambiando "NotChristmasException" a algo más corto.
Leo

@FishProHD The NotChristmasExceptionestá solo en la variante no golfista.
devRicher

@ KritixiLithos Gracias, eso cambió.
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()nota combinada si las declaraciones y la eliminación de llaves alrededor de Console.Writey reemplazar returncon else. También cambie var d=DateTime.Now, puede deshacerse del lanzamiento de excepción con quizás args[-1];después de cambiar el nombre de args a aeso a[-1];(esto no es idéntico a dividir por ceros utilizados en otros lugares)
pinkfloydx33

0

Mathematica, 46 bytes

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

Nowahorra 2 bytes másToday
Kelly Lowder

Además, necesita un bloqueo en el resultado Falso, así que creo que algo como Quit[]o 1/0debería ser suficiente.
Kelly Lowder

0

Lisp común, 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 bloquea con una función indefinida si la fecha no es correcta.


0

awk, 29 bytes (+ longitud ("Merry xmas"))

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

Ejecutándolo:

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

Saludo de temporada se canaliza a awk. strftimedevuelve mes + día (por ejemplo 1226) y si coincide, el 1225 $0registro se expira. El resultado de la comparación 1225==1226se coloca en vvar, que se usa para dividir 1 si la comparación de fechas falla.


0

Haskell, 116

Se bloquea con "Patrones no exhaustivos en la función f" si no es Navidad.

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

Desafortunadamente, no hay una función que le permita obtener la hora inmediatamente en un formato útil, por lo que la mayor parte de esto es convertir los formatos de fecha.


0

C #, 122104 bytes

18 bytes guardados, gracias a @raznagul

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

Agrega 7 días al día actual y comprueba si es el primer día del año; en caso afirmativo, muestra "Feliz Navidad"; de lo contrario, se divide por cero.


El returnno es necesario. Usar en ilugar de ().
raznagul

0

Ruby, 69 bytes

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

Funciona en 2016. No distingue entre años normales y bisiestos, es posible que deba ajustarse para los años no bisiestos.


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

(Recuerde que datetime.toDateStringdepende de la configuración regional, por lo que esto puede no funcionar dependiendo de su configuración regional)


0

C #, 90 bytes

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

Lanza IndexOutOfRangeException si no es Navidad.

Pruébalo aquí!


0

línea de comando bash, 45 48 49 48 bytes

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

Similar a Mitchell Spector , pero se usa grepen modo silencioso para verificar una coincidencia, luego &&se asegurará de que solo se imprima en el éxito y las ||causas para que busque el historial !-, lo que me da esto:

-bash: !-: event not found

Y detiene la ejecución como lo !- ; echo foodemuestra. La bashdocumentación dice que se !-nrefiere al comando actual menos n, por lo que tal vez se está interpretando como !-0, lo que da un mensaje de error idéntico (y no localizado).


Buena idea, pero esto no se bloquea en días que no sean Navidad, como se supone que debe hacerlo, ¿verdad?
Mitchell Spector

Ahora da un error en caso de falla.
Ken YN

1
Esto imprime un mensaje de error pero continúa; en realidad no se bloquea. Si reemplaza el. con $ {}, se bloqueará en lugar de simplemente imprimir un mensaje de error y continuar. Creo que el bloqueo requiere que el programa se termine en ese punto. Puede decir que el suyo no termina poniendo un "; echo x" adicional al final y viendo que se ejecuta. (Es por eso que usé $ {} en lugar de. En mi respuesta.) No sé si hay alguna secuencia de 1 o 2 caracteres que pueda usar que cause un bloqueo real.
Mitchell Spector

@ MitchellSpector: ¡Encontré una secuencia de 2 caracteres!
Ken YN

Y ahora de vuelta a 48 cambiando la lógica para que pueda usar en ;lugar de ||.
Ken YN
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.