テーブル作るぞ
0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|r==[]?r.push(a):a.each_with_index{|v,i|i==0?r.push(v):puts([r[0][i],r[-1],v].join(","))};r} t1,A,1 t2,A,2 t3,A,3 t1,B,4 t2,B,5 t3,B,6 t1,C,7 t2,C,8 t3,C,9 => [["label", "t1", "t2", "t3"], "A", "B", "C"]
うーん、こうなってくると返値を答えにしたくなるな。
irb(main):008:0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|r==[]?r.push(a):a.each_with_index{|v,i|i==0?r.push(v):i==1?r.push([v]):r.push(r.pop.push(v))};r} => [["label", "t1", "t2", "t3"], "A", [1, 2, 3], "B", [4, 5, 6], "C", [7, 8, 9]] irb(main):009:0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|a.each_with_index{|v,i|i==0?r.push(v):i==1?r.push([v]):r.push(r.pop.push(v))};r} => ["label", ["t1", "t2", "t3"], "A", [1, 2, 3], "B", [4, 5, 6], "C", [7, 8, 9]]
だめだ。
行列で言えば
[[行名1,0],[0行名2]]x[[a,b],[c,d]]x[[列名1,0],[0,列名2]]
というアルゴリズムまでわかったがrubyの行列は文字列が扱えない。
複数の配列 -> 合成された配列 はあるけど 合成された配列-> 複数の配列 はむずかしいな。
unzipか。
基本アルゴリズムは 先頭行を全部の行と zipして先頭行を削除で各要素を先頭要素と演算すればいいはず。
一つのストリームを複数のストリームに分割するってのはあり得ないのか?
unzipは対称に分割するもんなー