Problem:
Problem D: Friday the 13th

Problem

今年も「立命館大学競技プログラミング合宿」が開催されることとなった。僕は毎年開催されるこの合宿をとても楽しみにしている。しかし、欲望に耐え切れず合宿前に散財してしまい、お金に余裕が無くなってしまった。そこで僕は、立命館大学の最寄り駅である南草津まで移動するのに最も安く済む青春18きっぷを使うことにした。この切符は安く済む代わりに乗り換えが多く発生し、移動に丸1日使わなければならないのでとても疲れる。そんな移動をする日が13日の金曜日であることに気づいたのは会津若松駅を出発した後だった。僕は12時間、不安を感じながら電車に揺られるはめになった。

今日は合宿2日目、2015年3月15日、日曜日である。13日は特に何事もなく南草津に到着したが、僕はもうこのような不安を味わいたくないと思った。そこで2日目のジャッジである僕は、指定された期間内に存在する13日の金曜日の数を求める問題を出題し、プログラムを作成してもらうことにした。

閏(うるう)年の定義は以下の通りである。

西暦年が4で割り切れる年は閏年である。

ただし、100で割り切れる年は閏年でない。

ただし、400で割り切れる年は閏年である。

Input

空白で区切られた6つの整数Y1, M1, D1, Y2, M2, D2が1行で与えられる。

Constraints

入力は以下の制約を満たす。

1 ≤ Y1 ≤ Y2 ≤ 1018

1 ≤ Mi ≤ 12

1 ≤ Di ≤ 31 (Mi = 1, 3, 5, 7, 8, 10, 12)

1 ≤ Di ≤ 30 (Mi = 4, 6, 9, 11)

1 ≤ Di ≤ 28 (Mi = 2 かつ Yi年は閏年でない)

1 ≤ Di ≤ 29 (Mi = 2 かつ Yi年は閏年である)

Y1年M1月D1日はY2年M2月D2日より0日以上前の日付である

Output

Y1年M1月D1日からY2年M2月D2日までの間に存在する13日の金曜日の数を1行に出力せよ。

Sample Input1

2015 3 13 2015 3 13

Sample Output1

1

Sample Input2

2015 2 14 2015 3 15

Sample Output2

1

Sample Input3

1234 5 6 789012345678901234 5 6

Sample Output3

1357101234567708000

Solution in Ruby (judge verdict: Accepted)

# 3/1が index 曜日の時の １年間の 13th Fri の数
NUM_OF_13FRI = [2, 1, 2, 1, 2, 2, 2]

def weekOfDay(year, month, day)
    Time.gm(year, month, day).wday
end

y1,m1,d1,y2,m2,d2=gets.chomp.split(" ").map(&:to_i)

if d1 > 13
    if m1 == 12
        m1 = 1
        y1 += 1
    else
        m1 += 1
    end
end

if d2 >= 13
    if m2 == 12
        m2 = 1
        y2 += 1
    else
        m2 += 1
    end
end

period = (y2*100 - y1*100 + m2 - m1) / 280000
ret = period * 4816
y2 = y2 - period * 2800

y = y1
m = m1
while true do
    if y == y2 && m == m2
        puts ret
        break
    elsif m == 3 && y2 > y && m2 > 2
        ret += NUM_OF_13FRI[weekOfDay(y,3,1)]
        y += 1
    else
        ret += 1 if weekOfDay(y,m,13)==5

        m += 1
        if m == 13
            y += 1
            m = 1
        end
    end
end