トラック
/
Cairo
Cairo
/
演習
/
宇宙の年齢
宇宙の年齢

宇宙の年齢

初級

はじめに

西暦2525年。太陽系のすべての惑星(水星、金星、地球、火星、木星、土星、天王星、海王星)を訪れる旅に出たところです。 最初の寄港地は水星で、ここでは税関で書類の記入を求められます(お役所仕事はどうやら地球固有のものではないようです)。 書類を税関職員に手渡すと、職員はそれをじっくりと見て、眉をひそめます。 「まさか、_本当に_50歳だと信じろとおっしゃるのですか? 200歳に近いはずですよ!」

面白くなって、職員が笑い出すのを待ちますが、どうやら大真面目のようです。 そこで気づきます。書いたのは_地球年_での年齢なのに、職員は_水星年_だと思っていたのです! 水星の公転周期は地球よりずっと短いため、水星年で数えると実際の年齢はもっとずっと高くなります。 すばやく計算して、水星年での年齢を伝えると、職員は満足そうに微笑み、先へ進むように手で合図します。 次に税関を通るときにこんな混乱を避けられるよう、惑星ごとの年齢を_あらかじめ_計算しておこうと心に決めます。

Note

冥王星がなぜ仲間に入っていないのか不思議に思った方は、こちらのYouTube動画を見てみてください。

説明

秒単位の年齢が与えられたとき、太陽系の惑星ではその人が何歳になるかを計算します。

地球での1年は365.25日、つまり31,557,600秒です。 もし誰かが1,000,000,000秒の年齢だとしたら、その人の年齢は地球での31.69年になります。

他の惑星については、地球年での公転周期を考慮する必要があります。

惑星 地球年での公転周期
水星 0.2408467
金星 0.61519726
地球 1.0
火星 1.8808158
木星 11.862615
土星 29.447498
天王星 84.016846
海王星 164.79132
Note

地球が太陽の周りを1周する実際の長さは、365.256日(1恒星年)に近い値です。 グレゴリオ暦は、平均すると365.2425日です。 完全に正確ではありませんが、この演習では365.25という値を使います。 1年の測り方については、Wikipediaの「年」の記事を参照してください。

実装

Cairoには浮動小数点数をネイティブにサポートする仕組みがないため、小数の値は整数を使って表現します。

この方法は、ブロックチェーン開発において計算の精度を保つために欠かせません。

この演習では、公転周期をマイクロ秒に変換することで固定小数点演算を使います。

たとえば、水星の公転周期0.2408467地球年は、1,000,000を掛けることで240,846,700マイクロ秒になります。

小数の精度を扱うために、テストケースでは、求められる年齢が小数点以下2桁で、整数として表されることを前提としています。

つまり、31.69年という年齢は、コードの中では3169として保存されます。

これを実現するには、割り算を行う前に100を掛けます。

例を見てみましょう。

let mercury_orbital_period = 240_846_700; // in microseconds
let age_microseconds = age_seconds * 1_000_000;
// multiplying with 100 to retain 2 decimal places
age_microseconds * 100 / mercury_orbital_period

この方法を使えば、必要な小数点以下2桁の精度を保ちながら、小数の値を正確に整数として表せます。これはテストに合格するために欠かせません。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Cairo Exercism

宇宙の年齢を始める準備はできましたか?

Exercismに登録すれば、25個のコンセプト68個の演習、そして本物の人間によるメンタリングとともに、Cairoを学んでマスターできます。すべて無料です。