2011-06-01から1ヶ月間の記事一覧

RE1(正規表現エンジン)への道(1)

Google RE2の前の実験的実装としてRE1があります。VMを使った正規表現エンジンの勉強に最適だと思います。ここではRE1実装ができるまでの実装を細かく追っていくことを目的に再開発します。blogで解説したいと思っているのですが、どうかけば良いか考え中で…

minigcのgc_mark_stack(void):void はいつ動くの?

ガベージコレクションのアルゴリズムと実装を読む準備としてminigc(tree:ff305e...)を読んでいるのですが、どうにもよく分からないところがでてきました。それはgc_mark_stack()を通していつオブジェクトがマークされるのかということです。少なくともぼくの…

mallocとfreeの実装

ガベージコレクションのアルゴリズムと実装の参考資料でもあるminigcのmalloc/free部分の実装を抜き出して、自分でも書いてみました。sbrk(2)は呼び出すたびに、ヒープ領域を伸ばします。my_freeは、ヒープ領域を解放するわけではなく、my_freeしたヒープ領…

windowsでmmap

windows.hをはじめて使ってみました。CreateFileWでファイル名を指定するために、mbtowcという関数を使わないといけないようです。windowsでコンパイルするときは"gcc file.c -DOS_WINDOWS"とします。linuxなどの場合は"gcc file.c"だけでokです。 使い方 コ…

ピアノ問題の一般解(数学ガール: 乱択アルゴリズム)

本の中では(a=8, b=4)の場合だけ検算していますが、それ以外の場合についても確かめるためのプログラムです。"./a.out a b"で実行すると場合の数を返します(a,bは書籍上で定義されているものと同じです)。 ソースコード #include <stdio.h> #include <stdlib.h> #include <string.h> #incl</string.h></stdlib.h></stdio.h>…

甘いもの詰め合わせ(ダイナミック・プログラミング)

プログラマのための論理パズルの解答例です。 "./a.out 1 160"で問題1の解答が、"./a.out 5 160"で問題2の解答が得られます。低性能と言って良いようなPC(netbook)で計算してますが、1問あたり5分以内で計算が終わりました。 ソースコード #include <stdio.h> #includ</stdio.h>…

数独(推論のいる場合)

数独の拘束条件だけでは答えが1つに絞れない場合に対応しているプログラムです。 例 例えば、こんな問題(0は空欄を意味します)は前回のプログラムでは解くことはできませんでしたが、今回のプログラムでは解くことができます。 000 104 870 000 007 400 300 …

数独(推論のいらない場合)

数独を解くプログラムです。少しでも問題が難しいと、解けなくなります。 コード #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> struct State { char c; struct State* right; struct State* down; }; struct State* state(char c) { struct State* s = malloc(s</string.h></assert.h></stdlib.h></stdio.h>…

年齢並べ

プログラマのための論理パズルに掲載されているパズル「年齢並べ」をC言語に解かせてみました。順列の生成のところで、つまってしまって少し凹みました。 コード #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> struct Person { const char* name; int age; struc</assert.h></string.h></stdlib.h></stdio.h>…

和の公式

Euler Problemという問題があります。問題の#1はこのページに日本語で載っています。電卓があれば手計算でもできる問題だと思います。3の倍数の和と5の倍数の和から、(3の倍数∧5の倍数)15の倍数の和を引いた数が答えになりますよね。そういう方針でコードを…