SWI-Prologでのクイックソートの実装
SWI-Prologを使って、クイックソートを実装してみました。partition/4
とappend/3
は、SWI-Prologの独自の実装なので、他のPrologの実装だとこのままでは動かないかもしれません。
続きを読む
SWI-Prologを使って、クイックソートを実装してみました。partition/4
とappend/3
は、SWI-Prologの独自の実装なので、他のPrologの実装だとこのままでは動かないかもしれません。
続きを読む
Golangで、定積分の値の近似値を台形公式により求めて返す関数を作成しました。
プログラム中の integrate
という関数が定積分の値を求める関数です。引数として、定積分する関数と、定積分の区間を渡します。引数として渡す関数は、その引数も返す値も float64
型です。その上の N_SUBINTERVAL
という定数を大きくするほど近似の精度が上がり、実行速度は遅くなります。例として、答えが π になる定積分を求めています。
flagパッケージを使うと、コマンドラインフラグ(オプション)を便利に扱うことができます。
flagパッケージを使っていて、あるフラグがコマンドラインに現れたかどうかを検知したいという状況があったので、方法を調べてみました。
一つ目の方法はコマンドラインの内容を os.Args
で直接調べる方法です。ただし、flagパッケージで作られるフラグは、例えば a
という名前のフラグならば -a
と --a
という2つの形式がある上に、引数を持つ場合、 -a x
と -a=x
という2つの形式があるため、処理が複雑になってしまうかもしれません。また、osパッケージを使うのはあまりスマートな方法ではないと思います。
二つ目の方法は、フラグのデフォルトの値から変更があるかをチェックする方法です。これが一番普通の方法だと思います。しかし、コマンドラインでデフォルトと同じ値をセットした場合と、コマンドラインにそのフラグが現れていない場合の区別はつきません。
三つ目の方法は、 flag.Visit()
という関数を使う方法です。 flagパッケージ内の関数を使って調べるには、これしかないようです。flag.Visit()
に渡す関数を定義する必要がありますが、今回の目的には一番あっているようです。
上記の三つの方法を示すコードを作成してみました。
同じような状況があった場合は、この三つの方法をうまく使いわけるといいと思います。
Golangで、ベータ分布の値を返す関数を作成しました。
math
パッケージにはガンマ関数の値を返す関数などがあるので、それらを組み合せることで、ベータ分布の値を返す関数は簡単に作ることができます。
先日、ゴルーチンとチャネルを使った以下のようなプログラムを作成したところ、うまく動作しませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// 動作しない例 package main import ( "fmt" ) func testFunc(sendCh <-chan struct{}) { for { select { case <-sendCh: fmt.Println("Received") default: // Do nothing. } } } func main() { sendCh := make(chan struct{}) // バッファなしチャネル go testFunc(sendCh) for { select { case sendCh <- struct{}{}: fmt.Println("Send") default: // Do nothing. } } } |
ビットコインのしくみにも利用されていて,このところ話題になることの多いハッシュ関数SHA-256を、Goで実装してみました。
実行効率は考えずに、NISTの Secure Hash Standard のページ にある FIPS PUB 180-4 のファイル の記述に従って、わかりやすさを重視して作成しました。SHA-256のアルゴリズムを理解するのに役に立つと思います。
SHA-256のアルゴリズムは大きく分けて、以下の3つの段階に分かれます。
実際のコードは以下の通りです。
「プログラミング言語Go」の練習問題5.19「return文を含んでいないのに、ゼロ値ではない値を返す関数をpanic
とrecover
を使って書きなさい」の解答として、panic
とrecover
を使った Hello worldプログラムを作りました。
「プログラミング言語Go」の練習問題3.5である、フルカラーの マンデルブロ集合(Mandelbrot set) を描画するプログラムを作成しました。元のプログラムで使われている
color.Gray
同様、color.RGBA
型も引数がuint8
なので、uint8
型のインデックスでループをしています。