2017年12月4日月曜日

国際衛星識別符号(International Designator)

 どれくらいの範囲を表せるのか。総当りで吐いてみた(C#)。

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 26; i++)
{
    sb.AppendLine(
        (char)('A' + i - 1) + "" +
        "," + i);
}

for (int i = 1; i <= 26; i++)
{
    for (int j = 1; j <= 26; j++)
    {
        sb.AppendLine(
            (char)('A' + i - 1) + "" +
            (char)('A' + j - 1) + "" +
            "," + (i * 26 + j));
    }
}

for (int i = 1; i <= 26; i++)
{
    for (int j = 1; j <= 26; j++)
    {
        for (int k = 1; k <= 26; k++)
        {
            sb.AppendLine(
                (char)('A' + i - 1) + "" +
                (char)('A' + j - 1) + "" +
                (char)('A' + k - 1) + "" +
                "," + (i * 26 * 26 + j * 26 + k));
        }
    }
}

 A__が1で、B__が2、C__が3と続き、Z__が26で、AA_が27、AB_が28、BA_が53、ZZ_が702、AAAが703、ZZZが18278まで。
 約1万8千個を扱える。

 中国のASATの試験では、「観測可能なものだけで2,841個以上」(wikipedia)ということなので、かなり余裕ありそう。とはいえ、2桁だと700個ほどしか扱えないから、やはり3桁は必要なんだろうな。
 文字3桁分を整数で書こうとすると5桁必要だから、TLEに押し込むには文字を使うしかなかったんだろうなぁ。26進数恐るべし。
 1958年頃から使われ始めたらしいが、当時の人はどうして700個じゃ足りないと思ったんだろうか。IPv4しかり、大抵は後から桁数が足りなくなるもんだけど。米軍のASATが59年だそうだから、当時からデブリとかは色々考えられてたんだろうか。

 Cでコレを計算する場合、初期値をpiece = 0として、piece *= 26; piece += ch - 'A' + 1;を必要桁数分回せば文字列からintに戻せそう。

0 件のコメント:

コメントを投稿