File tree 1 file changed +9
-8
lines changed
scripts/algorithms/P/Parse Lisp Expression
1 file changed +9
-8
lines changed Original file line number Diff line number Diff line change
1
+ // Runtime: 149 ms (Top 25.00%) | Memory: 46.7 MB (Top 37.50%)
1
2
/**
2
3
* @param {string } expression
3
4
* @return {number }
4
5
*/
5
6
var evaluate = function ( expression ) {
6
- return helper ( expression ) ;
7
+ return helper ( expression ) ;
7
8
} ;
8
9
9
10
const helper = ( expr , map = { } ) => {
10
11
if ( expr [ 0 ] !== '(' )
11
12
return / [ 0 - 9 ] | - / . test ( expr [ 0 ] ) ? + expr : map [ expr ] ;
12
-
13
+
13
14
map = Object . assign ( { } , map ) ;
14
15
const start = expr [ 1 ] === 'm' ? 6 : 5 ;
15
16
const tokens = parse ( expr . slice ( start , expr . length - 1 ) ) ;
16
-
17
+
17
18
if ( expr . startsWith ( '(m' ) ) return helper ( tokens [ 0 ] , map ) * helper ( tokens [ 1 ] , map ) ;
18
19
if ( expr . startsWith ( '(a' ) ) return helper ( tokens [ 0 ] , map ) + helper ( tokens [ 1 ] , map ) ;
19
-
20
+
20
21
for ( let i = 0 ; i < tokens . length - 2 ; i += 2 )
21
22
map [ tokens [ i ] ] = helper ( tokens [ i + 1 ] , map ) ;
22
-
23
+
23
24
return helper ( tokens . at ( - 1 ) , map ) ;
24
25
}
25
26
26
27
const parse = expr => {
27
28
const tokens = [ ] ;
28
29
let [ builder , par ] = [ '' , 0 ] ;
29
-
30
+
30
31
for ( let ch of expr ) {
31
32
if ( ch === '(' ) par ++ ;
32
33
if ( ch === ')' ) par -- ;
@@ -36,6 +37,6 @@ const parse = expr => {
36
37
}
37
38
else builder += ch ;
38
39
}
39
-
40
+
40
41
return builder ? [ ...tokens , builder ] : tokens ;
41
- }
42
+ }
You can’t perform that action at this time.
0 commit comments