2014年12月08日

【ですころ7】Javaゴルフ講座

バーです。
本職はエンジニアっぽい感じです。何度も言いますけど、エンジニアっぽい感じです。
ですころ7でもJava7言語最短コード書きましたb
実際は95文字があるらしいのですけど、結局わかりません!何やったの!

問題は脳みそをf**kするだけのお仕事です。
ようするに出力結果は">"と+がn個と"."をワンセットで幾つか出力するだけです。

まずは普通に書いてみましょう。

え?既に普通じゃない?気のせいです。
まあ見ればわかると思いますけど、一応解説です。
まずは出力したいnを配列にしておきます。
この配列をforeachで回して、Arrays.fillでchar配列を+で初期化して出力。
161文字もかかってます!話になりません!

では、ちょっとだけ縮めてみましょう。
数値の配列を見ると、ほとんどが110番台に集中しています。
試しに120からの差分配列にしてみると{20,19,23,4,16,11,23,88,21,9,12,9,5,5,19,3,11};となります。
じゃあ、初めから120個の+配列作ってsubstringで差分出力してみればいいじゃないの。
これで出力したのがこれ。

148文字まで縮まりました。

ただ、この方法ですと、117からの差分で書いた145文字が限界です。

やっぱり話になりません。
発想の転換が必要です。

ところで、デスコロのルールとして、「実行後にエラーが出ても、標準出力が正しければOK!」というのがあります。
つまり、forループの終端を入れる必要はないのです。
また、この+の数、実はasciiコードに直すと"deathma colosseum"になります。
じゃあ、これをtoCharArrayで配列に直せば…とやるのはデスコロ素人です。
toCharArrayならgetBytesのほうが短い!というのが正しいデスコラー。
そしてできたのがこれ。

114文字です。
さすがに何書いているのかわかりません!自分でも何やってるのか考えないとわからなくなりました!!
ようはString.formatという、Cで言うところのsprintfを使用しています。
たとえば(">%05d.",0)というのは、">"と、5桁の数字(4桁以下の場合は5桁になるまで0をつける)と、"."を出力せい、という意味で、結果としては">00000."という文字列が得られるわけです。
これにreplace文で"0"を"+"に変えてあげれば得たい結果が得られる!というわけ。

さて、format文はStringのstaticメソッドですけど、実は"".formatと書いても動きます。
それから、この場合はforよりforeachのほうが若干短くなりそうです。
そうやって、最終的にできた結果がこれ。

102文字で最短!

で、95文字はどうやったの!!!
posted by バー at 16:24| Comment(2) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。