数値・文字(列)リテラルなしでHelloWorld

CodeIQで[twitter:@cielavenir]さんの問題を解いてみました。
https://codeiq.jp/ace/cielavenir/q431

using System;
using System.Collections;
using System.Linq;

static class Program
{
    static void Main(string[] args)
    {
        Console.Write(new[]{
            H<Hashtable>(),
            L<EventArgs>(),
            L<LoaderOptimization>(),
            L<LoaderOptimization>(),
            L<object>(),
            (char)(L<object>() - H<object>()),
            H<WeakReference>(),
            L<object>(),
            L<Random>(),
            L<LoaderOptimization>(),
            L<double>()});
    }

    static char H<T>()
    {
        return typeof(T).Name.First();
    }

    static char L<T>()
    {
        return typeof(T).Name.ToLower().First();
    }
}

変態度が低い。

名前空間

System名前空間だけで完結させたかった。
corlibのSystem名前空間にはHで始まるクラスがない*1らしい。
二文字目以降を使わなかったのは美しくないからだけど、やるとすれば数値をひねりださないといけない気がしてきた。やらなくてよかった。
そういえばtypeof(Math).Name.Last()なんて方法もありましたね。
いずれにせよSystem.Linqが消せないんだけども。

スペース

どこかに定数として転がってないかなーと思ったものの、見つからず。ちょっと周りから浮いてるけど、わかりやすさのためと思うことにした。

HとL

最初はまともな関数名で、大文字小文字は引数で指定してたのだけども。それぞれの文字を表現するところをなるべくシンプルにしたくて、行の頭だけで意味がわかるように変更。正直括弧も消し去りたい*2
ラムダ式ジェネリクス使えたらそもそもメソッド作る必要もなかったのになー。

あとがき

数値をこねくり回すのは面倒だなーとか、HelloクラスとWorldクラス作るのはなんか文字列リテラルみたいでやだなーとか考えながらここにたどりつきました。 まったく芸がないこともなく、シンプルでわかりやすい、というあたりを後付けでアピールしておきます。

*1:System.dllにはHttpStyleUriParserとかあるけど

*2:型パラメータをなくして普通の引数にする、という手もあるけど、Typeとして渡すのに耐えられなかった