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)

### constant

R = 6378.1

### main

while true
  a, b, c, d = gets.strip.split(' ').map{|s| s.to_f}
  break if a < 0 && b < 0 && c < 0 && d < 0

  th0 = a * Math::PI / 180
  ph0 = b * Math::PI / 180
  th1 = c * Math::PI / 180
  ph1 = d * Math::PI / 180

  x0 = Math.cos(ph0) * Math.cos(th0)
  y0 = Math.sin(ph0) * Math.cos(th0)
  z0 = Math.sin(th0)

  x1 = Math.cos(ph1) * Math.cos(th1)
  y1 = Math.sin(ph1) * Math.cos(th1)
  z1 = Math.sin(th1)

  dd = (x0 - x1) ** 2 + (y0 - y1) ** 2 + (z0 - z1) ** 2

  th = Math.acos(1 - dd / 2)

  r = (R * th).round

  puts r
end