-
Notifications
You must be signed in to change notification settings - Fork 0
/
preprocess.js
104 lines (94 loc) · 2.48 KB
/
preprocess.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
var make_lexer = function(states){
return function(word){
return states[word];
}
};
function number_parser_t(){
this.NUMBERS = {
'zero' : 0,
'one' : 1,
'two' : 2,
'three' : 3,
'four' : 4,
'five' : 5,
'six' : 6,
'seven' : 7,
'eight' : 8,
'nine' : 9,
'ten' : 10,
'eleven' : 11,
'twelve' : 12,
'thirteen' : 13,
'fourteen' : 14,
'fifteen' : 15,
'sixteen' : 16,
'seventeen': 17,
'eighteen' : 18,
'nineteen' : 19,
'twenty' : 20,
'thirty' : 30,
'fourty' : 40,
'fifty' : 50,
'sixty' : 60,
'seventy' : 70,
'eighty' : 80,
'ninty' : 90,
'hundred' : 100,
'thousand' : 1e3,
'million' : 1e6,
'billion' : 1e9,
'trillion' :1e12
};
this.lexer = make_lexer(this.NUMBERS);
}
number_parser_t.prototype.parse = function(words){
var stack = [];
var stack_depth=0;
var last_res = 0;
for(var w of words){
var res = this.lexer(w);
if(res>=100){
var tmp = 0;
for(stack_depth;stack_depth>0;stack_depth--){
tmp += stack.pop();
}
if(tmp==0) tmp=1;
tmp *= res;
stack.push(tmp);
stack_depth = 1;
}
else{
stack.push(res);
if(last_res < 1000)
stack_depth+=1;
}
last_res = res;
}
var total = 0;
while(stack.length!=0){
total += stack.pop();
}
return total;
}
//constant time lookup of a word
number_parser_t.prototype.is_number = function(word){
return word in this.NUMBERS
}
function preprocessor_t(){
this.number_parser = new number_parser_t();
}
preprocessor_t.prototype.preprocess = function(text){
this.text = text.toLowerCase();
this.text = this.text.replace('-',' ');
this.text = this.text.split(' ');
for(var i=0;i<this.text.length;++i){
if(this.number_parser.is_number(this.text[i])){
var j;
for(j=i;j<this.text.length &&this.number_parser.is_number(this.text[j]); ++j){}
this.text.splice(i, j-i,this.number_parser.parse(this.text.slice(i,j)));
}
}
console.log(this.text);
return this.text.join(' ');
}
var pp = new preprocessor_t();