祝我生日快乐!


21

祝我生日快乐!

编写一个Happy birthday to me!在生日那天打印的程序。

  1. 程序的生日是程序的创建,最后修改或编译时间(您选择),并且不得进行硬编码。
  2. 用作生日的日期不得以任何方式受到程序的调用或执行的影响。您无法修改生日。
  3. 对于额外的积分(-15%字节数)Happy birthday to you!如果生日与程序不一致,请在生日当天打印(硬编码)。或使用名人的生日获得-14%。
  4. 它只能打印此内容,而在其他任何一天都不能打印任何内容。
  5. 以UTF-8计数字节。
  6. 使用公历。

祝您好运(生日快乐)(适用于新生儿节目)。

PS
在Izkata发表评论后,如果Happy birthday to MelMel Kaye的生日上打印,您将获得20%的折扣。但是,您必须提供可靠的消息来源,即该日期。


1
@TeunPronk,您不能两者都做。您可以使用自己的生日,也可以使用名人的生日(或不使用,并放弃额外的积分)。
ugoren 2014年

4
@TeunPronk:只有Jon Skeet可以:P
MSalters 2014年

11
我在热门问题侧栏中看到了此内容,并阅读了“ 梅尔生日快乐” ...
Izkata 2014年

1
@PeterTaylor:嗯?对于代码高尔夫球问题,通常会授予各种额外分数的分数奖金,这是很常见的,而且我以前从未见过有人声称只要主要得分标准是代码长度,它就会取消使用该标签的问题。
Ilmari Karonen 2014年

1
@Izkata,为了纪念梅尔,更新了问题。
ugoren 2014年

Answers:


10

PHP 77 75 74 65 60

非常感谢Tim Seguine的出色建议:

<?date(dm,getlastmod())-date(dm)&&die?>Happy birthday to me!

偷偷摸摸的PHP:46 42 41 40

再次使用Phil H的想法Tim Seguine的建议

<?touch(__FILE__)?>Happy birthday to me!

比较中不包括年份吗?如果是这样,则只能在0岁生日使用。
ugoren 2014年

@ugoren你是对的!感谢您的更正。保存2个字节。
ComFreek

如果规则中的“什么都不做”被解释为标准输出,则可以通过删除字符串''周围的内容来赢得4个字节dm。它生成了一个警告,但是我相信如果打开错误报告,它将被发送到标准错误。
Tim Seguine 2014年

4
<?date(dm,stat(__FILE__)[9])-date(dm)&&die?>Happy birthday to me!
Tim Seguine 2014年

1
@TimSeguine感谢您的建议!我已经将它们合并到我的答案中,希望您不要介意。
ComFreek 2014年

48

重击(鬼s):36

touch $0;echo Happy Birthday to me\!

按照规则:“程序的创建,修改或编译时间”。我选择修改时间,以及永久的自我修改。[HT @ace为1个字符]

Perl(也偷偷摸摸):29

print "Happy birthday to me!"

可以说这比第一个偷偷摸摸。Perl程序总是在执行之前就进行编译,这不是每个人都知道的-瞧瞧,关于偷偷摸摸的事情有教育意义。这是我使用的编译日期。

-编辑规则更改-

这是在没有任何关于更改生日的规则之前写的。我认为Perl仍然存在。所有Perl程序在运行之前都已编译。我出于教育原因将答案留在这里!


6
好的,作弊者,请为我的聪明+1。
Victor Stafusa 2014年

1
您可以转义!\!并删除引号以保存1个字符
user12205 2014年

1
不错,但是规则明确禁止了它(现在)。
ugoren 2014年

1
@ugoren Still仍不禁止perl解决方案,该解决方案是在程序启动之前进行编译的。
Cruncher 2014年

3
@Cruncher,恐怕你是对的。我将咨询我的律师并将账单发送给您。
ugoren 2014年

13

重击-65

[ `date +%d%m -r $0` = `date +%d%m` ]&&echo Happy birthday to me!

感谢ugorenacenyuszika7h的帮助。


我认为您可以使用进行转义!\!因此不需要引号并节省1个字符。
user12205 2014年

实际上,我有引号,因为我认为回声将需要空格。我把它们拿出来,并没有逃过感叹号,它仍然有效。谢谢你的提示!
shiona 2014年

2
您只需要!在交互式shell中进行转义,而不必在脚本中进行转义。
nyuszika7h 2014年

您可以使用[]代替[[和来保存两个字符]]
nyuszika7h 2014年

1
当年份与创建日期不同时,它可以工作吗?
ugoren 2014年

6

C#198.05(233-15%)

using s=System;class P{static void Main(){string t=s.DateTime.Now.ToString("Mdd"),b="1202";if(s.IO.File.GetCreationTime(typeof(P).Assembly.Location).ToString("Mdd")==t|b==t)s.Console.Write("Happy birthday to "+(b==t?"you!":"me!"));}}

格式:

using s = System;
class P
{
    static void Main()
    {
        string t = s.DateTime.Now.ToString("Mdd"), b = "1202";
        if (s.IO.File.GetCreationTime(typeof(P).Assembly.Location).ToString("Mdd") == t | b == t)
            s.Console.Write("Happy birthday to " + (b == t ? "you!" : "me!"));
    }
}

191(无奖金)

using s=System;class P{static void Main(){if(s.IO.File.GetCreationTime(typeof(P).Assembly.Location).ToString("Mdd")==s.DateTime.Now.ToString("Mdd"))s.Console.Write("Happy birthday to me!");}}

181,05(213-15%)

通过一些其他说明(您需要将其编译b.exe为可执行文件所在的目录并从该目录中运行它),我可以将其简化为:

using s=System;class P{static void Main(){string t=s.DateTime.Now.ToString("Mdd"),b="1202";if(s.IO.File.GetCreationTime("b.exe").ToString("Mdd")==t|b==t)s.Console.Write("Happy birthday to "+(b==t?"you!":"me!"));}}

171(无奖金)

与上面的说明相同,这次仅在自己的生日打印消息(因此没有-15%的奖金)。

using s=System;class P{static void Main(){if(s.IO.File.GetCreationTime("b.exe").ToString("Mdd")==s.DateTime.Now.ToString("Mdd"))s.Console.Write("Happy birthday to me!");}}

您可以在,b="1202"==t获得日期字符串后添加并使用它来节省一些额外的字节。
ahruss

1
谢谢!尽管“很少字节”竟然是一个……还是我错过了什么?编辑啊,我明白了;您说过,,b="1202"==t但该==t部分是不可能的,因为该部分的结果为布尔值,另一个var为字符串。您不能(即AFAIK)在一个“ var”声明中使用两种不同的类型。
RobIII

啊好吧。自从我使用C#已经有一段时间了。我的错。
ahruss

您可以通过比较日期而不是字符串来缩短简单版本。这个男人用的是类似的东西CreationTime.Date == DateTime.Today
svick

那只会在今天/今年/生日0起作用。在其他年份如何起作用?
RobIII

5

爪哇-275-15%= 233.75(有奖金)/ 237(无奖金)

有奖金:

import java.util.*;class L{public static void main(String[]y){int s=f(new Date());String j="Happy birthday to ";System.out.print(s==f(new Date(new java.io.File("L.class").lastModified()))?j+"me!":s==183?j+"you!":"");}static int f(Date d){return d.getMonth()*40+d.getDate();}}

没有奖金:

import java.util.*;class L{public static void main(String[]y){if(f(new Date())==f(new Date(new java.io.File("L.class").lastModified())))System.out.print("Happy birthday to me!");}static int f(Date d){return d.getMonth()*40+d.getDate();}}

我出生于4月23日。


1
祝你生日快乐,不用于 ;-)刚刚救了你另一个字节:-)
RobIII

@RobIII谢谢,固定。
Victor Stafusa 2014年

另外,\n不需要换行()AFAIK,这可以为您节省另外4个字节;-)
RobIII,2014年

@RobIII再次感谢。
Victor Stafusa 2014年

是的...我应该停止用自己的脚射击:不客气;)
RobIII 2014年

3

我为能在消息中节省一些字节的小技巧而感到自豪。我希望它将包含在其他答案中。我是第一个想到这个的人!

蟒蛇

105个字符,无需额外积分。将文件另存为“我生日快乐”并运行。仅在格林尼治标准时间运行,“生日”是指您的出生日期,而不是周年纪念日(通常也称为“生日”)。

import sys,os,time
if (int(os.stat(*sys.argv).st_atime/86400)==int(time.time()/86400)):print sys.argv[0]

为使其正常运行,请将其保存为“对我生日快乐”并运行 python "happy birthday to me"

注意:当然,除了很小的引导程序之外,所有文件都可以包含在文件名中,从而使任何任意大的代码都减少到引导程序中。通常我会考虑这种“作弊”。但是,“祝我生日快乐”并不是一个不合理的文件名-它描述了程序的功能,比某些程序(例如“ python”)要好得多,因此在这种情况下,我将允许它:)


我认为依赖文件名是一种欺骗(尽管我没有明确禁止它)。如果允许,为什么不写eval(sys.argv[0])
ugoren 2014年

我不必费心定义一个生日,但这是每年一个人庆祝自己的生日的日子,而不是您出生的确切日子。
ugoren

ugoren:我确实在底部的注释中提到了该注释(该注释早于您的评论)。However, "happy birthday to me" is not an unreasonable filename - it describes what the program does, much better than some programs (e.g. "python"), so in this case I'm going to allow it
AMADANON Inc. 2014年

2

Matlab:66

t=dir('f.m');if strncmp(t.date,date,5),'Happy birthday to me!',end

文件名必须为“ fm”


1
你的生日,应该说“祝你生日快乐,你!” :-)
RobIII

@RobIII:糟糕,您是对的,我没有足够仔细地阅读。将删除第二个版本。谢谢!
H.Muster 2014年

我假设strncmp(x, y, 5)比较日期,例如28-12-2013的前15个字符(28-12例如12月28日)。yyyy/mm/dd例如,在用户的区域设置时,这是否也起作用?Matlab是否默认为dd-mm-yyyy始终?(只是好奇)。编辑 Nevermind:找到了!。看来确实如此。它不会有问题,无论如何,mm/dd/yyyy还是dd-mm-yyyy因为左,右操作无论如何都会使用相同的格式和两个5个最左边的字符将反正匹配; 只要这一年永远不会过去。
RobIII

为什么需要变量t?不行dir('f.m').date
ugoren 2014年

@ugoren:t必须dir返回文件属性(否则它将只返回目录中所有与匹配的文件'f.m')。此外,t访问该date字段是必需的。
H.Muster

2

GNU COBOL with -free,204

PROGRAM-ID.B.DATA DIVISION.WORKING-STORAGE SECTION.
1 A PIC XXXX/XX.
1 B PIC X(5).
1 C PIC X(21).
PROCEDURE DIVISION.ACCEPT A FROM DATE
ACCEPT C
MOVE WHEN-COMPILED TO B
IF A(3:5) = B OR "12/09" DISPLAY C.

我违反了有关名人的规定,所以那里没有奖金...

生成的文本是用户输入的(运行时需要)。如果这样做不好,则C需要删除定义的行ACCEPT C,也DISPLAY C必须删除,并且必须变为 DISPLAY "HAPPY BIRTHDAY TO ME!",以额外增加七个字符。

WHEN-COMPILED是一个包含编译日期/时间的特殊寄存器,程序可以使用它(总是很方便,您可以知道您使用的版本正确)。在中它被截断了,MOVE因为不需要其余的。DATE是当前日期-这个日期是yymmdd。

/在A的定义是一个插入编辑符号,由于编译日期包含斜线。一个额外的字符,但简化了比较。

名人=格蕾丝·霍珀


2

批次-37字节

窃取Bash答案之一使用的方法。

@echo.>>%0&echo Happy birthday to me!

其他方法-145字节

@for /f "tokens=2,3 delims=/ " %%a in ("%date%")do @for /f "tokens=1,2 delims=/" %%c in ("%~t0")do @if %%a%%b==%%c%%d @echo Happy Birthday to me!

1

Ruby,69个字符/字节

puts'Happy birthday to me!'if(Time.new-File.atime($0))%31536000<86400

31536000是一年中86400的秒数,也是一天中的秒数。


4
不幸的是,直到您遇到这段时间后的第一个leap年,才可以正常工作最多七年左右。
阿玛丹2014年

在生日后的第二天也说“生日快乐”,在生日前的生日第二天不说生日快乐。
AMADANON Inc. 2014年

1

的JavaScript

Node.js,156个字节

b=new Date(require("fs").statSync(__filename).mtime);d=new Date();b.getDate()==d.getDate()&&b.getMonth()==d.getMonth()&&console.log("Happy birthday to me!")

使用文件的修改时间。


到目前为止,以56个字节击败了您= P

运行您的程序时会出现运行时错误,但是match方法肯定更聪明。修正错误,您已经赞成我。;)
Chris W.

您能否引用错误和您的操作系统?我猜这不是跨平台的。
锶2014年

1

Powershell-105字节

if('{0:M}'-f(gi $MyInvocation.MyCommand.Definition).creationtime-eq(date -f M)){'Happy birthday to me!'}

取消高尔夫:

if('{0:M}' -f (gi $MyInvocation.MyCommand.Definition).creationtime -eq (date -f M)){
  'Happy birthday to me!'
}

奖金是不值得的,我只能得到117.5。


1

Powershell-127

if ((gci $MyInvocation.MyCommand.Path).lastwritetime.ToString("MMdd") -eq (get-date).ToString("MMdd")){"happy birthday to me!"}

15%的奖金-151字节,减去15%= 128.4

$r=@{"0308"="you";(gci $MyInvocation.MyCommand.Path).lastwritetime.ToString("MMdd")="me"}[(get-date).tostring("MMdd")]
if($r){"Happy birthday to $r!"}

1
我不是powershell专家,但这仅在今年有效吗?当“程序”是第1、2、3等生日时该怎么办?
RobIII

您可以删除write命令-仅使用"happy birthday to me!"它即可将其打印出来。
2014年

你说的很对 我应该知道
克里斯J

@Robill-哎呀。这就是在我因其他事情而分心并使用codegolf拖延时编写某些事情的结果。已修正(请注意,并不是说它有获胜的机会)。
克里斯J

1

红宝石- 80个 103 87个字节

m=File.mtime $0
t=Time.now
puts"Happy birthday to me!"if t.month==m.month&&t.day==m.day

红宝石- 123 115 135 121 - 15(%)= 104.55 97.75 114.75 102.85点

t=Time.now
{me:File.mtime($0),you:Time.at(36e5)}.map{|n,d|puts"Happy birthday to #{n}!"if t.month==d.month&&t.day==d.day}

可能长些或短些,这取决于您的生日在一年中的哪一天,以及表示它的最短方法。对于我来说,这是36e5(自纪元以来的秒数;取​​决于时区)。


梅尔· 吉布森( Mel Gibson)计数吗?这是一个138字节-35%的奖金= 89.7分的节目,庆祝自己,我和梅尔!

t=Time.now
{me:File.mtime($0),you:Time.at(36e5),Mel:Time.at(2e5)}.map{|n,d|puts"Happy birthday to #{n}!"if t.month==d.month&&t.day==d.day}

1
您的代码在leap年中失败,日期为2月之后。
ugoren 2014年

@ugoren对,你是。修正了这一点,但是却丢了很多分:(
蒂姆·S。

但是现在我已经收回了其中的大多数!=)
蒂姆·S.

0

PureBasic

没有奖金-142

If Bool(FormatDate("%dd%mm",Date())=FormatDate("%dd%mm",GetFileDate(ProgramFilename(),0)))
MessageRequester("","Happy birthday To me!")
EndIf

有奖金-218-15%= 185.3

Dim s$(2)
s$(1)="me"
s$(2)="you"
m$="%dd%mm"
d$=FormatDate(m$,Date())
i=Bool(d$=FormatDate(m$,GetFileDate(ProgramFilename(),0)))|(Bool(d$="2301")<<1)
If i=0:End:EndIf
MessageRequester("","Happy birthday To "+s$(i)+"!")

0

TI-BASIC,68个字节

If Ans=0:getDate→G:0:G=G:If getDate=G:Disp "HAPPY BIRTHDAY TO ME!"

请记住,这些标记是一个字节:If , Ans, →, DispgetDate是两个字节。所有其他一字符符号均为一个字节。


1
您确定那是UTF-8吗?
Fozzedout 2014年

3
OP明确指出您应该使用UTF-8。这是66个字符和68个字节。
nyuszika7h 2014年

2
如果要声明其为46个字节,请以46个字节写入。现在,它是68个字节。
ugoren 2014年

根据标准TI-Basic环境中的令牌大小,该字节为55个字节,但以纯文本格式为68个字节。从技术上讲,末尾也不必有一个“,这样可以节省一个字节。”
Lemon Drop

0

J 79

 echo((6!:0'')(('',:'Happy birthday to me!'){~])@:-:&(1 2&{)&:>])1{,1!:0{:4!:3''

奖励版本120-15%= 102

当他们两个都过生日时,我是否还能同时打印两个字?

echo((2 6$(6!:0 '') , 0 2 7)(' ','Happy birthday to ',"2 1]3 5$'you! me!  both!'){~#.@:(-:&(1 2&{)"1)&:>])1{,1!:0{:4!:3''

说明(从右到左):

last =: {:4!:3''     NB. Take the last script run (i.e. the file itself)
time =: 1{,1!:0 last NB. the modification time is the second element in that file's listing

火车的中心动词

unbox_both =: &:>      NB. unboxes left and right argument
match  =: -:&(1 2&{)"1 NB. for each date given, left and right, compare them
to_int =: #.           NB. convert boolean to int
from   =: {~           NB. from the left array, take element right.

NB. H contains messages an empty row, appended to all combinations of messages. 
H =: (' ','Happy birthday to ',"2 1]3 5$'you! me!  both!')

V =: (H from to_int)@:match unbox_both NB. after unboxing and comparing, 
                                       NB. select the according message

中央火车的左齿:

dates=: (2 6$(6!:0 '') , 0 2 7) NB. the current date, and the relevant fields of my birthday.

NB. Combining the bricks:
echo (dates V ]) time           NB. output the monads result on time.

0

Java-196

这与其他Java提交不同,使用字符串,在此过程中减少了41个字符。它使用String.format(“%tj”)格式化java.util.Date或一年中最长的一天的字符串,然后比较这两个字符串。

class Z{public static void main(String[]y){if("".format("%tj",new java.util.Date()).equals("".format("%tj",new java.io.File("Z.class").lastModified())))System.out.print("Happy birthday to me!");}}

格式:

class Z
{
    public static void main(String[] y)
    {
        if ("".format("%tj", new java.util.Date()).equals("".format("%tj", new java.io.File("Z.class").lastModified())))
            System.out.print("Happy birthday to me!");
    }
}

1
leap日不适用于一年中的某天。
ugoren 2014年

@ugoren我同意。但是,由于竞赛目前正在进行中,所以我们将于2月20日举行。编译数据应该可以使用几天,并且几年后不会出现问题。在2月28日之后进行编译时,确实会有一个(未来)问题。
RobIII

如果我在2月28日之后进行编译,则可以将字符串格式更改为“%tm%td”,费用为六点字符
timxyz 2014年

0

C#191没有奖金

using s=System;class P{static void Main(){if(s.IO.File.GetCreationTime(typeof(P).Assembly.Location).ToString("Mdd")==s.DateTime.Now.ToString("Mdd"))s.Console.Write("Happy birthday to me!");}}

格式化:

using s = System;
class P
{
    static void Main()
    {
        if (s.IO.File.GetCreationTime(typeof(P).Assembly.Location).ToString("Mdd") == s.DateTime.Now.ToString("Mdd"))
            s.Console.Write("Happy birthday to me!");
    }
}

您只使用x两次;var x="MMdd";+ ToString(x)+ ToString(x)= 15而ToString("MMdd"); + ToString("MMdd"); 只需花费12
RobIII

另外,不需要换行符,因此WriteLine()可以缩短为Write()。有了上述更改,您将获得与我完全相同的解决方案;-)
RobIII,2014年

1
您也应该更新分数,现在是193。您可以通过将两个M掉掉* 提示 *:P
RobIII'RobIII

0

JavaScript(node.js)-100字节

(require('fs').fstatSync(4).mtime+1).match(Date().substr(4,6))&&console.log('Happy birthday to me!')

0

vb.net〜161c

这会将庆祝消息打印到所有生日。

Module M
Sub Main
For Each b In{({"1705","Alan"}),({"2012","You"}),({FileDateTime(Process.GetCurrentProcess.MainModule.FileName).ToString("ddMM"),"Me"})}
If b(0)=Now.ToString("ddMM") Then Console.WriteLine("Happy Birthday To {0}!",b(1))
Next
End Sub
End Module

艾伦=>艾伦·凯

得分:253c(-33c vb.net min)= 220-15%(我的生日奖金)= 187c-14%(庆祝生日)= 160.82〜161c或220c-29%= 156.2〜157c


您可以为生日或名人获得奖金。不是都。
ugoren 2014年

@ugoren Scoring没有声明它是排他性的or,所以我使用or的逻辑含义。
亚当·斯派特(

0

Powershell,82个字节

另请参阅Chris JSpellingD的答案

"Happy birthday to me!"|?{(gv My* -v|% M*|% p*h|gci|% l*w*e|% D*r)-eq(date|% D*r)}

哪里

gv My* -v|% M*|% p*h|gci|% l*w*e|% D*r

是表达式的快捷方式别名的组合:

Get-Valiable MyInvocation -value|% MyCommand|% Path|Get-ChildItem|% LastWritetime|% DayOfYear

等效的规范形式:

(Get-ChildItem $MyInvocation.MyCommand.Path).LastWritetime.DayOfYear

Powershell,119个字节-14%= 102.34分

filter e{$_-eq(date|% D*r)}$('me'|?{gv My* -v|% M*|% p*h|gci|% l*w*e|% D*r|e}
'Prof'|?{3|e})|%{"Happy birthday to $_!"}

1月3日,该脚本显示Happy birthday to Prof!。如果此脚本在1月3日保存,则将显示两个问候。


-1

C#-63个字节

class P
{
    static void Main()
    {
          Console.Write("Happy birthday to me!"));
    }
}

我选择编译时间。由于C#代码编译为MSIL,而MSIL运行时JIT Compiler 编译为可执行代码,因此该程序符合条件。

编辑-注释中指出的答案可能无效。


1
老把戏,不再有效。规则2表示“不得以任何方式受到程序的调用或执行的影响”。
ugoren 2014年

相应地更新。谢谢@ugoren
rahulroy9202 2014年

@ugoren Phil H的PERL代码也使用了同样的技巧。检查投票最高的答案。
rahulroy9202 2014年

2
这也是无效的答案。但是-他是第一个使用此技巧的人,当时他做到了,规则允许它。
ugoren
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.