社内で『実践コーディング勉強会』を開催した


昨日の業務後、社内で勉強会を開催しました。
内容は一つのお題を制限時間内に参加者全員でコーディングをするというもの。
使用するプログラミング言語は参加者の自由です。


制限時間終了後は何人かのプログラムをピックアップしてプロジェクターに映し、発表およびレビュー。


お題はネット上の
どう書く.org, anarchy golf, Project Euler
などの問題集サイトから適当に拾ってきたものを使います。


第1回目となる今回のお題は以下の2問。

入力された行列の転置行列を求めなさい。
「入力例」

1 2 3
4 5 6
7 8 9

「出力例」
1 4 7
2 5 8
3 6 9


出展元
http://vipprog.net/wiki/exercise.html
次のような書式で与えられた「あみだくじ」があります。
(あみだくじはコード中に埋め込んでも、標準入力や
外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。


出展元 どう書く?org
http://ja.doukaku.org/


どちらも面白い問題でした。
短いプログラムではありますが、頭の体操にもなるし、何より楽しいので今後も定期的に続けていこうと思います。


参加者の中にはActionScriptを使って実装してる人もいてGUIを作るのに一番苦労してたみたいです。
そこに意味はあるのでしょうか。。。



ちなみに私がコード書いたコードは以下


1問目(ruby)

str =<<EOS
1 2 3
4 5 6
7 8 9
EOS

str2 =<<EOS
1 2 3 4
5 6 7 8
EOS

def rotate(str)
  # 入力を表示
  puts str

  # [[1,2,3],[4,5,6]] のような2次元配列にする
  rows = str.split(/\n/).map {|row|
    row.split(/\s/)
  }

  # 空行を表示
  puts ""

  # 出力を表示
  (0...rows[0].length).each {|i|
    puts rows.map{|r| r[i] }.join(" ")
  }
end

# 処理実行
rotate str2

2問目(javascript)

var str = "";
str =  "A B C D E\n";
str += "| | |-| |\n";
str += "|-| | |-|\n";
str += "| |-| |-|\n";
str += "|-| |-| |\n";
str += "|-| | | |";

function swap(ary, f, t) {
    var tmp = ary[f];
    ary[f] = ary[t];
    ary[t] = tmp;
    return ary;
}


var lines = str.split(/\n/);
var result = lines[0].split(/[\s]/);
for(var i = 0; i < lines.length; i++) {
    print(lines[i]);
    var cols = lines[i].split(/[|]/);

    for(var j = 0; j < cols.length; j++) {
	if(cols[j] == "-") {
	    result = swap(result, j-1, j);
        }
    }
}

print(result.join(" "));