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 | このブログの読者になる | 更新情報をチェックする

2015年03月20日

【Java】フィーバー・ナンバー問題とか

CodeIQさんでフィーバー・ナンバー問題というのが出ました。

どういう問題かというと、平方根取って小数点がゾロ目の数字を求めてね(はぁと
という問題で、出題されたのは下6桁がゾロ目となる最小の数字でした。

平方根をx.aaaaaa...と表すと、元の数字は
x.aaaaaa*x.aaaaaa+α
なので、これを展開して
=xx+0.222222xa+0.012345654321aa+α
となります。
αは無視できるほど小さく、aも0〜9の数字のため、0.012345654321aaも無視できるほど小さい数字になります。
また、0.222222xaは最大でも1.999998xです。

そのため、求める数はxx〜x(x+2)=xx+2xの範囲にあることが明白です。

ちなみにaの数がnであっても、大筋は変わらず、xx+0.(2がn個)xa+αとなりますので、検索範囲はxx+2xです。

問題のほうに4つ並ぶのは5168だよーという記述があるので、√5168=71.8888...よりも大きい数字から探して

を実行すると√48273160=6947.888888...ということがわかりますb
ところで、ちゃんと検証してませんけど、nが3以上のとき、aは常に8なんじゃないかと思います。
posted by バー at 10:13| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2015年03月06日

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

9回は特に書くことなかったので飛ばしましたけど、10回目のデスコロ

またもやJavaで最短ですよ!
今回は
treetreetreefiregoldtreetreetreetreegoldtreegoldtreegoldtreegoldtreegoldtreetreegoldtreegoldtreetreetr
eegoldtreetreetreewaterwatertreetreewatergoldgoldtreegoldtreegoldtreegoldtreegoldtreetreegoldtreeg
oldtreetreetreegoldtreetreefiregoldgoldwatermoontreemoontreegoldgoldtreewatergoldgoldtreetreegold
goldtreetreemoonwatergoldgoldwatergoldtreetreemoongoldgoldmoon

という文字列を出力しろ、というのが課題です。
さて、この文字列はtree,fire,gold,moon,waterという5つの文字で出来ています。
月に代わっておしおきですね!
これを数字に当てみると0001200002020202020020200020004400422020202020020200020012243030220422002200342242003223みたいな数列になります。
この数列は5進数なので、これをn進数に圧縮して/=5しつつ%5で値を取れば答えが求まります。
ところで、Javaで扱えるn進数は最大幾つかご存知でしょうか。
16までと思う人は甘いです。なんと無駄に36進数なのです!
上の数字を逆順に(reverse)して36進変換すると4k8orvt45xfetts7f5f7w9flurp2bmks14vsoi6rと、強烈に圧縮されます。
では36進数変換した文字列を使って回答してみましょう。

この[]xはArrays.toListに変えて

とすると、若干短くなりますが、永杉さんです。ていうか、BigIntegerが長すぎるのですよ!
もう余計な処理は辞めてシンプルに書きましょう!

あら短い。

これを基準に、この長い数字列を圧縮することを考えます。
この数字を全角文字コードに直し、ビット演算で0〜4の数字化すれば圧縮できるはずです。
Javaで使用される文字コードはUTF-8。UTF-8の全角文字は通常3バイトです。
UTF-8で3バイト全角文字はE2****〜E6****にありますので、ちょうど5種類ですが、問題はE2系。これってрニか→とかLあたりが扱われているのですが、ほぼ全部CodeIQですと「機種依存文字」として弾かれます。
そのため、E2系は実質使えません。
また実際にはサロゲートペアという拡張文字があって、これを使うと4バイトになりますが、扱える文字数が少なくて使いづらい上に、機種依存文字の可能性が高く、怖くて使えません。

そこで、文字として出現率の低いfireを1バイト文字(つまり半角ASCII文字)で表すことにして、E3〜E6系だけを使いました。
もともとの数字を3バイトあるいは1バイトに切ったとき、最短となるのは(0〜4をa〜eと置き換えて)
aaa,b,caa,aac,aca,cac,aca,aca,caa,aca,aae,eaa,ecc,aca,cac,aca
,aca,caa,aca,abc,ced,ada,cca,ecc,aac,caa,dec,cec,aad,ccd
と分割した時です。
そして、これ上手い具合にdで始まるのがdecしかないので、あえて
aaa,b,caa,aac,aca,cac,aca,aca,caa,aca,aae,eaa,ecc,aca,cac,aca
,aca,caa,aca,abc,ced,ada,cca,ecc,aac,caa,d,ecc,eca,adc,cd
と分割し、dも先頭から外してしまいます。これでも後述の理由により文字数は変わりません。
あとはUTF-8文字コード表とにらめっこしながら、&7で2〜6になるような文字列を作り上げ、-2を引いてあげれば0〜4の数字に戻せます。
実際の文字列は
伜C億伽佼包佼佼億佼伶挌捕佼包佼佼億佼仕冊交兄捕伽億B捕杜井備
となります。
この中で重要なのは最後の「備」。こいつは0xE58299なので、バイトごとに&7かけると5,2,1となります。最後の1文字が2〜6ではありませんので、-2すると-1となってしまいます。
これぞデスマ名物Exception抜けです。デスマコロシアムではExceptionが出ても無視されることになっているため、ArrayOutOfBoundsExceptionを起こして終了させて構わないのです。このテクニックを使って、元の数字の3を使わないようにしたほうが、全角文字を当てるときに便利というわけ。
こうして出来たのが

この-2を先頭に持っていくと

で、1文字だけ減ります。
しかし、これ以上縮まりません。
たとえば順序を工夫して~i&7で処理することで文字列を縮めようとしても、2〜6→5〜1となってしまい、ノイズ除去の""を入れて

とすると、かえって長くなってしまいます。

Javaで最短に挑戦した人はたぶんこのあたりで投了しているはずです。
バーも投了しかけました。

たとえばListではなく配列にすれば.get()ではなく[]が使えて文字が削れますが、Javaで変数代入なしで配列作るにはnew String[]{,,,}という書式になります。

長い、長いよママン。
もはや諦めるしかと思ったとき、突然閃きました。
CSVファイルを処理する場合、Javaで使うメソッドがあるじゃないの!
String.split()!
new String[]{"","water","gold","tree","fire","moon"}

",water,gold,tree,fire,moon".split(",")
と等価!
これで一気に縮まり

という最短解が求まりました。

やったー!


続きを読む
posted by バー at 09:22| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2015年01月09日

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

はい、またまたデスマコロシアムですよ。
ですころ8でもJavaの最短賞です!
しかもバーは今回はベスト8まで進出!Javaという不利言語の割には頑張りました!

今回の問題は
BAAAAAAAAAAAAAAAAAAAAAAAA
ACAAAAAAAAAAAAAAAAAAAAAAA
AADAAAAAAAAAAAAAAAAAAAAAA
AAAEAAAAAAAAAAAAAAAAAAAAA
AAAAFAAAAAAAAAAAAAAAAAAAA
AAAAAGAAAAAAAAAAAAAAAAAAA
AAAAAAHAAAAAAAAAAAAAAAAAA
AAAAAAAIAAAAAAAAAAAAAAAAA
AAAAAAAAJAAAAAAAAAAAAAAAA
AAAAAAAAAKAAAAAAAAAAAAAAA
AAAAAAAAAALAAAAAAAAAAAAAA
AAAAAAAAAAAMAAAAAAAAAAAAA
AAAAAAAAAAAANAAAAAAAAAAAA
AAAAAAAAAAAAAOAAAAAAAAAAA
AAAAAAAAAAAAAAPAAAAAAAAAA
AAAAAAAAAAAAAAAQAAAAAAAAA
AAAAAAAAAAAAAAAARAAAAAAAA
AAAAAAAAAAAAAAAAASAAAAAAA
AAAAAAAAAAAAAAAAAATAAAAAA
AAAAAAAAAAAAAAAAAAAUAAAAA
AAAAAAAAAAAAAAAAAAAAVAAAA
AAAAAAAAAAAAAAAAAAAAAWAAA
AAAAAAAAAAAAAAAAAAAAAAXAA
AAAAAAAAAAAAAAAAAAAAAAAYA
AAAAAAAAAAAAAAAAAAAAAAAAZ

というのを出力するだけの簡単なお仕事です。

まずは、ゴルフ意識せずに書いてみましょう。

わかりやすいので説明は省略!(えー
まあ、ちょっと特殊なのはimport staticですが、これは前回のデスマで教えて頂いた技なので省略。
まあ、それでも解説しますと、25おきに改行、26おきにA+α、それ以外はA(65)を出力しています。

さて、これをどうやって短くするかですけど、かなり厳しいです。
色々といじくり回して出たのがこれ。

やってることは変わりません。あまり短くなりませんね。
ここで、出力内容をもう一度見直してみます。
改行コードを*に置き換えると
BAAAAAAAAAAAAAAAAAAAAAAAA*A
CAAAAAAAAAAAAAAAAAAAAAAA*AA
DAAAAAAAAAAAAAAAAAAAAAA*AAA
EAAAAAAAAAAAAAAAAAAAAA*AAAA
FAAAAAAAAAAAAAAAAAAAA*AAAAA
GAAAAAAAAAAAAAAAAAAA*AAAAAA
HAAAAAAAAAAAAAAAAAA*AAAAAAA
IAAAAAAAAAAAAAAAAA*AAAAAAAA
JAAAAAAAAAAAAAAAA*AAAAAAAAA
KAAAAAAAAAAAAAAA*AAAAAAAAAA
LAAAAAAAAAAAAAA*AAAAAAAAAAA
MAAAAAAAAAAAAA*AAAAAAAAAAAA
NAAAAAAAAAAAA*AAAAAAAAAAAAA
OAAAAAAAAAAA*AAAAAAAAAAAAAA
PAAAAAAAAAA*AAAAAAAAAAAAAAA
QAAAAAAAAA*AAAAAAAAAAAAAAAA
RAAAAAAAA*AAAAAAAAAAAAAAAAA
SAAAAAAA*AAAAAAAAAAAAAAAAAA
TAAAAAA*AAAAAAAAAAAAAAAAAAA
UAAAAA*AAAAAAAAAAAAAAAAAAAA
VAAAA*AAAAAAAAAAAAAAAAAAAAA
WAAA*AAAAAAAAAAAAAAAAAAAAAA
XAA*AAAAAAAAAAAAAAAAAAAAAAA
YA*AAAAAAAAAAAAAAAAAAAAAAAA
Z

おおお?これって27文字ごとに処理すればいいんでは?
つまり
・26の倍数は改行
・27の倍数はA+α
・それ以外はA
を出力すれば、formatで改行コードとかせず、1文字ずつ出力できるってこと!
あとは細かいところを調整して…出た答えがこれ(60文字)

ちなみに、670ってなってるところは試してみればわかりますけど、650から701までの好きな数字でOKです。
なんでかというと、System.out.writeはバッファされるので、System.out.flash();しない限り、バッファの切れ目以降は出力されないからです(偶然出力文字数がバッファサイズの切れ目に一致してます)。

posted by バー at 17:39| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

2014年09月19日

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

バーです。
本職はエンジニアっぽい感じです。
ですころ6でJava7言語最短コード書きましたb
Javaで79文字とか頭おかしいです。このコードゴルフについて書きたいと思います。

問題は、素数を求めるだけの簡単なお仕事です。まずは一切ゴルフなしで書いてみましょう。


前回の処理でi%s==0はi%s<1で1文字減るという話をしましたので、それを利用しています。
さて、こいつは困りました。最後に":"が表示されてしまいます。この問題のいやらしいところですね!
これを除去する普通の手段を追加します。


これで正しく出力されましたが、長い!長すぎるよママン!
では、バーがよく使うテクニックで:除去をしてみます。


ちょっと短くなりましたが、まだ長いです。
なぜ長いのか?それは素数判定変数boolean xのせいです。
ここで必殺のラベルbreakを使用します。Javaにはラベルbreakというのがあり、ラベル切ってbreak ラベル名;とすると、切ったラベルまで飛びます。多重ループから抜けるときには超便利なのですが、そんなことしなきゃいけないならメソッド分けろ馬鹿と言われるので、業務で使用してはいけません。あくまでコードゴルフ専用の命令です。コードゴルフ用の命令を予約レベルで用意してくれてるJavaってステキ!


さあ、かなり短くなりました。ここで余分な{}を外しましょう。


"int "と","では","のほうが短いので、sの初期化を1つ上のループに持っていき、改行コードも外してみます。


これで103文字となりました。
さて、この中で、幾つか無駄があります。まず、i<1000の部分。今回出力する最大素数は997なので、判定はi<1000ではなくてi<999でも構いません。また、String zの定義。これも本当に必要なのでしょうか。先ほども書きましたが、997が最大素数なので、その値のときだけ、:を書かないようにすればいいのではないでしょうか。その辺を踏まえてコードを書き直してみます。


これで91文字になりました。あとは地道にforの中に命令埋めたりとか、基本的なゴルフテクニックを加えていくだけの機械作業ですので省略。

そんなわけで
続きを読む
posted by バー at 09:12| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2014年05月09日

デスマコロシアムと孫子とか

第二回デスマコロシアムの結果が発表されました。

バーはJava7で132文字という最短解を出していますので、それを公開します。

class C{public static void main(String[]a){char z=0,x[]="`@ぁァァぁ@`".toCharArray();while(z++<26)for(char y:x)System.out.print(y+=z);}}

はい、リテラル省くためにzをcharで宣言とか、頭おかしいです。めちゃくちゃですね。

さて、今回、選んだチームはGGGでした。

そもそも、Javaはどう書いても文字数が最短になることはありえません。
何もしないコード、
class C{public static void main(String[]a){}
だけで42文字になってしまいますので。
つまり、Javaは圧倒的弱者!ヒエラルキーの末端に位置する、搾取される側です。

孫子は述べました、「十なれば囲み、 五なれば攻め、 倍なれば分かち、敵すれば戦い、少なければ逃げ、しからざれば避くべし」、と。
今回のケースは本来、逃げるか避けるかのどちらかですが、世の中、戦わなければならないときもあるのです。

さて、おそらく最強の組み合わせであるMMGに対抗するために、弱者はどうすればいいでしょうか。
同じMMGで戦った場合、必ず負けます。
デスマが発生する場合は両方同時、発生しなかった場合は引き分けになり、文字数差で負けます。
唯一の利点はMMGが最強手である、ということが分かっている、ということです。

孫子は述べました、「敵を知り、己を知れば百戦危うしからず」、と。

強者はMを使わない理由はありませんから、本戦に出るメンバーの半数にはMが1つは入っているはずです。

ということは、デスマを引き起こせば、かなりの確率で勝てるはずです。
であるなら、選択肢はGGGしかありません。
予選さえ突破できれば、GGGでかなり上位にいけるはず…!

結果、ベスト32で敗退しましたが、バーが敗れた相手が優勝しています。

ちなみに、バーの予想、本戦の大部分でMが入っている、ですが、64人中18人、半分にも満たない数字となりました。
一方で、バーと同じGGGは10人でした。

さて、作戦としては成功だったのでしょうか?

孫子はこうも述べました、「兵は詭道(騙しあい)なり」、と。
posted by バー at 17:50| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2014年04月21日

SideStory:Six Cards

それは、ある新月の夜のことでした。
バーのスマホが高らかに着信音「デスマーチ」を奏でたのです。
当然、バーは応答を選択しました。
それが間違いの始まりだったのです…。

「もしもし、ひつじのバーですの」
「あ、バー様ですかー。えっと。お久しぶりですー」
「そのしゃべり方…もしかして、某あおいあくまさん!?」
「はいー。(ノイズ)ですよー」
「あなた、3年もどこに行ってたの!?」
「えっと、ちょっと電脳界から間違って魔界に入ってしまいましてー」
「間違えすぎ!」
「まー、ふるさとみたいなものですしー。特に不自由もしてないですしー」
「ほんっとにまぁ…」
「そうそう、それで、ちょっとお願いがあるんですよー」
「なんですの?」
「実は今、魔界には6つの勢力がありましてー。荒れてるのですよー」
「魔界ですからねぇ」
「それで、どこからぶっ潰すじゃなかった、話し合いの場を持つのか悩んでいるのですー」
「どうせ全部潰すつもりでしょうから、どこからでもいいですの…」
「えー、(ノイズ)はそんな怖いことできませんよー」
(なぜか、名前のところにノイズが入っているようですの。大人の事情怖いですの)
「それで6つの勢力ですケド、1つ目はぺんぎん軍」
「ぺんぎん?ずいぶんかわいい名前ですの」
「ところがどっこい、あなどれないのですよー。実は他の軍も、いくつかはぺんぎん軍から独立して誕生していたりするんですよねー。現状、最大勢力に近いですー」
「で、他の軍は?」
「2つ目は、勝利軍」
「いきなり強そうな名前っ!?」
「一時期は飛ぶ鳥を射殺す勢いだったのですケド、最近はちょっと落ち目ですー。ただ、勝利軍には最強の兵士がいましてー。バー様は妖精について、どのくらい知ってます?」
「バンシーとかニクシーとかケットシーとかピクシーとか、マイナーどころでリャナンシーとか?」
「そうそう。勝利軍には、弓というか、機械弓?エクセレントな機械弓の妖精がついていましてー。これが強いのですよー」
「それはさぞかし遠距離攻撃が得意な軍ですの」
「そうなんですよー。その妖精の名前がエクセルボウガンシー」
「…なんか、聞いたことがあるような…」
「3つ目の軍は」
「りんご軍?」
「違いますー。マクド軍ですー」
「そっちでしたの…」
「その軍は、独占が強い軍ですねー。全て自分のところでコントロールしていないといけない、みたいなー。性能はそうでもないのですケド、かっこいいトカ、そんな理由で所属している悪魔が多いですー」
「あー、わかりますの」
「4つ目はアンドーナッツ軍ですー。なんかお菓子い悪魔の集まりらしいのですケド。最近、ちょっと羽振りがいいんですよねー。」
「もしかして、緑色の悪魔が大将で、アイスクリーム隊、カップケーキ隊、エクレア隊なんかがいますの?」
「そうそう、ロボロボした感じのですー。まだ説明していないのに、よくわかりますねー」
「パターンが読めてきましたの。5つ目は小悪魔軍あたりですの」
「5つ目は狂牛軍ですよー」
「狂牛?あ、BS…げふんげふん」
「昔は網もって駈けずりまわっていたのに、最近は自由だ自由だ!とか、開け開け!と叫んでいるようですー」
「すごく前に自由なほうを使ってましたの…」
「6つ目は」
「火の鳥あたり?」
「いいえー最近その名前を聞きますケド、まだまだ文字通り烏合の衆ですよー。6番目は筋肉むきむきのオトコだけで構成される、マッチョな軍ですー」
「マッチョ?筋肉?」
「その名も超漢児軍ー」
「うわ、まだあったのそれ」
「まー、そんなわけで、6つの軍がいるのですよー。それで、6つの軍に1回ずつは交渉するのに順番を決めないといけないのですケド、組み合わせ調べたら結構たくさんあるじゃないですかー」
「6つの軍に1回ずつだから6の階乗通り、720通りですの」
「それを全部出して欲しいんですよー」
「じゃあ今から書きますの」
「あ、それをですねー。Javaプログラムで出してほしいかなー」
「魔界でJavaが使えますの?」
「そのままじゃできないのですケド、コードがあれば出力できるんですよー」
「魔界にIT化の波が!?」
「これは友達のマッくんが作った仕組みなのですケド、まずはエビルフィールド、邪場という結界を作って、そこに仮想的な魔神を召還して、その魔神に魔神語を読ませると結果が出るんですー。邪場バーチャル魔神ですー」
「なにそれかっこいい!」
「マッくん、Javaを魔神語に変換するのに苦労してましてー。今のところライブラリがjava.langとjava.utilとjava.ioしか実装できてないんですよー」
「その3つがあれば余裕で組めますの」
「あと、クラスはメイン文以外は使えませんー」
「メイン文以外は使えない?」
「そうですー。それから、メイン文の中で匿名クラスなんかも使えないですー。Javaは7準拠ですー。ほんとは8で宇宙語対応したかったのですケド」
「宇宙語…ラムダ式のことですか><」
「そういうわけで、よろしくお願いしますーマッくん…マックスウェルくんも待ってますのでー」
こうして、バーはそんな言語仕様でのコードを書く羽目になりましたの。
でも、main文しか使えないと必殺の再帰が書けない(注)ですの…
こうなったら、誰かに解いてもらいますの。
ブラウザにはちょうどCodeIQが…


(注)args上手く利用すれば書けますが、酷いコードになりますので書きませんの。
posted by バー at 11:25| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2014年04月15日

デスマコロシアムとか

SQLから転進しておいて先に取られた!とか、情報戦駆使して予選落ちのFortranですの。
言語: Fortran
解答コード

program death
integer i
character(len=3) ::src="sld"
character(len=3) res
do i=1,3
res(i:i)=char(ichar(src(i:i))-32)
end do
print '(A)',res
end program death
posted by バー at 11:49| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする

2014年03月04日

美しいコード@CodeIQ

コード美人の解答。
問題はこちらです
1.ループ処理を全て再帰で再現する
2.メソッドは1つの機能しか持たせない
3.コメント無しでも何をしているのかわかる
4.汎用性を持たせる(基準値3や100個までをパラメータ化する)
を全て満たそうとしたら、こんなに読みにくいコードになりました。
人生じゃなかった、羊生何があるかわかりません!

続きを読む
posted by バー at 07:55| Comment(0) | TrackBack(0) | CodeIQ | このブログの読者になる | 更新情報をチェックする
×

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