@@ -8,14 +8,26 @@ if (!Array.prototype.flatMap) {
88// carterian products
99export const cart = ( ...args ) => args . reduce ( ( xs , a ) => xs . flatMap ( xsi => a . map ( ai => [ ...xsi , ai ] ) ) , [ [ ] ] ) ;
1010
11+ const dist1 = ( c1 , c2 ) => ( c1 [ 0 ] - c2 [ 0 ] ) ** 2 ;
1112const dist2 = ( c1 , c2 ) => ( c1 [ 0 ] - c2 [ 0 ] ) ** 2 + ( c1 [ 1 ] - c2 [ 1 ] ) ** 2 ;
1213const dist3 = ( c1 , c2 ) => ( c1 [ 0 ] - c2 [ 0 ] ) ** 2 + ( c1 [ 1 ] - c2 [ 1 ] ) ** 2 + ( c1 [ 2 ] - c2 [ 2 ] ) ** 2 ;
1314const distk = ( c1 , c2 ) => c1 . map ( ( _ , i ) => ( c1 [ i ] - c2 [ i ] ) ** 2 ) . reduce ( ( a , b ) => a + b ) ;
1415
16+ const eq1 = ( c1 , c2 ) => c1 [ 0 ] === c2 [ 0 ] ;
1517const eq2 = ( c1 , c2 ) => c1 [ 0 ] === c2 [ 0 ] && c1 [ 1 ] === c2 [ 1 ] ;
1618const eq3 = ( c1 , c2 ) => c1 [ 0 ] === c2 [ 0 ] && c1 [ 1 ] === c2 [ 1 ] && c1 [ 2 ] === c2 [ 2 ] ;
1719const eqk = ( c1 , c2 ) => c1 . every ( ( _ , i ) => c1 [ i ] && c2 [ i ] ) ;
1820
21+ const buildTree1 = ( depth , n = 0 ) =>
22+ n >= depth
23+ ? { n, items : [ ] }
24+ : {
25+ n,
26+ items : [ ] ,
27+ '0' : buildTree1 ( depth , n + 1 ) ,
28+ '1' : buildTree1 ( depth , n + 1 ) ,
29+ } ;
30+
1931const buildTree2 = ( depth , n = 0 ) =>
2032 n >= depth
2133 ? { n, items : [ ] }
@@ -56,7 +68,20 @@ export const ktree = k => {
5668
5769 let buildTree ;
5870 let getNeighbors ;
59- if ( k === 2 ) {
71+ if ( k === 1 ) {
72+ buildTree = buildTree1 ;
73+ getNeighbors = ( [ x ] , N ) => {
74+ const nodes = [ ] ;
75+ for ( let i = 0 ; i < NS . length ; i ++ ) {
76+ const X = x + NS [ i ] [ 0 ] ;
77+ if ( X >= 0 && X < N ) {
78+ nodes . push ( [ X ] ) ;
79+ }
80+ }
81+ return nodes ;
82+ } ;
83+ }
84+ else if ( k === 2 ) {
6085 buildTree = buildTree2
6186 getNeighbors = ( [ x , y ] , N ) => {
6287 const nodes = [ ] ;
@@ -106,8 +131,8 @@ export const ktree = k => {
106131 } ;
107132 }
108133
109- const eq = k === 2 ? eq2 : k === 3 ? eq3 : eqk ;
110- const dist = k === 2 ? dist2 : k === 3 ? dist3 : distk ;
134+ const eq = k === 2 ? eq2 : k === 3 ? eq3 : k === 1 ? eq1 : eqk ;
135+ const dist = k === 2 ? dist2 : k === 3 ? dist3 : k === 1 ? dist1 : distk ;
111136
112137 return class KTree {
113138 constructor ( items = [ ] , { length = 8 , depth = 4 , key = 'coords' , transform = x => x } = { } ) {
0 commit comments