Wszystkiego najlepszego dla mnie!

21

Wszystkiego najlepszego dla mnie!

Napisz program, który drukuje w Happy birthday to me!dniu swoich urodzin.

  1. Urodziny programu to czas utworzenia, ostatniej modyfikacji lub kompilacji programu (który wybierzesz) i nie wolno go zapisywać na stałe.
  2. Wywołanie lub wykonanie programu w żaden sposób nie może wpłynąć na datę, której użyjesz jako datę urodzin. Nie możesz zmienić swoich urodzin.
  3. Aby uzyskać dodatkowy kredyt (-15% liczby bajtów), wydrukuj w Happy birthday to you!dniu urodzin (na stałe), jeśli nie pokrywa się to z programem. Lub skorzystaj z okazji urodzin niektórych gwiazd i zdobądź -14%.
  4. Musi wydrukować tylko to i niczego innego nie drukować.
  5. Policz bajty w UTF-8.
  6. Użyj kalendarza gregoriańskiego.

Powodzenia i wszystkiego najlepszego (dla nowonarodzonych programów).

PS
Po komentarzu Izkaty, jeśli wydrukujesz Happy birthday to Melna urodziny Mel Kaye , otrzymasz 20% zniżki. Ale musisz podać wiarygodne źródło, że to ta data.

ugoren
źródło
1
@TeunPronk, Nie możesz zrobić obu. Wykorzystaj swoje urodziny lub gwiazdę (lub nie, i zrezygnuj z dodatkowego kredytu).
ugoren
4
@TeunPronk: Tylko Jon Skeet może: P
MSalters
11
Zobaczyłem to na pasku bocznym Hot Questions i przeczytałem „Happy Birthday to Mel ” ...
Izkata
1
@PeterTaylor: Huh? Przyznawanie różnego rodzaju bonusów punktowych za dodatkowe funkcje jest dość powszechne w przypadku pytań do gry w golfa i nigdy wcześniej nie widziałem, aby ktokolwiek twierdził, że zdyskwalifikuje to pytanie z użycia tego znacznika, o ile podstawowym kryterium oceny jest długość kodu.
Ilmari Karonen
1
@Izkata, zaktualizowałem pytanie na cześć Mela.
ugoren

Odpowiedzi:

10

PHP 77 75 74 65 60

Wielkie dzięki wspaniałym sugestiom Tima Seguine :

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

Sneaky PHP: 46 42 41 40

Wykorzystując pomysł Phila H i ponownie sugestię Tima Seguine'a :

<?touch(__FILE__)?>Happy birthday to me!
ComFreek
źródło
Czy nie uwzględnia roku w porównaniu? jeśli tak, działa to tylko na 0 urodziny.
ugoren
@ugoren Masz rację! Dziękuję za poprawienie mnie. Zapisano 2 bajty.
ComFreek
Jeśli „nic nie oznacza” w regułach jest interpretowane jako standardowe wyjście, możesz wygrać 4 bajty, usuwając ''wokół dmciągów. Wygenerowało ostrzeżenie, ale uważam, że jest wysyłane do standardowego błędu, jeśli raportowanie błędów jest włączone.
Tim Seguine,
4
<?date(dm,stat(__FILE__)[9])-date(dm)&&die?>Happy birthday to me!
Tim Seguine,
1
@TimSeguine Dzięki za sugestie! Włączyłem je do mojej odpowiedzi, mam nadzieję, że nie masz nic przeciwko.
ComFreek
48

Bash (podstępny): 36

touch $0;echo Happy Birthday to me\!

Zgodnie z zasadami: „czas utworzenia, modyfikacji lub kompilacji programu”. Wybieram czas modyfikacji i ciągłą samo-modyfikację. [HT @ace za 1 znak]

Perl (również podstępny): 29

print "Happy birthday to me!"

Ten jest prawdopodobnie mniej podstępny niż pierwszy; Programy w Perlu są zawsze kompilowane przed ich uruchomieniem, o czym nie wszyscy wiedzą - patrz, podstęp jest edukacyjny. Oto data kompilacji, której używam.

- Edytuj zmiany reguły -

Zostało to napisane, zanim pojawiła się jakakolwiek reguła dotycząca zmiany urodzin. Myślę, że Perl nadal stoi; wszystkie programy w Perlu są kompilowane przed ich uruchomieniem. Zostawię tu odpowiedź ze względów edukacyjnych!

Phil H.
źródło
6
Ok, oszustko, zdobądź moje +1 za spryt.
Victor Stafusa
1
Można uciec !z \!i usuń cudzysłów, aby zapisać 1 char
user12205
1
Dobra sztuczka, ale reguły wyraźnie tego zabraniają (teraz).
ugoren
1
@ugoren nadal nie zabraniają Perl rozwiązanie, które jest skompilowany zanim program startów .
Cruncher
3
@Cruncher, obawiam się, że masz rację. Skonsultuję się z moim prawnikiem i prześlę rachunek.
ugoren
13

bash - 65

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

Dzięki ugoren , asowi i nyuszika7h za pomoc.

shiona
źródło
Myślę, że można uciec !z \!tak nie trzeba cytaty i oszczędzania 1 char.
user12205
Właściwie miałem cytaty, ponieważ myślałem, że echo będzie wymagało ich dla przestrzeni. Wyjąłem je i nie uniknąłem wykrzyknika i nadal działało. Dzięki za wskazówkę!
shiona
2
Musisz tylko uciec !w interaktywnych powłokach, a nie skryptach.
nyuszika7h
Możesz zapisać dwie postacie, używając [i ]zamiast [[i ]].
nyuszika7h
1
Czy to działa, gdy rok nie jest taki sam jak data utworzenia?
ugoren
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!"));}}

Sformatowany:

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 (bez premii)

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

Z kilkoma dodatkowymi instrukcjami (musisz to skompilować b.exei uruchomić z katalogu, w którym znajduje się plik wykonywalny), mogę sprowadzić to do tego:

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 (bez premii)

Te same instrukcje, co powyżej, tym razem tylko drukując wiadomość w jej urodziny (więc nie -15% premii).

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!");}}
RobIII
źródło
Możesz zapisać kilka bajtów w premiowych, dodając ,b="1202"==tpo otrzymaniu ciągu daty i używając go zamiast tego.
ahruss
1
Dzięki! Chociaż „kilka bajtów” okazuje się być jednym… czy coś mi brakuje? Edytuj Ach, rozumiem; powiedziałeś, ,b="1202"==tale ta ==tczęść nie jest możliwa, ponieważ to daje wynik bool, a druga zmienna jest łańcuchem. Nie można (AFAIK) używać dwóch różnych typów w jednej deklaracji „var”.
RobIII
Ah, dobrze. Minęło trochę czasu, odkąd użyłem C #. Mój błąd.
ahruss
Możesz skrócić prostszą wersję, porównując daty, a nie ciągi znaków. Ten mężczyzna używa czegoś takiego CreationTime.Date == DateTime.Today.
svick
To działałoby tylko na dziś / w tym roku / na urodziny 0. Jak to działałoby na inne lata?
RobIII
5

Java - 275 - 15% = 233,75 z bonusem / 237 bez bonusu

Z premią:

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

Bez premii:

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

Urodziłem się 23 kwietnia.

Victor Stafusa
źródło
1
Wszystkiego najlepszego na nie za ;-) Wystarczy zapisać jeszcze jeden bajt :-)
RobIII
@RobIII Dzięki, naprawiono.
Victor Stafusa
Poza tym newline ( \n) nie jest wymagany AFAIK, co oszczędza kolejne 4 bajty ;-)
RobIII
@RobIII Jeszcze raz dziękuję.
Victor Stafusa,
Tak ... powinienem przestać strzelać własną stopą: P Nie ma za co;)
RobIII
3

Jestem bardzo dumny z tej małej sztuczki, aby zaoszczędzić kilka bajtów na wiadomości. Mam nadzieję, że zostaną uwzględnione w innych odpowiedziach. Pierwszy o tym pomyślałem!

Pyton

105 znaków, bez dodatkowego kredytu. Zapisz plik jako „wszystkiego najlepszego dla mnie” i uruchom. Działa tylko w GMT, a „urodziny” są zdefiniowane jako data urodzenia, a nie rocznica (często nazywane również „urodzinami”).

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

Aby zadziałało, zapisz to jako „wszystkiego najlepszego dla mnie” i biegnij python "happy birthday to me"

Uwaga: oczywiście w nazwie pliku może znajdować się tylko mały pasek startowy, dzięki czemu dowolny dowolny kod może zostać zredukowany do poziomu paska startowego. Zwykle rozważałbym to „oszustwo”. Jednak „wszystkiego najlepszego dla mnie” nie jest nieuzasadnioną nazwą pliku - opisuje to, co robi program, znacznie lepiej niż niektóre programy (np. „Python”), więc w tym przypadku pozwolę na to :)

AMADANON Inc.
źródło
Myślę, że poleganie na nazwie pliku to oszustwo (chociaż nie zabroniłem tego jawnie). Jeśli jest to dozwolone, dlaczego po prostu nie pisać eval(sys.argv[0])?
ugoren
I nie zawracałem sobie głowy określeniem urodzin, ale jest to dzień, który przychodzi raz w roku, kiedy ktoś świętuje rocznicę swoich urodzin , a nie dokładnie ten dzień, w którym się urodziłeś.
ugoren
ugoren: Wspomniałem o tym w mojej notatce na dole (która poprzedza twój komentarz). 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.,
2

Matlab: 66

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

Nazwa pliku musi być „fm”

H.Muster
źródło
1
Na swojej urodzin powinien powiedzieć „Happy Birthday do ciebie !” :-)
RobIII
@RobIII: Ups, masz rację, nie przeczytałem wystarczająco uważnie. Usunie drugą wersję. Dzięki!
H.Muster
Zakładam, że strncmp(x, y, 5)porównuje daty jak 28-12-2013pierwsze 15 znaków ( 28-12np. 28 grudnia). Czy to działa również, gdy yyyy/mm/ddna przykład są ustawienia regionalne użytkownika ? Czy Matlab domyślnie ma dd-mm-yyyyzawsze? (Po prostu ciekawy). Edytuj Nevermind: znalazłem! . Wygląda na to, że tak. To nie ma znaczenia, w każdym razie do mm/dd/yyyylub dd-mm-yyyyod zarówno lewy i prawy operand użyłby tego samego formatu i tak oba 5 lewostronne znaków będzie pasować w każdym razie; tak długo, jak rok nigdy nie prowadzi.
RobIII
Dlaczego potrzebujesz zmiennej t? Nie dir('f.m').datedziała?
ugoren
@ugoren: tjest konieczne, aby dirzwrócić atrybuty pliku (w przeciwnym razie po prostu zwróci wszystkie pliki w katalogu, które pasują 'f.m'). Ponadto tjest konieczne, aby uzyskać dostęp do datepola.
H.Muster
2

GNU COBOL z opcją -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.

Łamam zasady dotyczące celebrytów, więc nie ma tu bonusu ...

Wytworzony tekst jest wprowadzany przez użytkownika (wymagany podczas uruchamiania). Jeśli nie jest to dobre, należy zdefiniować linię C, tak jak to ma miejsce ACCEPT C, i DISPLAY Cmusi się stać DISPLAY "HAPPY BIRTHDAY TO ME!"dla dodatkowych siedmiu znaków.

WHEN-COMPILEDto specjalny rejestr zawierający datę / czas kompilacji, który jest dostępny dla programu (zawsze przydatny, możesz wiedzieć, że masz poprawną wersję). Jest obcięty, MOVEponieważ reszta nie jest potrzebna. DATEjest bieżącą datą - ta data to rymdd.

W /definicji A jest to symbol edycji wstawiania, ponieważ data kompilacji zawiera ukośniki. Dodatkowa postać, ale ułatwia porównanie.

Celebrity = Grace Hopper

Bill Woodger
źródło
2

Partia - 37 bajtów

Kradzież metody zastosowanej przez jedną z odpowiedzi Basha.

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

Inna metoda - 145 bajtów

@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!
nieprzyzwoity
źródło
1

Rubinowy, 69 znaków / bajtów

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

31536000to liczba sekund w ciągu roku i 86400liczba sekund w ciągu dnia.

Klamka
źródło
4
Niestety działa poprawnie tylko przez około siedem lat, dopóki nie natrafisz na pierwszy rok przestępny po tym czasie.
Amadan
Also says "happy birthday" on the morning after your birthday, and doesn't say happy birthday the morning of your birthday before your birth time.
AMADANON Inc.
1

JavaScript

Node.js, 156 bytes

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

Uses the file's modification time.

Chris W.
źródło
beating you by 56 bytes so far =P
stroncium
I get a runtime error when I run yours, but the match approach is definitely much cleverer. Fix the error and you've got my upvote. ;)
Chris W.
Can you quote the error and your OS? I guess it's just not crossplatform.
stroncium
1

Powershell - 105 bytes

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

Ungolfed:

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

The bonus isn't worth it, I can only get 117.5.

SpellingD
źródło
1

Powershell - 127

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

For the 15% bonus - 151 bytes, less 15% = 128.4

$r=@{"0308"="you";(gci $MyInvocation.MyCommand.Path).lastwritetime.ToString("MMdd")="me"}[(get-date).tostring("MMdd")]
if($r){"Happy birthday to $r!"}
Chris J
źródło
1
I'm no powershell expert, but this will only work in the current year? What what when the "program" has it's 1st, 2nd, 3rd etc. birthday?
RobIII
You can remove the write command - With just "happy birthday to me!" it will print it out.
unclemeat
Your quite right. I should know that.
Chris J
@Robill - oops. That's what comes of writing something when I'm distracted by something else and using codegolf as procrastination. Fixed (not that it's got a chance of winning, mind).
Chris J
1

Ruby - 80 103 87 bytes

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

Ruby - 123 115 135 121 - 15% = 104.55 97.75 114.75 102.85 points

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}

Might be a little longer or shorter depending on where your birthday falls in the year, and the shortest way to represent that. For mine, that's 36e5 (seconds since epoch; time zone dependent).


Does Mel Gibson count? Here's a 138 byte - 35% bonus = 89.7-point program that celebrates itself, me, and Mel!

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}
Tim S.
źródło
1
Your code fails on leap years, for dates after February.
ugoren
@ugoren right you are. Fixed that, but lost a lot of points :(
Tim S.
But now I've reclaimed most of those! =)
Tim S.
0

PureBasic

Without Bonus - 142

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

With Bonus - 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)+"!")
Fozzedout
źródło
0

TI-BASIC, 68 bytes

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

Remember, these tokens are one byte: If , Ans, →, Disp. getDate is two bytes. All other one-character symbols are one byte.

Timtech
źródło
1
Are you sure that's UTF-8?
Fozzedout
3
OP explicitly states you should use UTF-8. That's 66 characters and 68 bytes.
nyuszika7h
2
If you want to claim it's 46 bytes, write it in 46 bytes. As it is now, it's 68 bytes.
ugoren
According to the token sizes in a standard TI-Basic environment it is 55 bytes, but as plain text yea its 68. Also technically there does not have to be a " at the end so that could save a byte.
Lemon Drop
0

J 79

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

Bonus version120 - 15% = 102

Do I get extra credit for also printing both when both are having their birthday?

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

Explanation (right to left):

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

The central verb of the train

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

The left tine for the central train:

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.
jpjacobs
źródło
0

Java - 196

This differs from the other Java submission by using Strings, shaving 41 characters off in the process. It uses String.format("%tj") to format a java.util.Date or a long as a day-of-year String, and then compares these two Strings.

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

Formatted:

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!");
    }
}
timxyz
źródło
1
Day of year doesn't work well with leap years.
ugoren
@ugoren I agree. However, since the contest is currently running and we're at Feb. 20th. the compilation dat should be fine for a few days and not cause a problem following years. When compiling after Feb. 28th there will be a (future) problem indeed.
RobIII
If I were compiling after February 28th I could change the String format to "%tm%td" at a six point character cost
timxyz
0

C# 191 no bonus

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

formatted:

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!");
    }
}
Alberto
źródło
You use x only twice; var x="MMdd"; + ToString(x) + ToString(x) = 15 whereas ToString("MMdd"); + ToString("MMdd"); only costs 12.
RobIII
Also, a newline is not required so WriteLine() can be shortened to Write(). With above and this change in place you have the exact same solution as I do ;-)
RobIII
1
You should update the score too, which is 193 now. And you can get it down to 191 by shaving two M's off * hint * :P
RobIII
0

JavaScript (node.js) - 100 bytes

(require('fs').fstatSync(4).mtime+1).match(Date().substr(4,6))&&console.log('Happy birthday to me!')
stroncium
źródło
0

vb.net ~161c

This will print the celebration message to all whose birthday it is.

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

Alan => Alan Kaye

Score: 253c (-33c vb.net min) = 220 - 15% (my birthday bonus) = 187c - 14% (Celeb Birthday) = 160.82 ~161c or 220c - 29% = 156.2 ~157c

Adam Speight
źródło
You can get a bonus for your birthday OR a celebrity. Not both.
ugoren
@ugoren Scoring doesn't state it's an exclusive or, so I'm using the logical meaning of or.
Adam Speight
0

Powershell, 82 bytes

see also answers from Chris J and SpellingD

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

where

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

is the combinations of shortcuts and aliases for the expression:

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

that equivalent a canonical form:

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

Powershell, 119 bytes - 14% = 102.34 Points

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 $_!"}

At January 3, the script display Happy birthday to Prof!. If this script is saved on January 3, two greetings will be displayed.

mazzy
źródło
-1

C# - 63 bytes

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

I choose compilation time. Since the C# code compiles to MSIL which on runtime is compiled to the executable code by the JIT Compiler, this program meets the conditions.

EDIT-- Possibly invalid answer as pointed in comments.

rahulroy9202
źródło
1
Old trick, no longer valid. Rule 2 says "must not be affected by the program's invocation or execution in any way".
ugoren
updated accordingly. Thank You @ugoren
rahulroy9202
@ugoren The PERL code by Phil H also uses this very same trick. Check the highest voted answer.
rahulroy9202
2
It's also an invalid answer. But - he was first to use this trick, and at the time he did it the rules allowed it.
ugoren