2010年11月9日火曜日

AOJ Volume 5 Problem 0502 : Dice

#include<iostream>

int main()
{
    for (int n; std::cin >> n, n;)
    {
        int s = 1, d[] = {2, 3, 5, 4, 1}, i, t, a, b;

        for (i = 0; i++ < n; s += d[4])
        {
            char c[9], e;
            std::cin >> c;
            e = *c;
            a = 0;
            
            if (e != 'R' && e != 'L')
            {
                e == 'N' ? a = 2, b = 0 : e == 'E' ? a = 1, b = 3 
                     : e == 'W' ? a = 3, b = 1 : b = 2;
                d[a] = d[4];
                d[4] = d[b];
                d[b] = 7 - d[a];
            }
            else
            {
                e == 'R' ? : a = 2;
                t = *d;
                *d = d[1 + a];
                d[1 + a] = d[2];
                d[2] = d[3 - a];
                d[3 - a] = t;
            }
        }
        std::cout << s << '\n';
    }

    return 0;
}
バリンバリンの自分なりのショートコーディング.
納得の331 Bytesです.

問題はサイコロに関する問題なんですが,
回転の種類を大きく2つに分けることができて,
関数化できるので,上記のようなショートコーディングが行えてます.

2010年11月3日水曜日

行列と転置行列の積


#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
using namespace std;
using namespace boost::numeric::ublas;

int main()
{
    matrix<int> A(2, 2), B(2, 2);

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            A(i, j) = i * 2 + j + 1;
            B(i, j) = i * 2 + j + 2;
        }
    }

    cout << A << endl;
    cout << B << endl;
    cout << prod(A, trans(B)) << endl;

    return 0;
}

/* execution result
[2,2]((1,2),(3,4))
[2,2]((2,3),(4,5))
[2,2]((8,14),(18,32))

*/ 


上のプログラムは下記の計算を行っています.


スッキリ書けて素晴らしい.d(゚∀゚)b

2010年11月1日月曜日

今年一番不真面目に取り組んじまった

    
 テスト画像           圧縮データによる復元画像

一目で荒さがわかりますね.ニューラルネットには砂時計型(64-16-64)を使用しています.
プログラムは下の本の5章に書かれていることを参考に実装しました.


学習回数は上の画像では1000回です.
問題の圧縮率は,元画像は192.1 KB,圧縮データは49.1 KBなので,約25.6%となっています.
圧縮データの構成は,画像のヘッダー情報,中間層と出力層の数,中間層と出力層間の重み,
出力層の各バイアス,中間層の各出力です.

GUIも作成し,内容は圧縮したいデータをドラッグ&ドロップしたら圧縮データが作成され,
その復元画像が表示されるものです.

カラー画像のPNSR(peak signal-to-noise ratio)ってどう算出するのかわからないんだけど,
MSEをRGBに対してそれぞれ求めて足し合わせたものを3で割った物を使って,
PNSRを求めると約26.8 dBでした.もうちっと上げたいものですね.

縦に線が入ってる理由は,おそらく入力を
左上から右に順々に繰り返しているからだと考えられます.

改善+オリジナリティが必要ですが,また発表ではミスりましたが,
質疑応答もしっかりと出来ませんでしたが,
俺の本命はゲーム情報学なので,これからはそっちに熱を注ぎたいと思います.

2010年10月30日土曜日

週末は高専祭

3層階層型ニューラルネットワーク
週末,(留年しなければ)俺にとって最後の高専祭が開催されます.
台風来てますが,開催されるみたいです.え

俺は前に言ってた通り,
 "学校でデータ圧縮に関して何かやらなきゃいけない立場"で,
それに関する発表が高専祭当日だったりします.
っで,既存手法の実装にもかかわらず昨日まで必死に試行錯誤していました.
もうちっと,計画的に生きたいです.

一様プロジェクトで去年からの引き継ぎなものです.
プロジェクト名は「ニューラルネットワークを用いた情報圧縮技術」なもんで,
いろいろ楽しかったです.

粘ったかいもあり,ギリギリ発表できるものはできたように思えます.
ブログの方にも月曜日位にできれば結果を掲載したいと思います.

2010年10月7日木曜日

プログラミング部の人は必見の一冊かも

プログラミングコンテストチャレンジブック 

たまたま本屋で見かけた一冊.
プログラミングコンテストの問題を解くためのアルゴリズムがソース付きで解説されています.
ソースはC++で書かれています.
アルゴリズムの教科書になるレベルで, まとまり感が個人的にハンパないです.
値段は学生にとってはちと高く感じますが, 満足できると思います.  
問題を解くための情報も満載です.
誤植は読者サポートページを参照とのことです.

2010年10月2日土曜日

このブログ,ゲーム情報学が主軸なはずです

夏からいろいろあって,
正直,何一つ進まずじまいです.

っで,いつになったらGoswfが使えるのか分からないので,
制作したUCTとUCBの一局をテストで表示してみます.
微妙な一局ですみません.

今,制作中のは素直にUCTを使っていないので,これよりどうなることやら・・・.
微妙にできてはいるんですが,弱いし要修正な感じです.

2010年10月1日金曜日

ポインタを保持するvector


#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int num = 5;
    vector<int*> v;

    v.push_back(&num);
    cout << "num = " << num << endl;
    cout << "*v[0] = " << *v[0] << endl;

    *v[0] = 15;
    cout << "num = " << num << endl;
    cout << "*v[0] = " << *v[0] << endl;

    return 0;
}

// execution result
/*
num = 5
*v[0] = 5
num = 15
*v[0] = 15

*/ 

個人的なメモ.
jk当然可能.

28/01/11 追記
この方法はよく考えたらよくないですね.
スコープ外れてもdeleteしてくれないし・・・.
ごめんなさい.
boostのshared_ptrを使ったほうが良いですね.