challenge LL Golf Hole 3 - 13日の金曜日を数え上げる

今日から2013年12月31日までの、13日の金曜日とその総数を表示してください。

余力のあるものはこのプログラムを短くしてみたり、短くしてみたり、短くしてください。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env ruby
require 'date'

from = DateTime.now
to = DateTime.parse("2013-12-31")

friday = (from..to).inject(0) do |friday, date|
    if date.mday == 13 and date.wday == 5 then
        puts date.strftime('%Y-%m-%d')
        friday + 1
    else
        friday
    end
end

puts friday

Posted feedbacks - Bash

bash+dateコマンドのみの危険実装です。

  • 実行にはroot権限が必要です
  • 実行するとシステムの日付が狂って2014年1月1日になります。実用環境では決して実行しないでください
1
2
3
4
5
6
7
LANG=C
while [[ `date` != *2014 ]];do
  r=`date|(read w m d t z y;[ $d = 13 -a $w = Fri ] && echo "$m $d $y")`
  [ "$r" != '' ] && ((++i)) && echo $r
  date -s tomorrow>/dev/null
done
echo $i

 seqコマンドがインストールされている必要があります。

  e.g.
    $ ./FRIDAY_THE_13TH.sh
    2009-02-13
    2009-03-13
    2009-11-13
    2010-08-13
    2011-05-13
    2012-01-13
    2012-04-13
    2012-07-13
    2013-09-13
    2013-12-13
    We have 10 times left to go.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/sh -

Z() {
  y=$1; m=$2
  [ $2 -le 2 ] && { y=`expr $y - 1`; m=`expr $m + 12`; }
  expr \( 5 \* $y / 4 - $y / 100 + $y / 400 + \( 26 \* $m + 16 \) / 10 + $3 \) % 7
}

{
  Y=`date +'%Y'`; y=''; m=''; i=0
  for y in `seq $Y 2013`; do
    for m in `seq -w 1 12`; do
      [ $y -eq $Y ] && [ $m -lt `date +'%m'` -o `date +'%d'` -lt 13 ] && continue
      [ `Z $y $m 13` -eq 5 ] && { echo "$y-$m-13"; i=`expr $i + 1`; }
    done
  done
  echo "We have $i times left to go."
}

cal 使うといいんじゃないですかねぇ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
eval `date '+y=%Y;m=$((%-m+(%e>13)))'`
for i in `seq $y 2013`;do
for j in `seq $m 12`;do
if [ `cal $j $i|awk '$6==13&&$_=$6'` ];then
c=$((c+1))
printf $i-%02d-13\\n $j
fi
done
m=1
done
echo $c

Index

Feed

Other

Link

Pathtraq

loading...