GoでDFS

プログラミングコンテストチャレンジブック2-1のLake Counting

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )


次のような水たまり(Wで八方向に繋がっている)の数を数える

W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

コード

package main

import "fmt"

const MAX_N = 100
const MAX_M = 100
var N,M int

func makeTable(lake []byte, field *[MAX_N][MAX_M]byte, width,height int) {

    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            field[y][x] = lake[y*width+x]
        }
    }
}

func dfs (field *[MAX_N][MAX_M]byte, x, y int) {
    var nx,ny int
    field[x][y] = '.'
    for dx := -1; dx <= 1; dx++ {
        for dy := -1; dy <= 1; dy++ {
            nx = x + dx
            ny = y + dy
            if 0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'W' {
                dfs(field, nx, ny)
            }
        }
    }
}

func main() {
    N = 10
    M = 12
    res := 0
    field := new([MAX_N][MAX_M]byte)

    lake := []byte("W........WW..WWW.....WWW....WW...WW\
    ..........WW..........W....W......W...W.W.....WW.W.\
    W.W.....W..W.W......W...W.......W.")

    makeTable(lake,field,M,N)

    for i := 0; i<N; i ++ {
        for j :=0; j<M; j++ {
            if field[i][j] == 'W' {
                dfs(field, i, j)
                res++
            }
        }
    }
    fmt.Printf("result: %d\n", res)
}

Goにはpermutationとかあんのかなぁとふと思った。

stackoverflowで参考になった質問(Go)

新しい言語を学ぶときにsofを取りあえずなめとくのはもはや定番だと思うが、goのタグ付いてるのが400問ちょいだったので、全部眺めてみて役だったものをリストアップしてみた。

入門ドキュメント

answerに載ってたドキュメントが面白そう。

文字列関連

文字列の操作は結構はまった。というかいまでもよくわからん部分が多い。取りあえず配列とスライスの違いは理解したが。

プロファイラ

google-perftoolsってのを使えばいいらしい。

配列のコピー

コピーはちょっとめんどくさそう

インターフェース

ダックタイピングみたいなもん。結構わかりやすい説明だった。

channelをhaskellでエミュレートするには?

面白そうなんだけどまだちゃんと読んでないというか、channelをきちんと理解してないから後で読む。

METAMORPHOSE 2011

今年のメタモは荒天中止で残念だった。

友人たちが北海道と熊本から遠路はるばるやってきたけど、着陸後に公演中止を知ったので、週末はそのまま集合して残念会を開いていた。

残念会兼祝勝会って感じですね。よくつるんでいた最後の一人が結婚することになったのでそのお祝いも兼ねて宴会をしてた。

子供が寝てから夜中まで色々話すことが出来て楽しかったが、友人たちも楽しかったようで、「10年前に戻った感じで楽しかった」というメールがきて、ああ、十年も経つのねとちょっと感慨深くもなった。

あの頃は冬のシーズンは毎週ボードトリップしてて夏はキャンプ行ったりフェス行ったりと色々動き回っていたからなぁ。

そろそろボード再開しようかなと。ヤマボクも行きたいし、北海道にも遊びに来いって言われてるし。

Goでフィボナッチのメモ化

Goでつくる簡易Wikiのサンプルは楽しいですね。標準ライブライブラリにhttpHTML5用のパーサが入っているのはポイント高いですな。あとGAEにも対応したしね。

なかなか楽しいので少し覚えるためにプログラミングコンテストチャレンジブックをGoで書いていくことにしようかなと。

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )


定番のフィボナッチ(メモ化)

package main

import "fmt"

var memo [100]int

func fib(n int) int {
   if n <= 1 {
       return n
   }
   if memo[n] != 0 {
       return memo[n]
   }
   memo[n] = fib(n-1) + fib(n-2)
   return memo[n]
}

func main() {
   fmt.Println(fib(10))
}

こっちはPythonで

memo = [0]*100

def fib(n):
    if n <= 1:
        return n
    if memo[n] != 0:
        return memo[n]
    else:
        memo[n] = fib(n-1) + fib(n-2)
        return memo[n]

if __name__ == '__main__':
    print fib(10)

Emacsでunindentationするには負の数を入れる

インデントするにはC-u C-x C-iとかC-u n(空白文字の数) C-x C-iなのはちょっと前に覚えたのだけど、逆に4文字字上げしたい場合には

C-u -4 C-x C-i

とやればよいということに気づいたが、ちょっとめんどくさい。数字打たなくてもいい方法ってあるのかな?

入門HTML5

「HTML5が何を目指しているか」の入門書。初心者向けではないし、tips集とかコード例が載っている本ではない。文書の構造と意味付けに始まり、HTML5で登場した新しい機能をサクサクと説明してある。

特に10章はセマンティクスとか知らないと難しいかもしれないが、未来を感じさせられる内容だ。というかbioinformaticsなんかでは10年以上前からRDFとかセマンティックwebとかずっと言われ続けてきてると思うが、なかなか普及してないような気がする。けど本書を読んでpubmedとか出版社とか化合物のマイクロデータとか整備すればかなり面白いんじゃないかなぁとおもうんだけどねぇ。

9章のwebフォームも読んだら早速使いたくなる内容だった。一方8章のオフラインウェブアプリはちょっと身近な具体例が思い浮かばなかった。

ProductName 入門 HTML5
Mark Pilgrim
オライリージャパン / 2415円 ( 2011-04-23 )


Pythonのリストのリストでちょいはまる

すっかり忘れてたがこんなのです。

shallow = [[1,2,3]] * 3
shallow[1][1] = 0
shallow # [[1, 0, 3], [1, 0, 3], [1, 0, 3]]
deep = [[1,2,3 ] for f in [1,2,3]]
deep[1][1] = 0
deep # [[1, 2, 3], [1, 0, 3], [1, 2, 3]]

という備忘録

遅れてGoブームがやってきた

devquizで初めて触ったら意外に面白かった。好みかも。

というわけでGoのチュートリアルを読んでたらゴルーチンが楽そうだった。

フィボナッチ

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import "fmt"

// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
    for i := 2; ; i++ {
        ch <- i  // Send 'i' to channel 'ch'.
    }
}

// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func filter(in, out chan int, prime int) {
    for {
        i := <-in  // Receive value of new variable 'i' from 'in'.
        if i % prime != 0 {
            out <- i  // Send 'i' to channel 'out'.
        }
    }
}

// The prime sieve: Daisy-chain filter processes together.
func main() {
    ch := make(chan int)  // Create a new channel.
    go generate(ch)  // Start generate() as a goroutine.
    for i := 0; i < 100; i++ { // Print the first hundred primes.
        prime := <-ch
        fmt.Println(prime)
        ch1 := make(chan int)
        go filter(ch, ch1, prime)
        ch = ch1
    }
}

プログラミングコンテストチャレンジブックをGoでやってみようかと思う。

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )


PyConJP2011に参加してきた

スタッフ、スピーカーのみなさんお疲れ様でした。とても楽しませてもらいました。 私用によりLTを見られなかったのが残念だったが、色々刺激をうけて大変満足な一日だった。

参加したのは以下のセッション。

  • Keynote [Tarek Ziade]
  • C API への誘(いざな)い / An Introduction to the C API
  • Webフォームウィジェットツールキットを総括する / Exploring Web Form Widget Toolkits
  • Python と MongoDB でWEB開発 / Web Application Development with Python and MongoDB
  • GAEのpython2.7対応の話

TarekのKeynoteは文句なく良かったが、個人的にもっとも興味深かく聞けたのはC APIの話ですね。あれは面白かった。

実務的にはWebフォームウィジェットの話が参考になった。Flaskばっか使っているのでWTFormsを使おうと思った。

PythonとMongoDBの話はちょっと展開がはやすぎて追いづらかった。というか、うっかりTornadoのドキュメントを読むのにトラップされて、追いていかれた感が。スライドとかコードとか公開されてんのかな?あとで調べる。

最後にGAEのPython2.7対応の話を聞けてよかった。かなり楽しみな感じなので、なんかサービス作っておこうっと。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


次の読書会の本の候補を考えてみた。

そろそろ、来期の読書会の本を決めないといけないでしょうと、みな薄々感づいているはず。

@yajuが「7つの言語7つの世界」推しをしていたので、僕も考えてみた。ちなみにこの本は読んだことないのでちょっと興味はあるなぁ。あと7つの言語のなかではIo以外は触ったことがあるけど1章でScalaとかPrologとか説明するってことは相当事前知識が要りそうな気がすんだけどどうなんだろう?

ちなみにある程度薄いのをチョイスしてます。

入門 HTML5

入門ってついてるけど、HTMLをよく知っている人がHTML5に入門するという内容かなぁ。初心者向けではないような。

ProductName 入門 HTML5
Mark Pilgrim
オライリージャパン / 2415円 ( 2011-04-23 )


Dive Into HTML5で全文英語で読めるので、内容はこっちで確認

javasriptパターン

javascript the good partsを読んでいた流れでさらにjavascript

ProductName JavaScriptパターン ―優れたアプリケーションのための作法
Stoyan Stefanov
オライリージャパン / 2940円 ( 2011-02-16 )


デザインパターンとかクラスの作り方とか実用的な内容。javascriptの技をもう一段上に引き上げたいプログラマーとか開発者向け。

Scheme手習い

名著、悟りが開ける気がする。

ProductName Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )


簡単な内容から、徐々に難易度を上げていき、コラッツの問題,アッカーマン関数が出てきて最後にY-combinatorという感動すら覚える構成。

手を動かしながら読んでいけるのも楽しい。

追記 11.08.30

入門HTML5は読み物だった。

というわけで、プログラミングコンテストチャレンジブックを挙げておこう

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )