2016年06月25日

スマホ版トリスタとか

ひさしぶりに動画作りましたb

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

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月22日

【アンジュ】ソフィーナが好き過ぎて辛いとか

アンジュ・ヴィエルジュのソフィーナが好き過ぎて辛いです。

何が辛いって公式サイトのソフィーナのキャラ説明を見てください。
見ましたか?
見て、不思議な言葉があったことに気づきませんでしたか?
それは「理深き黒魔女」という言葉です。
「理深い」なんて日本語、聞いたことがありますか?聞いたことないはずです。辞典で調べてみても、そんな用法は存在しません。そんな日本語は存在しておらず、ソフィーナのために創られた言葉なのです。
そして、この言葉は恐らくですが「情け深い」の対語として創られています。
本来、「情け深い」の対語は「冷徹」とか「情け容赦ない」といった言葉になります。これらの言葉はあまり良い意味では使われません。そのため、情理(人情と道理)あるいは義理人情から「理深い」という対語を創ったものと思われます。思慮深いとほぼ同じ意味です。
そこから得られるのは内に秘めたる熱い感情を廃し理性を重んじる態度です。
そもそもソフィーナが青蘭学園に来た理由は4つの世界に起こった異変の原因を究明するよう魔女王様から勅命を受けたためです。また公式サイトにある通り、「魔女王の片腕」とか「黒き継承者」といった凄い通り名を持っています。
そこから得られる人物像は、不可能を可能にする超絶エリートです。公式サイトにもあるとおり黒の世界で名前を知らない人がいないというくらいの超大物です。しかもそれを努力で成し遂げています。勝ち目のないような長い戦いにおいても、たった一瞬、一回だけの勝機を捉え、そこに全力を注ぎこんで勝利し、背中は汗びっしょりでも震える膝を押さえて、当然の勝利と涼しい顔をしている。そんなキャラクターです。だからこそ、ソフィーナSRの使うエクシーズは一撃必殺、黒魔女の一閃なのです。
ところが、ゲーム中で描かれるソフィーナったら、テンプレヘンテコツンデレキャラな上、行動も感情的突発的で、とても「理深い」には程遠いのです。
その滅茶苦茶なキャラ設定は今回の1月イベントでも如何なく発揮され、ただ感情に流されてキヌエに歯向かったりとか、公式設定からはありえない行動を見せています。

なんでやねん。ほんまなんでやねん。と思わずSSを書きました。反省はしていません。
一応、この疑問を解消するSSも書く予定です。つまり諸悪の根源は美海!

posted by バー at 11:47| Comment(1) | TrackBack(0) | 電波に思うこと | このブログの読者になる | 更新情報をチェックする

2015年01月20日

【アンジュ・ヴィエルジュ】非公認SS「黒魔女の友人」

アンジュ・ヴィエルジュ』の非公認ショートストーリーですの。
非公認未認可の勝手二次創作なので、クレーム来たら削除になりますの。

では
「黒魔女の友人」

ソフィーナの章

理深き黒魔女。天才。優等生。私の二つ名は多数ある。
そんな私に、最近、友人ができた。
青の世界出身。おっちょこちょいでお節介で能天気。
その子の名前は美海。
そんな彼女が私のどこを気に入ったのか、恐れもせずに声をかけてくる。
「ねえねえソフィーナちゃん、ここわかんない!」
明後日から試験だというのに、範囲の中間からわからないなんて……
だから、私は毅然とした態度で美海に接する。
「放課後、2時間みっちり教えるからね!」
「えーっ」
心底嫌そうな声で、でも顔は笑っている。

美海の章

ああ、もうこんな時間!
ソフィーナちゃんに教えて貰ってて、気づいたら3時間!
2時間って言ったのにー!
でも、ソフィーナちゃんに教えてもらうとわかりやすいんだよね。
たまちゃんだと、この式をぎゅーってやってどんみたいな教え方だから、ちんぷんかんぷん。
ふわぁー。
今日は早めに寝ないと。
遅刻しそうになったからって、エクシード学外で使っちゃったら、最低でも停学、下手したら退学だもん。
「校外でのエクシード使用は、住民に不要な不安を引き起こし、ひいては学園の存続にも関わる重大事項である」
って教頭先生も言ってたもん。
一緒に卒業しようねって、ソフィーナちゃんに約束したんだから、そんなことで停学にでもなったら大変!
わわ、なになに?何が起こったの?
「ただいま、地震のため列車を緊急停止しております。再開までお待ちください」
えー!早く帰りたいときに地震で止まるなんて……ついてないなぁ……

決断の章

美海の乗った電車はもう見えない。
3時間に及ぶ苦闘の末、やっと赤点を取らないレベルまで教えることができた高揚感が冷めるまで、この涼しい風を楽しんだ。
ダークネス・エンブレイスの魔女王様直命で青蘭学園に来ている私は住居も優遇されている。
学園から歩いて3分の高級マンション。
駅からでも5分もかからないそこに帰って、昨日のうちに煮込んでおいたシチューを暖めて夕食にしよう。
……!
地震だ!
足元が大きく揺れるけど、理深き黒魔女が無様に転ぶわけにはいかない。
騒動の中、涼しい顔を作って必死に転ばないようにバランスを取った。
美海は大丈夫?
振り返って駅を見る。
そこで、見てはいけないものを見てしまった。
今の地震で地盤が緩んだのか、駅の裏の山が崩れかけている。
このままだと崩れ落ちる!
止めなきゃ!
でも……
学外でエクシードを使ったら、最低でも停学、最悪なら退学。
人命救助のためという大義名分があっても試験は受けられなくなる。
落第したら、魔女王様に申し訳が立たないし、なにより……美海と一緒に卒業できなくなるかも知れない……
たとえ私が何もしなかったとしても、誰も私を責めることはないだろう。
でも。
もし、美海がここにいたら?
彼女だったらどうした?
あ。
崩れた……
駅に居る人たちも気づいてパニックになってる……
素早く計算する。
あの崩れ方をどうすれば止められるのか、被害をゼロにするためには何を唱えればいいのか。
美海、ごめんね!
心の中で唱えてから、詠唱した。
「流星群!」
誰の目にもエクシーズと明らかなそれは、狙いたがわず崩れ落ちた土砂を全て粉砕した。

処分の章

「失礼します」
翌日の放課後、教頭室の扉を二度ノックし、返事を待ってから部屋に入った。
環先生と教頭先生。
「呼ばれた理由はわかっているな?」
「はい。承知しています」
「ソフィーナ君、君は再三禁止されているにも関わらず、学外でエクシードを発動した。それも大規模エクシードの流星群を、だ。間違いないかね?」
「はい、相違ありません」
「しかし、教頭」
「私はソフィーナ君と話している」
環先生の言葉を遮った教頭先生が更に言葉を重ねる。
環先生、ありがとう、でももう覚悟はできている。
どのような理由があろうと、ルールはルールだ。
理深き黒魔女の名にかけて、その罪は購わなければならない。
「最近、君についてはよくない噂も出ている。とてもダークネス・エンブレイスの天才とは思えない言動が目立つと」
「はい」
「中には交友関係が悪いのではないかという者もいる」
予想外の言葉に、反応してしまった。
私のことをどう言っても構わない。そんなものをいちいち気にしたりはいない。だからといって友達を悪く言うのは……と反論しかけて、思いとどまった。
教頭先生の目に優しさが見えたから。
「だがね、そんな交友関係から、こんなものが届けられている」
教頭先生が私に投げて寄越したそれには”嘆願書”と書かれていた。
「全校生徒の3分の2。それが君への処分の嘆願に署名した数だ。名前は明かすなと言われているので明かせないが、これを昼過ぎに私に持ってきた生徒がいてね。たった半日でこれだけの署名を集めてね」
そう言ってテレビのリモコンのスイッチを入れた。
『こちらが現場の駅です。ごらんのとおり、まったくの無傷です。ここで視聴者提供の、崩れたときの映像をもう一度ご覧ください。凄い勢いで落ちている土砂!危ない!ここで、ほらあの光ですね。流星群というらしいですが、完全に土砂を止めています。数百人の命を、たった一人の少女が救ったのです!』
もう一度リモコンを操作してテレビを止める。
「そもそも学外でのエクシーズ使用は、住民に不要な不安を引き起こし、ひいては学園の存続にも関わる重大事項ゆえ禁止されている。だが今回の件では住民に不要な不安を引き起こしておらず、むしろ賞賛されているのだよ。……君への処分だが、多数の人命を救助したこと、多数の嘆願があったことから、今回は不問とする。退出してよろしい」
ありがとうございます、の一言は言えなかった。
言ったら酷い声になるのがわかっていたから。
だから、深く一礼だけして部屋を出た。
「良い学友を持ったな」
閉めた扉の向こうから、教頭先生の声が聞こえた。

エピローグ

曇った視界でも、廊下を走り去っていく後姿が見えた。
きっと教頭室の前で立ち聞きしていたのだろう。
深呼吸。
精神統一。
ハンカチを目元に当てる。
うん、もう大丈夫。
ほら、何気ない顔してこっちに歩いてきた。
「ソフィーナちゃん、どうだった?」
「私を誰だと思ってるの?もちろん、お咎めなしに決まってるでしょ!」
「よかった!」
その笑顔が眩しすぎたから、頑張って真面目な顔を作って。
「だからってあなたは学外でエクシード使っちゃ駄目よ?」
「わかってるってばー」

理深き黒魔女。天才。優等生。私の二つ名は多数ある。
そんな私に、最近、友人、ううん、大好きな親友ができた。
青の世界出身。おっちょこちょいでお節介で能天気。
その子の名前は……
posted by バー at 18:05| Comment(0) | TrackBack(0) | 創作 | このブログの読者になる | 更新情報をチェックする

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年11月18日

【アンジュ】ストライカー指南とか

バーです。
アンジェでのBランクギルドの戦い方について書きましたけど、その中でSタイプ(ストライカー)の運用が難しいようですので、書いておきますのです。

ストライカーの凄いところは、その運用コストです。とにかく安いのです。たとえば最近「あか壁の戦い」という大きな戦いがあったのですけど、そのときにストライカー選択をしていたバーは一度も保健室に入らず、最後まで戦い抜き、攻撃回数MVP、PT3位でした。
では薬をどのくらい使ったでしょうか。ちなみにバーのBPはMAX268です。実は残り時間10分でBPMAX1つだけなのです。(それ以外に掲示板回復とtwitter回復はしています)これがストライカーの真骨頂です。

もちろん、漫然とストライカーをしていても、こんな低コストで回すことはできません。ストライカーには打たれ弱いという最大の弱点があるのです。猛攻くらうとあっという間にさようならごめんなさいもう許してだめよだめダメージです。だからアクションでフォローします。

たとえばバーの選択アクションです。
ファブリーズ:ヴィクトリーゲイン
ばぶばぶのごんゆう:フルリヴァイブ
ナナララ:フルリヴァイブ
霧:ブラックリヴァイブ
霧ちー:リヴァイブ
スペメ:リヴァイブ
桜吹雪:リカバ
インスピ:ブルームユニゾン

ほとんど全てのアクションが回復系!辻リカひつぢの面目躍如な感じ!(ただし自分だけリカバ)
ぶっちゃけ頭おかしいとしか思えません!APいくらあったら足りるのでしょう!・・・と思うかも知れませんけど、意外とAP回るのですよ。ストライカーは殴ってなんぼなので、とにかく手数が多くなります。クリブは必要な時(具体的にはアタッカーができないとき)しかやりませんので、基本1枚出し。そのためAPががんがん溜まります。むしろ余るくらいです。ですからファブリーズ先に貼って1枚出しで運よく相手全滅させられたらめっちゃBPプラス、10回殴って全滅したらフルリカ、誰もキリ番殴れない?じゃあ霧張って殴ります!みたいなことができます。

ストライカーはあらゆる局面であらゆる戦法を臨機応変にこなす必要があり、アタッカーとしてまたファイターとしても機能しなければならず、とにかく忙しいし頭疲れます。おまけに打たれ弱いです。MVP取るのも難しい縁の下の力持ちだったりします。だから決してお奨めできるタイプではありません。むしろ力押しでどうにかなるAや、コンボに徹するFのほうがお奨めできます。

ただ、ストライカーはC+くらいの能力で、BP300未満でも戦えます。戦況を左右することすらできます。サークルに1人はいないと辛いです。実際、バーが戦ってみて強いと思ったサークルさんはストライカーの運用が上手いサークルさんです。

レベル低いときはF、ちょい強くなったらS、俺様お前を丸かじりになったらA、と分けてみるのも面白いかも知れません。
まあ全員S以上でBP極振り全力殴りBPは薬使いまくりヒャッハーなサークルさん相手にはどうしようもないのですけどねb
posted by バー at 21:24| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

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