数値・文字(列)リテラルなしで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クラス作るのはなんか文字列リテラルみたいでやだなーとか考えながらここにたどりつきました。 まったく芸がないこともなく、シンプルでわかりやすい、というあたりを後付けでアピールしておきます。