快活的高尔夫球手,大家好!


35

今天是每个人的圣诞节,这是要庆祝的高尔夫挑战赛。您需要制作一个程序以打印出礼物。具体来说,是“圣诞快乐”。但是,有一个陷阱:该程序仅在12月25日才能运行。如果代码在其他任何一天运行,则该程序应崩溃。

这是Code-Golf,因此以字节数最少的答案为准。

圣诞节快乐!


5
是的,那是ermmmmm。..是的,对不起25日
Leo


3
Golfy Codemas!:)
路易斯·门多

1
不,一定是崩溃。你不能退出aplication
狮子座

2
@PhiNotPi这些挑战是不同的。这不是在要求倒计时,也不涉及等待输出
Leo

Answers:


8

Pyke,21个字节

.dↄґ6C65h*325q/Al

在这里尝试!

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

或18个字节不具有竞争力。

.dↄґ6Cs6Y1q/Al

除了本节外,完全相同:

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

在这里尝试!


如果10月30日失败,不是吗?
魔术章鱼缸

1
@carusocomputing 30 * (10+1)= 330而不是325
蓝色

6

JavaScript,55 53 46字节

注意:此功能仅在Google Chrome浏览器中经过测试,程序的行为可能因浏览器而异(或设备与设备之间不同)

@ ConorO'Brien节省了2个字节

@ETHProductions节省了7个字节

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

Uncaught ReferenceError: a is not defined如果日期不是则退出Dec 25。我不确定这是否算是崩溃

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


怎么.slice(6,10)=="c 25"
科纳·奥布莱恩

@ ConorO'Brien谢谢!太聪明了:)
Kritixi Lithos

@ETHproductions我想不出以c(结尾Oct很近,但仍然不能满足正则表达式)的任何一天或一个月。谢谢你的提示!
Kritixi Lithos

的结果Date()完全取决于实现。例如,我希望它随机器的语言和位置而变化。
Oriol

@Oriol然后我将在答案中指定浏览器
Kritixi Lithos 16/12/26

5

Python 3,66 63字节

感谢来自JavaScript / ES答案的想法,我设法压缩了一些字节。为字典建立索引-不存在的键将引发一个KeyError。以下代码在本地时区工作

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

的输出格式与ctime语言环境无关-格式始终为〜'Sun Dec 25 19:23:05 2016'。由于只有12月份的3个字母的缩写以结尾c,因此'c 25'in time.ctime()在这里可以安全使用。


先前版本:

这适用于UTC时区。对于本地时区,需要再s/gm/local增加3个字节。对于Python 2,可以删除print65个字节的括号。

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

该构造会引发KeyError其他日期:

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

这是否会在其他日期崩溃(应该是)?
Erresen

2
我无法运行此程序,因为它作为键反对元组。如果将其更改为import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]Python 2 ,并将其标记为Python 2,则它仍然是66个字节,并且在12月25日以外的日期
因KeyError崩溃。– ElPedro

@ElPedro oops:D应该是1:3,我偶然复制了我的测试代码
Antti Haapala 2016年

当我借用您的gmtime()想法作为答案时,您会意识到这一点。希望您不要介意:-)
ElPedro

5

PHP,39 38字节,不竞争(不会崩溃)

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

要么

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

要么

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

任何人都可以打4个字节的高尔夫球date(Lz)%1001-358吗?:D
泰特斯

3
这会崩溃吗?
edc65 '16

您可以""在第一个代码中省去2个字节。如果不是因为该死的闰年,你可以节省2字节以上通过更换mdz并且1225由12月25日的一年中的天数。
UTF-8

1
另一种选择:eval((date(md)^TQZZ).'"Merry Christmas";');(43个字节)
Ismael Miguel

1
@ UTF-8:您说得对。我主要使用Elvis作为布尔值;那会打印出来1。这将打印计算结果。并且0104-1225是1121
Titus

4

Python 2中68个 67 65字节

-1感谢@muddyfish

感谢@AnttiHaapala拯救了另一对夫妇的想法。

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

在线尝试!

如果不是12月25日,则抛出IndexError。

59字节的非竞争版本,因为它仅适用于非Le年(使用今年的360,但leap年为361)

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

您不能通过使用列表而不是元组来保存字节吗?
蓝色

@muddyfish谢谢,很好。
ElPedro '16

不错,我的主意是增加了2个字节:P
FlipTack

谢谢。那也是我的67字节版本,直到我评论了@AnttiHaapala的答案并打算削掉gmtime()一对夫妇。我必须承认,我希望我可以用一年中的想法做更多的事情。
ElPedro '16

time.ctime()[6:10] = 'C 25':您可以保存1个字节用!
马克斯

4

R,52 61 58字节

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

如果当前日期不是12月25日,则将返回错误,因为没有提供第三个参数if

编辑:修复了一个愚蠢的错误


对不起,我的错字。我的意思是说25tg
Leo

不过这仅在今年有效!
Erresen '16

@Erresen嗯,愚蠢的错误。现在已修复。
Billywob '16

4

我第一次来这里...从有史以来最好的语言开始:

Java,200 188个字节(感谢@Daniel Gray),186个字节,从打印中删除“ ln”。

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

在这里尝试!


1
欢迎来到PPCG!不错的第一篇文章,即使java并不是最短的。
Rɪᴋᴇʀ

1
您可以更改Calendarfor *并保存一些字节。您还可以args在main方法中缩短参数的名称,我想...
Daniel Gray

@丹尼尔·格雷,你说的很对,谢谢!
Bonifacio

1
欢迎!如果将“ public class”替换为“ interface”并从main删除public修饰符,则可以节省10个字节,从而使其成为“ interface a {static void main ...”。但是,这将阻止Compilejava运行它线上。
Zavada

3

MATL34 33字节

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

这适用于该语言的当前版本(19.7.0)。为了引起错误,以下代码利用了字符串的对数给出错误的事实(在将来的版本中可能会改变)。

在线尝试!

说明

'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个字节

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

说明:

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

这假设美国MM-DD日期符号。如果我最终在QBIC中创建一个Substring函数,它将更短。


在圣诞节以外的日子会发生什么?它会崩溃吗?
Erresen '16

@Erresen现在就开始。
steenbergh

3

05AB1E32 21字节

感谢Adnan的字符串压缩:),节省了11个字节。

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

说明

 ž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

在线尝试!

我做了我首先想到的事情,因此可能有更好的方法。但是PPCG也应该在05AB1E里度过圣诞节;)。


此外,x是重复和双倍的缩写:)。
阿德南

3

C#/ CS脚本106 100 99字节

99字节解决方案

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

在这里尝试!

100字节的解决方案(更喜欢这个...有点不同)

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

解释:

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==1DateTime.Now.ToString("ddMM")=="2512"1个字节短1个字节,但比1个字节长1个字节DateTime.Now.ToString("dM")=="2512"


1
您可以使用$"{DateTime.Now:dM}"=="2512"dM是不明确的,但不适用于“ 2512”。
科比

@Kobi我不能对CS脚本使用字符串插值法:(
Erresen

1
您可以使用LinqPad(例如$"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55字节)=)
肯尼思

为什么int i和不公正1/0
NoOneIsHere

1
@Erresen啊,我的错。我的测试不够充分。调整: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59个字节)
Kenneth K.

2

C#/ CS脚本,96字节,多数抄袭自Erresen

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

删除int i声明,以便对分区进行硬编码。我将其留为评论,但没有声誉。


欢迎来到PPCG!不错的第一篇文章!不必担心评论/答案,也没关系。
Rɪᴋᴇʀ

2

bash + Unix实用程序,51 49 47字节

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

*感谢@ KenY-N指出可以删除回显中的引号,感谢@IporSircer可以将条件大小减少2个字节。


那给我bash: ${}: bad substitution错误。您也可以删除圣诞快乐的引号,以节省两个字节。此外,[ `date +%m%d` = 1225 ]&&echo Merry Christmas对我而言,等于45个字节
肯·肯(YN Ken)

1
@ KenY-N错误是有意的:该程序应该在圣诞节以外的日子崩溃。感谢您提到回显中的引号可以删除;我错过了。
米切尔·史派克

糟糕,错过了该要求!通过更改日期字符串进行了测试,现在我看到它不会崩溃。删除了我的答案...但是,我有另一种选择,所以让我对其进行更新。
Ken YN

尝试更换${}!-一个字节打我。你赢了,我会支持你的。
Ken YN

1
@ KenY-N谢谢,但是我不会将$ {}更改为!-,因为我认为后者只能在命令行上正常运行,而不是在脚本中运行(除非您打开历史记录替换功能,否则将需要更多操作)字符)。
米切尔·史派克

1

Groovy,57个字节

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

在25.12以外的日期崩溃。与groovy.lang.MissingPropertyException因为b没有定义。


1

堆叠,42字节

在这里尝试!

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

这将创建一个包含的单元素数组'Merry Christmas!'。之后,它将日期与月份和日期放在字符串中。它使用'1225'(Christmas)检查是否相等¬,然后使用反转它,然后从前面的数组中获取该成员。如果不是圣诞节,则会出现索引错误。否则,它将打印Merry Christmas。(更改字符串中的日期以查看其在其他日期的工作方式。)


1

批次,66个字节

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

尾随换行符很重要,因为它会导致if语句解析失败。您可能需要调整日期检查以匹配您当地的日期格式。


1

Python 2、69 77 75或72 70字节

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

如果它在圣诞节时是否以错误退出而没有关系,则:

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

编辑:

感谢@ Flp.Tkc指出我需要提出一个错误

@Max中的-2字节,用于指出有关从strftime函数中删除冒号的信息


1
如果不是圣诞节,这意味着崩溃,这只是正常退出。
FlipTack

可以保存2个字节除去冒号- > '%d%M' == '2512'
最大

@Max好,谢谢你的提示。我以前没有使用过此功能,所以我没有想到要这样做
sonrad10

保存另一个3个字节用:time.ctime()[6:10] == 'C 25'
最大

1

CJam,28岁

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

在线尝试

说明:

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字节

感谢Kritixi Lithos,节省了8个字节

再次感谢Kritixi Lithos节省了1个字节;)

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

备选的非高尔夫变体:

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

您不能给程序一个简短的类名吗?
Kritixi Lithos

您可以通过将“ NotChristmasException”更改为较短的内容来删除一些字节。
狮子座

@FishProHD NotChristmasException仅在非高尔夫版本中。
devRicher

@KritixiLithos谢谢,改变了这一点。
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()注:如果语句和清除周围的大括号的组合Console.Write和替换 returnelse。另外更改,var d=DateTime.Now您可以args[-1];在将args重命名为aso 之后摆脱异常引发a[-1];(这与在其他地方使用的零除并不相同)
pinkfloydx33

0

Mathematica,46个字节

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

Now节省2个字节Today
凯利·洛德

另外,您需要在False结果上崩溃,所以我认为类似Quit[]1/0应该足够的。
凯利·洛德

0

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

如果日期不正确,则会使用未定义的函数崩溃。


0

awk,29个字节(+长度(“ Merry xmas”))

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

运行它:

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

季节问候已传送到awkstrftime返回month + day(例如1226),如果匹配则1225 $0输出记录。比较结果1225==1226放在vvar上,如果日期比较失败,该变量用于除以1。


0

哈斯克尔(116)

如果不是圣诞节,则会崩溃并显示“函数f中的非穷尽模式”。

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

不幸的是,没有一个功能可以让您立即以一种有用的格式获取时间,因此大多数转换日期格式。


0

C#,122 104字节

感谢@raznagul,节省了18个字节

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

它会在当天增加7天,并检查是否是一年的第一天,如果是,则显示“ Merry Christmas”,否则除以零。


return是没有必要的。使用i代替()
raznagul

0

Ruby,69个字节

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

在2016年有效。无法区分正常年份和leap年,可能需要针对非-年进行调整。


0

ForceLang,180个字节

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

(请记住,这datetime.toDateString取决于语言环境,因此这可能无法使用,具体取决于您的语言环境)


0

C#,90个字节

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

如果不是圣诞节,则抛出IndexOutOfRangeException。

在这里尝试!


0

bash命令行,45 48 49 48字节

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

类似于Mitchell Spector的,但是grep在静默模式下使用以检查是否匹配,然后&&将确保仅在成功时打印,并确保||其使用来查询历史记录!-,这使我做到了:

-bash: !-: event not found

并停止执行,如!- ; echo foo所示。的bash文档说!-n指的是电流指令减去n,因此,也许它被解释为!-0,这给出了一个相同的(与非本地化的)错误消息。


好主意,但这不会在圣诞节以外的其他日子崩溃,不是吗?
米切尔·史派克

现在,它会给出错误错误。
Ken YN

1
这会打印一条错误消息,但会继续;它实际上并没有崩溃。如果您更换。如果使用$ {},则实际上会崩溃,而不是简单地打印错误消息并继续。我认为崩溃需要程序在那时终止。您可以通过在末尾添加一个额外的“; echo x”并看到它已被执行来告诉您,它不会终止。(这就是为什么我在答案中使用$ {}而不是。的原因。)我不知道您是否可以使用某些1或2个字符的序列来导致实际崩溃。
米切尔·史派克

@MitchellSpector:我发现了2个字符的序列!
Ken YN

现在通过切换逻辑回到48,因此我可以使用;代替||
Ken YN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.