2010年9月30日木曜日

彼女曰く「しー」には「えっち」が不可欠なんだそうです

彼女と二人で「C」体験! (MF文庫J)

突っ込んだら負けなラノベ.

結構ブログなどで紹介されてたので,
本屋で580円(税別)に戸惑いながらも購入.

Cと思ったらC++だったり,
基底と派生が逆だったり,
ヘッダーのことをえっちと言ったり,
突っ込んだら負けなところがありますが,
ラノベな感じでいいんじゃないんでしょうか.

てか,久しぶりにラノベを読んだ.

2010年9月25日土曜日

PBL シンプルなシェルの作成

PBLっていうのは先生が問題を提示し,学生内で班などを形成して
学生同士の意見交換などにより問題を解決していく授業形式?です.

で,リダイレクション機能,パイプ機能,バックグラウンド機能,
exitと入力されたら終了することができる
シンプルなシェルを作成が問題として提示されてました.
ググってみると,情報関係の大学生もやっているので,よくある課題なのかなと思います.
俺がいた班は最終的には非カノニカルモードを使うことで,Tabキーが押されたら,
コマンドの予測表示(補完ではない)までいけました.

そこで,作成するのに役立った本などをご紹介します.
まずは,
 詳解UNIXプログラミング
です.と言ってもあんまり読んでないんですが,たぶん王道?だと思います.
訳本なので,英語に自信がある方は原本の方が良いかも.
社会に出る前には読んどきたい一冊ですが,今回の課題に対しては詳しすぎる気がしました.
あと重か(ry.

次にご紹介するのはこちら.
例解UNIXプログラミング教室
たぶん,今回の課題に一番マッチしていた本だと思います.
一番読んだし,コードが豊富で読み易かったです.オススメの一冊.
この一冊だけで,今回の課題はパスできると思います.

 次はこちら.
Unix/Linuxプログラミング理論と実践
位置づけは,初めに紹介した本を易しくした感じ.
説明とコードの割合がいい感じで,読み進めるのは楽かも.
図も分かりやすかったと思います.

他にも参考にした本があるんですが,あんまり読んでないので紹介は止めときます.
突き詰めれば突き詰めるほどいろいろ工夫できたので,面白い課題でした.

2010年9月22日水曜日

AOJ Volume 5 Problem 0505 : Questionnaire


#include<iostream>
using namespace std;

int main()
{
    for (int n, m, i, j, c; cin >> n >> m, i = n;)
    {
        int r[101] = {0};
        for (; i--;)
            for (j = 0; ++j <= m; !c ? : r[j]++)
                cin >> c;

        for (i = n + 1, c = 0; --i;)
            for (j = 0; ++j <= m;)
                r[j] != i ? : cout << j << (++c == m ? '\n' : ' ');
    }

    return 0;    
}

若干ショートコーディング気味のコード.
ショートコーディングを自分なりにちゃんとやると208 Bytesになりました.

2010年9月14日火曜日

俺より先にBotがツイートしやがった

誰でもできるTwitter Botの作り方―人気キャラにつぶやかせる

 Twitter Botを上の本を参考に作ってみました.
と言ってもまだHello World!をツイートした程度ですが.

つまずいたのは
sudo apt-get install libopenssl-rubyが必要なこと.
もしかしたら必要ないかもですが, no such file to load -- net/httpsのエラーが
入れたら消えたと思います.

本の内容は,懇切丁寧な感じで, 日頃からWeb APIに
触れている人はたぶん物足りないと思いますが,
そもそもTwitterって何な俺みたいな人には最適かもです.

アプリケーション名はクール狸(cool_tanuki)です.
クールにつぶやけるように, 卒業研究後に改良していきたいと思ってます.

2010年9月7日火曜日

モンテカルロ法を用いた円周率の算出風景

モンテカルロ法を用いた円周率の算出中の画像
実際はリアルタイムで点が増えてきます
Qtの練習第二弾として, モンテカルロ法を用いた円周率の算出風景?を
可視化できるものを作成してみました.

リアルタイムで点が増えて行くのはまぁまぁ気持ち良くないですが,
なかなか正確な値に近づかないのが,もどかしい気持ちにさせます.
ちなみに第一弾の5五将棋のGUIは未だに作成中です.
決して逃げた訳じゃないと思う・・・。

作成手順は
1.  正方形なウィンドウを作成し内接円を描く.
2. ウィンドウサイズ内にランダムに点を打ち,円の内外判定を行う.
 今回はupdate(x, y, width, height)で特定の場所を更新できることを用いました.
3. 4×円の内側 (円周上も含める) に入った点の数 / 点を打った数を中央に表示する.
4. 2と3を繰り返す.

っな感じです.
上の例では 内側の点は青く, 外側の点は赤くしてます.

2010年9月1日水曜日

AOJ Volume 1 Problem 0196 : Baseball Championship


#include <iostream>
using namespace std;

int main()
{
    int n;
    while (cin >> n, n)
    {
        char name[10];
        int win[10] = {0};
        int lose[10] = {0};

        for (int i = 0; i < n; i++)
        {
            cin >> name[i];
            for (int j = 0; j < n - 1; j++)
            {
                int s;
                cin >> s;
                if (s == 0)
                    win[i]++;
                if (s == 1)
                    lose[i]++;
            }
        }

        for (int i = n - 1; i > -1; i--)
            for (int j = 0; j < n - i; j++)
                for (int k = 0; k < n; k++)
                    if (win[k] == i && lose[k] == j)
                        cout << name[k] << endl;

    }

    return 0;
}

本来,ソートを行うべきですが,入力されるチーム数が最大10と少ないため,
ソートせずに,全勝のチーム,1敗 0引き分けのチームといった順番にヒット?させています.
絶対無駄な処理があり,実行速度は若干遅いだろうと思いますが,
コード自体がスッキリするので,これもありなんじゃないかと思います.