プログラマメモ2 - programmer no memo2

行列の回転 - zip関数!! groovyでやってみた。 2007/08/14
2007/08/18

ありました。


/*
* function name is renamed!!
* original name is transpose.
* this function original implementation
* http://archive.groovy.codehaus.org/user/46B2E788.8040208%40asert.com.au
*/
def zip(Object[] listOfLists) {
def returnValue = []
if ((listOfLists == null) || (listOfLists.size() == 0))
{return returnValue}
def length = listOfLists.collect {item -> item.size()}.min()
for (i in 0..<length) {
def item = []
for (list in listOfLists) {item &lt;< list[i]}
returnValue &lt;< item
}
returnValue
}

def rotateR90(m){
zip(m[2], m[1], m[0])
}

def m = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]

println rotateR90(m);


一応できてるっぽい。

実は、全然オリジナルのコードではないです。
Orz...

以下、説明。


他の人の解答をみていて、zipという関数(メソッド?)への言及をみて、はじめわからず調べていきますと、rubyにはzipというのがありました。

self と引数に渡した配列の各要素からなる配列の配列を生成して返します。生成される配列の要素数は self の要素数です。
Rubyリファレンスマニュアル - Enumerable


collectメソッド、mapメソッドは配列の各要素に対してブロックを実行し、結果を配列で返却します。それぞれ、破壊的メソッドcollect!、map!が用意されています。
逆引きRuby - 配列


で、さらに、groovyを調べていきますと、メーリングリストで、
pythonにzip関数があるがgroovyにそれ相当のものがあるかというものでした。
適当にスレッドをおいかけていきますと、
transposeという関数を実装した人がいましてそれを利用してみました。

というわけで、探す労力だけで、全然、脳力を使っていないOrz...

ちなみに、haskellにもありますね。



いい勉強になりました。

: