木の統合(SchemeをJavaScriptに移植した)
ktkreaderでアンカの親子関係を木構造にするのに使っています。
元コードはWiliki:Scheme:リスト処理
1:名無し
hoge
2:名無し
>>1 乙
3:名無し
>>1 乙
4:名無し
>>2 グッジョブ
5:名無し
>>2 グッジョブ
6:名無し
>>3 うむ >>4 おkw
7:名無し
>>3 うむ
8:名無し
>>4 おkw
9:名無し
>>4 おkw
10:名無し
>>5 神w
//tree_merge([[0,1,2],[1,3,4],[2,5,6],[3,7,5,8],[4,9]]); //outputs: // [[0, // [1, // [3, // [7], // [5], // [8]], // [4, // [9]]], // [2, // [5], // [6]]]] function tree_merge(relations) { function pick(node,trees,relations) { var a = relations.partition(function(r) {return (node == r[0])}); var picked = a[0], rest = a[1]; if (picked.length == 0) { var b = trees.partition(function(t) {return (node == r[0])}); var subtree = b[0],other_trees = b[1]; if (subtree.length == 0) { return [[node],trees,relations]; } else { return [subtree[0],other_trees,relations]; } } else { var b = merge_fold(picked[0].slice(1),[],trees,rest); var subtrees = b[0], trees = b[1], relations=b[2]; subtrees.unshift(node); return [subtrees, trees, relations]; } }; function merge_fold(kids,subtrees,trees,relations) { if (kids.length == 0) { return [subtrees.reverse(), trees, relations]; } else { var a = pick(kids[0],trees,relations); var subtree = a[0],trees = a[1],relations = a[2]; subtrees.unshift(subtree); return merge_fold(kids.slice(1),subtrees,trees,relations); } }; function merge(trees,relations) { if (relations.length == 0) { return trees; } else { var a = pick(relations[0][0],trees,relations); var subtree = a[0], trees = a[1], relations = a[2]; trees.push(subtree); return merge(trees,relations); } }; return merge([],relations); }