Problem:
２都市間の距離

地球上の2 都市の北緯と東経を入力とし、地表距離を計算して出力するプログラムを作成してください。ただし、地球は半径 6,378.1 km の球とし、2 点間の地表距離とはこの球面に沿った最短距離です。また、南半球でも南緯は用いずに北緯 0 ~ -90 度を用い、グリニッジ子午線の西でも西経は用いずに東経 180 ~ 360 度を用いることとします。地表距離は km 単位で求め、小数点以下は四捨五入し、整数値として出力してください。

以下に主要都市の北緯、東経の例を示します。

地名

北緯(度)

東経(度)

東京

35.68

139.77

シンガポール

1.37

103.92

シドニー

-33.95

151.18

シカゴ

41.78

272.25

ブエノスアイレス

-34.58

301.52

ロンドン

51.15

359.82

Input

複数のデータセットの並びが入力として与えられます。入力の終わりは-1 四つの行で示されます。各データセットは以下の形式で与えられます。

a b c d

1 行に第 1 の都市の北緯 a、第 1 の都市の東経 b、第 2 の都市の北緯 c、第 2 の都市の東経 d が空白区切りで与えられます。入力はすべて実数で与えられます。

データセットの数は 30 を超えません。

Output

データセット毎に 2 都市の地表距離を１行に出力します。

Sample Input

35.68 139.77 51.15 359.82
1.37 103.92 41.78 272.25
51.15 359.82 -34.58 301.52
-1 -1 -1 -1

Output for the Sample Input

9609
15092
11112

Solution in Ruby (judge verdict: Accepted)

require 'matrix'
include Math
R = 6378.1
loop do
    a, b, c, d = gets.split.map &:to_f
    break if [a, b, c, d].all?{|x| x == -1}
    ta, tb, tc, td = [a, b, c, d].map{|r| PI * r / 180}

    x1 = R * cos(ta)
    y1 = 0 
    z1 = R * sin(ta)
    x1, y1 = x1 * cos(tb) - y1 * sin(tb), x1 * sin(tb) + y1 * cos(tb)
    v1 = Vector[x1, y1, z1] 
    
    x2 = R * cos(tc)
    y2 = 0 
    z2 = R * sin(tc)
    x2, y2 = x2 * cos(td) - y2 * sin(td), x2 * sin(td) + y2 * cos(td)
    v2 = Vector[x2, y2, z2] 
    
    p (R * acos(v1.inner_product(v2) / (v1.r * v2.r))).round
end