2015年07月16日

【ですころ11】Javaゴルフ講座とか

ですころ11で他を圧倒してのJava最短出しましたよっと。
今回のですころちゃんは

br*infuckbra*nfuckbrain*uckbrainfu*kb*ainfuckb*ainfuckb*ainfuckbra*nfuckb*ainfuckbrainfu*k
b*ainfuckbrainfuck*br*infuckbra*nfuckbr*infuckbrainfuck*bra*nfuckb*ainfuckbra*nfuckbrainfu*k
brai*fuckb*ainfuckbrai*fuckbra*nfuckbrai*fuckbrainfu*kbrain*uckbra*nfuckbrain*uckbrainfuck*
brainf*ckb*ainfuckbrainf*ckbrainfu*kbrainfu*kb*ainfuckbrainfu*kbra*nfuckbrainfu*kbrainfuck*
brainfuc*bra*nfuckbrainfuc*brainfuck*brainfuck*brainfu*kb*ainfuck*rainfuckb*ainfuckb*ainfuck
*rainfuckbra*nfuckb*ainfuck*rainfuckbrainfu*kb*ainfuck*rainfuckbrainfuck*b*ainfuckb*ainfuck
bra*nfuck

を出力です。
ほんとbrainfuck好きね……
この文字列、一見ランダムに*が入っているように見えますけど、brainfuckごとに*が入っている場所を抜くと
2357111317192329313741434753596167717379838997101103107109113
となります。
これ、実は素数配列です。
これに気づいた人はコードが短く……なりません!そんなんで短くなるのは素数ライブラリ持っている一部の言語だけ。一部の言語だけ有利という、なかなかアレ気な出題になっているというわけ。
それでもJavaでやってみましょう。

長っ!ちなみに素数生成は、過去のデスコロでバーがJavaの最短取ったコードです。
これだったら、普通に素数部分を文字列として出力した方が短いです。

さあ、またいつものデータ圧縮大会ですよ!今回はideoneで通ればいいので、物凄く圧縮できます。

質問「これはとうふですか」
回答「いいえ、とうふです」
このとうふ、全て違うとうふなのですけど、その違いがわかるのは恐らく山岡さんくらいだと思います。
山岡さんが出てくると、当然海原先生も出てきて言います。
「史郎よ、お前は何もわかっとらん!」
「なにっ!」
「このとうふを食べる側の気持ちを考えているのか!?」
さすが海原さんです。
このコードをCodeIQに食べさせるとサーバーエラーが発生して食べてくれません。
よっぽど不味いのでしょう。
そういうわけで、CodeIQで通るように変えます。
ただ、CodeIQが何を食べて何を食べないのかはよくわからないんですよね。だからといって「んー?これかな?」とアミバってエラー頻発させたらケンシロウに撲殺されそうですし。
そんなわけで、とりあえずShift-JISで表示できるものだけで構成してみました。
out.write/out.flush使うよりはcharキャストのほうが短くなるとか、微妙に手を入れています。

これでも恐らくJava最短は取れると思いますが、さらに短くならないものか、色々考えてみました。
そもそもt>32で空白だったら表示しないというロジックはどうなんですか!そーり!
そういうわけで、デスマ規約見てみたら、Q&Aに「\0出力してもいいよーん」って書かれてるじゃないですか。
ということは

として、if文削れますよね。if文削れれば、b[-c*4%10]=42も二項演算子で記述できるはず……!
というわけで、提出解はこれ。

驚異の115文字です。
ちなみに、バーはあと6文字削れる解答を見つけていますけど、今回は秘密にしておきます。
posted by バー at 11:31| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする