ダイエット戦士の軌跡

あー。途中の体重も記録しときゃよかったな。とりあえず、-20kgはサックリと通過。
開始時から見ると、現状-22.4kgですな。

2009/08/20 99.8kg
2010/07/20 82.8kg
2010/08/09 77.4kg

7/20~8/3の期間では、脂肪燃焼スープを2セット。
脂肪燃焼スープすげぇ。

解答例

解答例を。 
自力で考えようとかプログラミングに興味がない人はみない方向で。 

さて、とりあえず、色々面倒なので、選択したチップを抜き書きした配列を用意し、そのデータを利用して妥当性をチェックしてみるルーチン。 
インデントが効かないので、"→"を4タブまたは半角スペース4文字分に置換してくだしあ。 


コメント以外に解説は付けません。しかし、この手法そのものは、様々な判定をする上では汎用性が高いアルゴリズムの組み方なので、理解すると色々便利かも知れない。 

================================================================= 
#include <stdio.h> 
#include <memory.h> 
#include <stdlib.h> 

// Neighbor型共用体 
// Top,Right,Down,Leftの要素名とインデックス番号を対応させるため。 
typedef union _Neighbor 

→char f[4]; 
→struct { char Top, Right, Down, Left; }; 
} Neighbor; 

// 方向指定番号 
typedef enum _Direction { 
→UP = 0, RIGHT, DOWN, LEFT, 
} Direction; 

// 面状態を格納する構造体 
typedef struct _FaceState { 
→char Face;→→// 現在取り扱っている面番号 
→char Top;→→// cube_neighbor_setの何番目(0~3)の面が、実際の上側となるか? 
} FaceState; 

// 立方体の各面について、その面と隣接する面の番号を(仮想的な上側から順に)時計回りに与える。 
// 配列は、面番号順に格納されている。 
const Neighbor cube_neighbor_set[] = { 
→{ 1, 2, 3, 4, }, 
→{ 5, 2, 0, 4, }, 
→{ 5, 3, 0, 1, }, 
→{ 5, 4, 0, 2, }, 
→{ 5, 1, 0, 3, }, 
→{ 1, 4, 3, 2, }, 
}; 

// 立方体の面について、どの面とどの面が向かい合わせになるかを与える。 
// face_pair[i]=jの時、面iと面jが向かい合わせとなる。 
// 
const int face_pair[] = {5, 3, 4}; 

// 立方体の面数 
#define FACE_COUNT→6 
// 向かい合わせの面の合計値 
#define SUM_OF_PAIR→7 
// 問い合わせデータ幅 
#define WIDTH→8 
// 問い合わせデータ高さ 
#define HEIGHT→8 
// Free関数のwrapper 
#define SAFEFREE(a)→{free(a);a=NULL;} 

// qsortのコールバック関数 
// int compare_char(const void *a, counst void *b) 
// 引数:→const void *a→第1引数比較値へのポインタ 
//→→→const void *b→第2引数比較値へのポインタ 
// 返値:→int→→第1引数>第二引数ならば正の値 
//→→→→→第1引数=第二引数ならば0 
//→→→→→第1引数>第二引数ならば負の値 
//→→→→→をそれぞれ返す。(qsort関数の要求仕様に準拠) 
int compare_char(const void *a, const void *b) 

→char *_a = (char *)a; 
→char *_b = (char *)b; 
return *_a – *_b; 


// CCubeクラス 
// 立方体の面情報を処理するクラス 
class CCube 

private: 
→// 立方体の面情報を格納する配列。6面それぞれに張り付けられた値を保持する。 
→char plain[FACE_COUNT]; 
→// 面状態の保持構造体 
→FaceState fs; 
public: 
→// Constructor 
→CCube() 
→{ 
→→Reset(); 
→} 

→// CCube::Reset() 
→// 引数:なし 
→// 返値:なし 
→// 機能:立方体が持つ面情報をクリアする。 
→void Reset() 
→{ 
→→memset(this->plain, 0, sizeof(plain)); 
→→memset(&fs, 0, sizeof(fs)); 
→} 

→// CCube::ScanFace( int Face, int SearchFace) 
→// 引数:→int Face→→検索対象となる面番号 
→//→→→int SearchFace→検索する面番号 
→// 返値:int インデクス番号 
→// 機能:ある面から別の面への遷移する際、移動元の面が異動先の面のcube_neighbor_set上で 
→//→→→何番目のインデクスに当たるかを検索し、その値を返す。 
→int ScanFace( int Face, int SearchFace ) 
→{ 
→→int i = 0; 
→→const char *p = &cube_neighbor_set[Face].f[0]; 
→→for( ; i < 4; ++i ) 
→→{ 
→→→if( *p++ == SearchFace ) 
→→→{ 
→→→→return i; 
→→→} 
→→} 
→→return -1; 
→} 

→// FaceState CCube::MoveFace( int MoveTo ) 
→// 引数:→int MoveTo→移動先の面を、現在の面から見て上下左右の方向で指定する 
→// 返値:→FaceState→クラスのfsメンバを返す 
→// 機能:→このキューブインスタンスの面状態を更新し 
→//→→→現在位置から、指定された方向へ移動する。 
→FaceState MoveFace( int MoveTo ) 
→{ 
→→// 次の面にとって、どちらから来たことになるか 
→→int FromDirection = MoveTo ^ 2; 
→→// 次の面のインデックス番号を取得 
→→int NextFace = cube_neighbor_set[ fs.Face ].f[ (fs.Top + MoveTo) & 3 ]; 
→→// その面にとって、どちらの面から来たか 
→→int FromIndex = ScanFace( NextFace, fs.Face ); 
→→// 面状態を更新する。 
→→fs.Top = (FromIndex – FromDirection) & 3; 
→→fs.Face = NextFace; 
→→return fs; 
→} 

→// void CCube::RegFace( char *, int, int); 
→// access:public 
→// 引数:→char *field→→問い合わせデータ配列へのポインタ 
→//→→→int x,y→→→問い合わせデータ上の貼付元位置 
→// 返値:→void 
→// 機能:→問い合わせデータ上の指定位置の値を立方体上に格納する 

→void RegFace( char *field, int x, int y ) 
→{ 
→→char *pos = field + y * WIDTH + x; 
→→// 現在位置にダイス面が存在しなければ処理を中断 
→→if( !*pos ) 
→→{ 
→→→return; 
→→} 
→→// 面をキューブに貼り付け 
→→plain[this->fs.Face] = *pos; 
→→// 現在位置のダイス面を消す 
→→*pos = 0; 
→→// 上下左右の隣接位置に対して再スキャン 
→→FaceState fs; 
→→if( y > 0 )→→→→→→→// 問い合わせデータ上で、まだ上側が残っていれば処理する 
→→{→ 
→→→fs = this->fs;→→→→→// 現在の状態を待避 
→→→MoveFace( UP );→→→→→// 上へ移動 
→→→RegFace( field, x, y – 1 );→→// 上面を登録する 
→→→this->fs = fs;→→→→→// 状態を元に戻す 
→→} 
→→if( x > 0 )→→→→→→→// 問い合わせデータ上で、まだ左側が残っていれば処理する 
→→{ 
→→→fs = this->fs;→→→→→// 現在の状態を待避 
→→→MoveFace( LEFT );→→→→// 左へ移動 
→→→RegFace( field, x – 1, y );→→// 左面を登録する 
→→→this->fs = fs;→→→→→// 状態を元に戻す 
→→} 
→→if( x < WIDTH – 1 )→→→→→// 問い合わせデータ上で、まだ右側が残っていれば処理する 
→→{ 
→→→fs = this->fs;→→→→→// 現在の状態を待避 
→→→MoveFace( RIGHT );→→→→// 右へ移動 
→→→RegFace( field, x + 1, y );→→// 右面を登録する 
→→→this->fs = fs;→→→→→// 状態を元に戻す 
→→} 
→→if( y < HEIGHT – 1 )→→→→// 問い合わせデータ上で、まだ下側が残っていれば処理する 
→→{ 
→→→fs = this->fs;→→→→→// 現在の状態を待避 
→→→MoveFace( DOWN );→→→→// 下へ移動 
→→→RegFace( field, x, y + 1 );→→// 下面を登録する 
→→→this->fs = fs;→→→→→// 状態を元に戻す 
→→} 
→} 

→// bool IsDice() 
→// 引数:なし 
→// 返値:bool→→true:→サイコロである 
→//→→→→→false:→サイコロではない 
→bool IsDice() 
→{ 
→→// ダイス判定条件 
→→// 1.全ての面が完備 
→→int i; 
→→for(i = 0; i < FACE_COUNT; ++i) 
→→{ 
→→→if(!plain[i]) 
→→→{ 
→→→→return false; 
→→→} 
→→} 
→→// 2.3組の対面の和が7 
→→for(i = 0; i < FACE_COUNT >> 1; ++i) 
→→{ 
→→→if( SUM_OF_PAIR != plain[i] + plain[face_pair[i]]) 
→→→{ 
→→→→return false; 
→→→} 
→→} 
→→// 3.1~6の全ての値が使用されている 
→→qsort( plain, FACE_COUNT, sizeof(char), compare_char ); 
→→for(i = 0; i < FACE_COUNT; ++i) 
→→{ 
→→→if(plain[i] != i + 1) 
→→→{ 
→→→→return false; 
→→→} 
→→} 
→→return true; 
→} 
→~CCube(){} 
}; 

bool IsCube(char *field) 

→CCube cube; 
→// 開始位置を探す 
→int x, y, i; 
→// 開始行(y)を探す 
→__int64 *p = (__int64 *)field; 
→for( i = 0; i < HEIGHT; ++i, ++p ) 
→{ 
→→if( *p ) 
→→{ 
→→→y = i; 
→→→break; 
→→} 
→} 
→if( HEIGHT == i ) 
→{ 
→→return false;→→→→→// 問い合わせデータが空だった 
→} 
→char *q = (char *)&p[y]; 
→// 開始列(x)を探す 
→for( i = 0; i < WIDTH; ++i, ++q ) 
→{ 
→→if( *q ) 
→→{ 
→→→x = i; 
→→→break; 
→→} 
→} 
→// 開始位置が特定できたので、再帰的にキューブ面に数値を貼り付けていく 
→cube.RegFace( field, x, y ); 
→// 張り付けてできた立方体はサイコロになっているか? 
→return cube.IsDice(); 


typedef struct _Rect 

→int x; 
→int y; 
} Rect; 

// 問題データ 
// 1~6の目の位置を順にx,y座標で記述。 
Rect question[] = 

→{ 1, 1, }, 
→{ 0, 1, }, 
→{ 2, 0, }, 
→{ 2, 2, }, 
→{ 3, 1, }, // 下の行と入れ替えるとサイコロが完成する 
→{ 2, 1, }, // 
}; 

// 問題データの貼付 
void setAnswer(char *field) 

→for(int i = 0; i < FACE_COUNT; ++i) 
→{ 
→→field.y * WIDTH + question[i].x] = i + 1; 
→} 


int main(int argc, char* argv[]) 

→char *field_table = (char *)calloc(WIDTH, HEIGHT); 
→// 問題作成 
→setAnswer(field_table); 
→// サイコロチェック呼び出し 
→if( IsCube(field_table) ) 
→{ 
→→printf("Cube!¥n"); 
→} 
→else 
→{ 
→→printf("Not Cube!¥n"); 
→} 
→SAFEFREE(field_table); 
→return 0; 
}

しばらく放置気味だったので、ちょっと書いてみる

と思うので、問題定義から。

問題)正方形のチップがある。チップには、1~6までの番号が振られており、このチップを平面上に敷き詰めてある。ここで、平面上から任意の6チップを選択指定した時、選択したチップの配置がサイコロの展開図になるかどうか判定する処理を実装せよ。

ということで。
トリコロ君達が1年ぐらい前にやった奴だよね~♪
俺が書いたコードも、そろそろ公開して良いと思うんだ、うん。

とりあえず、気合いが出せる人は、自分でデータ定義して実装してみよう。
答えは、そのうちにでも貼ります。

某党のマニフェストに絡めて

え ?最終版じゃないの?なんでそんなもん発表するの?

という疑問はさておいて。

  「アルバイトの時給を一律1,000円にする(最低賃金も引き上げる)」とかいうのがあった訳だが、それについて、周りのフリーターや大学生に聞いてみた。 
 すると、10人中8人が「やったー」だの「嬉しい」だの、肯定的な反応しかしなかった。店側には無尽蔵に金があるとでも思ってるのかしら?

というわけで、「店がそんなに金を持ってる訳ないだろ。シフトの人数削られるぞ」と話すと、とたんに「それは困る」と。

 管理会計で言うと、この不況下で、そんなに損益分岐点比率が低い企業はそうそうないぞ、と。

良い根性してるなあ

イリュージョンの新作『勇者からは逃げられない』だそうだ。

公式サイト【18禁注意】
http://www.illusion.jp/preview/yusha/index.html
ライトニングエクレール様
http://www.illusion.jp/preview/yusha/character/04.html

ちなみに、某所からのコピペ。

>エクレール フランス語で雷
>モルニヤ ロシア語で雷
>レランパゴ スペイン語で雷
>フルメン ラテン語で雷
>ランポ イタリア語で(ry
>ブリッツ ドイツ語で(ry
>アストラペ ギリシア語(ry

しっかし、モデリング気合い入ってんなー。
フロンカの足を見て目が点になったぞ。

Project”DIVA”ファーストインプレッション

ミクかわいいよミク。
というわけで、Project "DIVA"のファーストインプレッションをまとめてみた。
総合的にはかなり良い。PV集だと思ったとしても、この値段は納得できる。
予約でねんぷちセット頼んどいて良かったよ。
ミク好きなら買って良いと思う。ただし、ねんぷちセットはヤフオク以外では全滅w
試験に出るので覚えておきましょう。「SEGAのキャラゲーは神
良い点
・ゲームシステムが把握しやすい
・高品質なPV、ミクのモデルやライティングも良い
・ミク部屋のミクのアクションが多彩
・モデルコンバートをするとミク部屋のキャラも変わる(これが一番驚いた)
・玉が流れる方向にバリエーションを持たせることによって、
 ゲームが単調になることを防いでいる
・曲数が割と多い……いや、最近の(ビーマニ他の)傾向からするとそうでもないのか?
悪い点
・ミク部屋でできることが部屋のカスタマイズだけでミクに触れない
・ミク部屋のカメラ範囲がちょっと狭すぎ。いや、なんで制限してるかは判るけどね
・インスコできない(これが非常に曲者)
・オートセーブ機能なし
・一括のせいかロードが長い。データ形式が気になる
・全部PVじゃないのかよ、と。一部は切り替えイラストのみ
・曲選択の時に見られる情報がちょっと少ない
 画面広いんだから、もうちょっと成績関係の情報が欲しい

ICOやってます

確か、3回目のチャレンジ。今度こそクリアするぞ、と。 

 イコはスゴイねぇ。スネークよりも握力あるし(握力ゲージが存在しない)少々高いところから落ちても死なないし。スペランカー先生は、イコに弟子入りして下さい。 

 そしてなにより。ヨルダがメチャクチャに可愛い。この透明感がたまりません。 

 簡単にゲームの紹介を。角の生えた少年イコが、妙な場所(実は、広大なお城)に閉じこめられます。そこには、言葉の通じない謎の美少女ヨルダがいましたが、ヨルダは鳥籠のような檻に閉じこめられていました。イコは、ヨルダを連れて、お城から脱出することを決意します。 
 基本的に、イコは色々なことができますが、ヨルダは高いところに昇ったりすることはできず、イコに手を借りる必要があります。また、時々現れる影が、ヨルダを連れ去ろうとします。(連れ去られるとゲームオーバー) 

 独特の世界観と空気の表現が素晴らしい名作ですが、この表現は「ワンダと巨像」にも受け継がれています。 

イコに手を引かれて走るヨルダが大変可愛いです。 

イコ「さぁ急いで、こっちに来い!!時間がないんだ!早くしろ!!!!」 
ヨルダ「ひぃっ!!」 

こんな感じでwww 
(イコのイメージ声優:小山力也)

ブックオフは売るところじゃないぜ

ブックオフ「文庫本の買い取り価格はきれいな状態なら定価の10%ほどです。(キリッ)」
http://korehanihon.blog90.fc2.com/blog-entry-463.html

 ブックオフは、買うところではあっても売るところじゃないな。
特に、投げ売りコーナーはかなり良い本がゴミみたいな値段で売ってる。
特に、コミックは気を付けないと、本当に二束三文で買いたたかれる。
ムック系なんかはもっと酷く安い。

 逆に、まんだらけは売るところじゃないかな。
よほど他の店で見つからない(か、探すのが面倒)なら、買って良いかも。
ムック系とかコミック、ラノベみたいなのは、店の在庫数によって買い取り価格が決まるから、
タイミングを見ると人気本でも買い取りが高い。

ゲーム類はショップがかなり減ったから、だらけに頼るしかないのが辛いところ。
スーパーポテトがあればなあ。

久しぶりに大興奮できるサイトを見つけた

Spring8(財団法人高輝度光科学研究センター) 

http://www.spring8.or.jp/ja/ 

まずはコイツだ。 


バッテリー電解液の性能を世界で初めて固体かつ室温で実現 ― 材料をナノメートルサイズの粒子にすることで成功。ナノテクノロジーが安全・高性能な新しい電池開発への道を開く。― 
http://www.spring8.or.jp/ja/current_result/press_release/2009/090518/pressrelease_view 


で、興奮しまくって他の記事をあちこちうろついてたら見つけたのがコレ。 


1兆回繰り返し使える強誘電体メモリー材料のしくみを解明 - “魔法の置換” 有害な鉛を使わない新材料開発へ新しい展望 - 

http://www.spring8.or.jp/ja/current_result/press_release/2007/071001 

良いねぇ良いねぇ。科学万能の時代だね。オラなんだかワクワクしてきたぞ。

過去の資産を継承する

 さて、ウチには5"2HDが、まさに腐るほどあるのだが、これを何とかしたいというのがかねてからの宿願であった。
イメージ化すればエミュ環境に継承できるのだが、ドライブやメディアの問題があり、一時的な環境は何とかなっても、(少なくとも、必要なディスク群を全てサルベージするまで)恒久的に運用できる環境が構築したかったのだ。
 その一環として、3.5"FDDを68000に接続できるような電子工作をしたことはあるが、しばらく使用しないうちに配線は滅茶苦茶。多分、コネクタ周りなどの断線も発生しているであろう。……というわけで、どうにも手詰まりに近かったのだが、XVI compactが手元に来てしかもリプレイスした今、何とかせねばなるまいということで、一念発起して環境を整備してみた。
 逆に、X68000向けの各種フリーソフト(ツール類)などは、5"2HDでバックアップしていた分しか手元に残っていない。Webから引っ張ってきたものを持っていければ、環境も充実するのに……というわけで、双方向に対してなんとかデータを持って行く方法を構築するべしということに。
以下、まとめ。
●X68000, PC-9801→XVI compactのデータ移動
メディアは5"2HD(1.2MB)→3.5"2HD(1.2MB)となる。
コレは、PC-286XG+外付け3.5"FDD+Wizard98(V3)で解決した。
Compactの隣において、ディスクをデュプリケートしつつ、X68000側では2HDSimを使用してイメージ作成。
これで、機械的にピストン式でファイルを持ってくることができるようになった。
Wizard98の機能を用いれば、逆方向も可能。また、Wizard98が調達できない(ていうか、もともと持ってる人でもない限り無理か)場合は、アセンブラで適当にプログラムを書いてデュプれば良い。プロテクトがかかってなければ特に問題ないかと。
●XVI compact→Windowのデータ移動
主にエミュ環境向けやバックアップのため。このようなツールを発見。
これで、XVI compactのHDD(のフリをしたCF)から、ディスクイメージを抽出できる。なお、標準的な2HD(1.2MB)フォーマットを2HDsimでイメージ化したものは、少なくともanex98では認識・使用することができた。IPLも問題なさげ。ファイルとして環境内に持ち込めば、68エミュ環境上でも2HDsim経由で使用できる。
●Windows→XVI compactのデータ移動
これが一番厄介。CD-ROMドライブを搭載したPC-9801系の機種があれば、CD-Rに焼くことでなんとかファイルを持ち込むことができた。ウチでは、PC-9801Xa10を使用して3.5"2HDに書き出して持ち込んだ。かなり面倒ではあるが、とりあえず色々持っていくことができたので結果オーライ。
  • WordPress.com で次のようなサイトをデザイン
    始めてみよう