Day of the week of the next Feb 29th
Windows PowerShell, 65
Fairly straightforward.
filter f{for($d=date $_;($d+='1').day*$d.month-58){}$d.dayofweek}
As usual, we can shave off two bytes if we are willing to wait a long time till completion:
filter f{for($d=date $_;($d+=9).day*$d.month-58){}$d.dayofweek}
Test:
> '0001-01-01','1899-12-03','1970-01-01','1999-07-06','2003-05-22','2011-02-17','2100-01-01'|f
Sunday
Monday
Tuesday
Tuesday
Sunday
Wednesday
Friday
History:
- 2011-02-18 00:06 (65) First attempt.
Ruby 1.9, 85 characters
f=->a{require"date";d=Date.parse(a,0,0)+1;d+=1until d.day*d.month==58;d.strftime"%A"}
Straightforward solution. Call the function with f[args]
.
- Edit: (87 -> 97) Fixed the
0001-01-01
testcase. - Edit 2: (97 -> 91) Date.parse allows specifying the date of the calendar reform as well.
- Edit 3: (91 -> 87) Use a lambda instead of a function. Thanks Dogbert!
- Edit 4: (87 -> 85) Remove unnecessary spaces. Thanks again, Dogbert!
T-SQL 166 185 Characters
CREATE PROCEDURE f29 (@d DATETIME) AS
DECLARE @i int
SET @i=YEAR(DATEADD(M,-2,@d)+3)
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')
I was already messing with T-SQL date functions, so I figured why not...
Original solution was incorrect...
Here's what I actually have to do to get that strategy to work:
CREATE PROCEDURE f29 (@d DATE) AS
DECLARE @i int
SET @i = YEAR(@d)
BEGIN TRY
SET @i=YEAR(DATEADD(D, 3, DATEADD(M,-2,@d)))
END TRY
BEGIN CATCH
END CATCH
SET @i=@i+(4-@i%4)
IF @i%100=0 AND @i%400<>0 SET @i=@i+4
SELECT DATENAME(W,CAST(@i AS CHAR)+'-2-29')