2011年5月31日火曜日

3DSゲームのこと。

3DSも発売から三ヶ月過ぎました。
買ったソフトは、
・戦国無双クロニクル
・リッジレーサー
・ストリートファイター4
・パイロットウイングス
・スティールダイバー

この中で一番やってるのは戦国無双。
初無双なのといろいろな局面を手軽に遊べることが理由かな?
武将の数だけシナリオがあるのもヤリコミやすい。

リッジのグランプリは途中で飽きて少しずつしか進まない。
スト4は毎回1,2プレイでいいや、ってなる。通信対戦勝てないしw
パイロットウイングスは飛行機やグライダーは楽しいけどロケットベルトがちょいストレス。
スティールダイバーは戦国無双に一息ついてからやろうかな、と。

6月はバイオとゼルダを買う予定。
バイオはまともにクリアしたことないしFPS苦手なので、体験版だけやるかも。
ゼルダはリンクの冒険以来なのでわからないけど、さすがにクリアまではやるかな?

とりあえず、ソフト入れ替えが面倒なので本体かSDカードに移せるようにしてほしいなぁ。

2011年5月30日月曜日

anarchy golf - Basic Code Golf

anarchy golf - Basic Code Golf

空白改行を抜いてコードを縮めるプログラムですね。
この作業はいつもエディタの置換でやってますが。

ポイントは文字列内の空白は抜かない、というところですね。
読み込みにreadを使って書き出しにputcharを使ったら思ったより長く、考えた末にwriteに行き着きました。
それでもtopには並べず最後の詰めにてこずりました。
たどり着けたのは今回はじめて文字出力にwriteを使ったため、すこし実験してみたおかげですね。

anarchy golf - Ejection

anarchy golf - Ejection

こないだニコニコでkoizukaさんがやってるのに触発されてやってみた。
この手のは苦手なんだけど^^;;

現在350byte、Topは323Byte。
二重for文が4つもあるのでもう少し縮むとは思うんだけどなぁ。

ポイントは
入力スキャンしながら列ごとのU,Dの数、それぞれの最大値、行ごとのRの数を記録。
Uの表示。無駄な空白を表示しちゃいけないのでそれぞれの行は逆から構成。
枠を表示しつつRの表示。枠の判定は普通にmod計算。
Dの表示。これはサンプル入力的に無駄な空白は無いけど、やっぱ逆からのが身近そうなので。

という感じ。

2011年5月28日土曜日

anarchy golf - Deadfish 解答

anarchy golf - Deadfish
終わりました。
ぎりぎりで80Byteまではいきましたが一番の鬼門は
256になったら0にする、でした。

IncでもDecでもSqrでもなりうるので別に計算してたんですが・・・
Topの皆さん、掛け算の中だけで処理してらっしゃるw
やっぱテストケースをしっかり見ないと縮みませんね。

僕の解答は
a;main(c){for(;gets(&c);a*=a!=256)c&1?c&4?printf("%d\n",a):c&2?a*=a:a++:a&&a--;}
の80Byte

で、256になる掛け算のみに注力すると
a;main(c){for(;gets(&c);)c&1?c&4?printf("%d\n",a):c&2?a*=a%8?a:0:a++:a&&a--;}
で77Byte

ポイントは
入力は1行2バイトなので文字列として取り込んでも問題なし。むしろ改行コードは外れるのでOK。
下三ビットでコマンド判別
デクリメントはa=0では計算しない
終了コマンドは必ず最後なので特に考えなくてよい。
256になるのは掛け算のみ(つまり16^2)なのでそこだけはじく。

ということで最後のポイントだけ気づきませんでした。

2011年5月26日木曜日

anarchy golf - Deadfish

anarchy golf - Deadfish

取得した文字をマスクかけた後判定してたのをそのまま判定に変更して85→80Byteまで減った。

トップまで3バイトかぁ。

2011年5月24日火曜日

なぜへたれプログラマなのか。という話。

適当に経歴を。

はじめてのプログラムはファミリーベーシック。小学三年くらいのこと。
このころは本にのってるプログラムを写すだけ。写すのもしんどくて父と交代で打ってた気がする。
めんどくさがりはこのころから。自分で作ったのはキャラクタを動かす程度かな?

それでもプログラムに興味を示してはいたので親が安かったからとMSXを買ってきてくれた。
ファミリーベーシックと違って自由に絵がかけるのが楽しかった。
MSXFANの投稿プログラム、とくに一画面プログラムをよく入力したおかげで多少のことは覚えた。
というか、未だにその程度の力だと思われる(笑)

複数のキャラのタスク管理、衝突判定が面倒で自作ゲームとよべるレベルのものはない。

高専に入って(ただし電気科)pascalとcに出会う。今までの微かな積み上げでリファレンスがあるだけで何となく使えることに気づく。
授業でグラフィック関数でなにか絵をかけ、というお題で簡易ペイントソフト作ってみたり。

卒業研究ではなぜか3Dプログラムを作ることになり、2.5次元のこれまた超簡易モデリングソフトを作ってお茶を濁す。
ちょうどDirectXがはじまったころだったが完全にGDIのみで書いた。
このとき、同級生の手伝いで制御や画像解析にも手をつけた。まぁ、所詮電気科なので大したことはない。

就職して検査プログラムで86アセンブラを少しいぢることになる。
MSXでもすこしは勉強したので読むことはできた。でもプロテクトモード制御、セグメントなんかはなにそれ的な扱いだった気がする。

インターネットの普及につれてエミュレータにふれ、自作しようとZ80を組みかけて挫折する。

そのうち某ちゃんねるにはまり、携帯端末としてWinCEを入手。専用ブラウザが流行りだしたので自分もと作りはじめた。まぁ、それなりに人気もでてよかったけど、所詮へたれなので内部はスパゲティ、そしてPCクラッシュによるソース喪失により開発終了。
ソース管理なんてしたことなかったしね。WinCEの挙動が怪しくてwinsockレベルで書いてたのも要因だけど。

その後仕事でHDL書いたり、DOS用プロテクトモードプログラム組んだりで現在に至る。

とりあえずこんな感じ。まぁ経緯を書き出してもへたれとしか言いようがないなぁ。
何となくできてしまったので深く勉強しない。深く勉強しないのでそこが浅い。今さらなんともしがたいかな。

2011年5月23日月曜日

anarchy golf - SQR

anarchy golf - SQR

終わってた・・・。週末ちょっといぢる気がおきませんでした。
m*n格子の中に正方形がいくつあるかという問題。
ちょっと考えてm>nとすると
 m*n+(m-1)*(n-1)+・・・+(m-(n-1))*1
が解答になることに気がついた。
一項目が1*1の正方形の数、2項目が2*2の、最終項がn*nの正方形の数になります。

一応僕のコードが
a,m;main(n){for(;m*n||~scanf("%d%d",&m,&n,a=a&&!printf("%d\n",a));)a+=m--*n--;}
どっちが大きいか試験するコストが惜しいと思って両方デクリメントしながら
0になるまで加算しました。
m*nが二箇所あるのが気に入らなかったんだけど、うまくまとめきらず終了。

nnさんがすごい。
main(x,y){for(;~scanf("%d%d",&x,&y);)printf("%d\n",~y*y*(--y-3*x)/6+y/x);}
ちょっと見、よくわからない^^;;
うまくまとめたらこうなるのかな???