第14回granpark.rb出題問題「少林寺秘棍房弟子のたかしくん 」

granpark.rb、久々のアルゴリズムペアプロ回で出題した問題です。

この問題はTopCoder SRM481 Div2 Level3の問題を改題して作っております。
たまには問題真正面からの幅優先・深さ探索ではなく、
イナリサーチとか使う問題出したいな、と思ってこの問題を出題しました。

次回のgranpark.rbはR言語とかについて話してくれそうな人に声かけてみようかと思ってます。

第11回granpark.rb出題問題「迷路職人の朝は早い」

久々にペアプロの課題。

指定された大きさの迷路を作れ、というのが問題の趣旨。
一応迷路の要件はつくったのですが、


#<#############
#.............#
#.#.#.#.#.#.#.#
#.............#
#.#.#.#.#.#.#.#
#.............#
#.#.#.#.#.#.#.#
#.............#
#.#.#.#.#.#.#.#
#.............#
#############>#

みたいな「迷路」を作られるのもやだなー、と思って評価関数を一応設定しました。
でも


#<##############
#..............#
##############.#
#..............#
#.##############
#..............#
##############.#
#..............#
#.##############
#..............#
##############>#

みたいな迷路を出力をするチームがいたのであんまり意味がなかったかもしれないです。
迷路の評点って難しい。

第0回granpark.rbで出題された、「あみだくじを作れ」みたいな
ふわっとした課題を出そうとおもったんですが、
1時間半じゃ短すぎましたね。。。

結局今回は全員方針発表だけで終わってしまいました。
いろいろ反省です。

正直、評価関数部分だけで出題しても良かったかもしれません...。

指定したファイルの更新があったらコマンドを自動実行するシェルスクリプト

プログラミングの作業をしていると、一旦コンパイルや実行を行なって結果を確認したくなることがあります。

C++Javaであればコンパイル -> 実行が必要ですし、rspecのようなコマンドでテストを行いたい場合もあると思います。

その度にエディタを終了-> (コンパイル実行 ->) 実行 -> またエディタを起動とかするのはとても手間です。(エディタ内でコンパイルとかするもありますが、それでも何らかのコマンドが必要です)

そこで、特定のファイルを監視下に入れてそのファイルの更新があったら指定されたコマンドを実行するようなシェルスクリプトを作ってみました。

#!/bin/sh
if [ $# -ne 2 ]; then
        echo "実行するには2個の引数が必要です。
        第一引数: 監視対象ファイル名
        第二引数: 監視対象ファイルが更新された際に実行されるコ>マンド
        例: ./autoexec.sh a.cpp 'g++ a.cpp && ./a.cpp'"
        exit 1
fi
echo "監視対象 $1"
echo "実行コマンド $2"
INTERVAL=1 #監視間隔, 秒で指定
last=`ls --full-time $1 | awk '{print $6"-"$7}'`
while true; do
        sleep $INTERVAL
        current=`ls --full-time $1 | awk '{print $6"-"$7}'`
        if [ $last != $current ] ; then
                echo ""
                echo "updated: $current"
                last=$current
                eval $2
        fi
done

第一引数で監視するファイルを第一引数で指定、第二引数に"javac a.cpp"のように実行したいコマンドを指定してください。

第一引数の監視対象ファイルに更新があると第二引数がトリガされます。
screenなんかで画面を分割して片側に表示させたりするといいかもしれません。

Mac (BSD) で使う場合、lsの引数体系がすこし違うので、こちらが使えます

#!/bin/sh
if [ $# -ne 2 ]; then
        echo "実行するには2個の引数が必要です。
        第一引数: 監視対象ファイル名
        第二引数: 監視対象ファイルが更新された際に実行されるコ>マンド
        例: ./autoexec.sh a.cpp 'g++ a.cpp && ./a.cpp'"
        exit 1
fi
echo "監視対象 $1"
echo "実行コマンド $2"
INTERVAL=1 #監視間隔, 秒で指定
last=`ls -l -T $1 | awk '{print $8}'`
while true; do
        sleep $INTERVAL
        current=`ls -l -T $1 | awk '{print $8}'`
        if [ $last != $current ] ; then
                echo ""
                echo "updated: $current"
                last=$current
                eval $2
        fi
done

不具合とかあったらご指摘ください。

第8回granpark.rb出題問題「銀将ご乱心」

恒例になってきたペアプロ課題出題。
今回は将棋の銀の動きがテーマです(、が問題設定自体は将棋のルールからだいぶ逸脱してます。)

スライドの解法は適切に切り分けることで問題を経路の場合の数を数え上げに
落としこむ感じです。

解法の補助線として1の場合の数を先に求めるようにするのもありだったかもしれません。

参加された各チームのコードはこちら
(Githubのお作法練習も兼ねて、branch -> 解けたらpush -> pullでやることにしました)

多分もっと良い解き方があるぜ!って人はぜひPULLリクエストを送ってください。

余談ですが、勉強会の最中、「コマ=インスタンス」とか「ショーギ=ボード」とか「アヴェイラブル=ギン」とかいう言葉が聞こえてきて、ニンジャめいた奥ゆかしいアトモスフィアを感じました。

//追記
答えは0.398%弱になるようです。
上記スライドを実装した回答コードはこんな感じです。
https://github.com/mizti/crazy_gin/blob/miz_answer_temp/a.cpp

2013/1/11 第6回 granpark.rb 「けちなペンキ屋」

新年あけまして、最初の勉強会。

今回の問題はこんな感じ。

解答例はかなり力任せでO(n^4)近くまで時間のかかるダメな感じの例ですが、
参加者の皆さんがO(n^2)で解ける良い感じの回答を出してくれました。
(1<=n<=50なのでn^2は十分実用です)

皆さんの回答例は下記に上げてもらってます。
https://github.com/granparkrb/paint

2012年12月第4回granpark.rb 「山本山の野望」

12月の勉強会で出した課題と回答。

1問目は(1)回文判定と、(2)与えられた文に+αして最短の回文にするっていう内容。
(2)をいろいろな書き方をする人が多くて面白かった。

2問目は与えられたマップから島(コロニー)の数を数える、という問題。
勉強会の時間内では1問目でタイムアップのチームが多かったけど、
勉強会時間外のタイミングで解いてきてくれた人もいました。
解答例はDFS(深さ優先探索)です。

2012/11/16 第2回granpark.rb 「ポーの惑星」

社内勉強会で、ペアプログラミングでアルゴリズムの問題を解いてみよう!っていう
試みがあったのでこんな問題を作った。

解答例はこちら

見る人が見ればすぐわかるように、(逆じゃない)ポーランド記法を
処理しましょう、って旨。
上記のように、逆から読んでいってスタックで処理する...を
想定してたんだけど制限時間内に構文解析をちゃんと書いてきたチームが複数あって
びっくりした。

作問する側としても想定外の解き方が出てきて面白いので、
次週以降も続けたいところ。