diff --git a/regexp.py b/regexp.py --- a/regexp.py +++ b/regexp.py @@ -419,15 +419,14 @@ class RegexpDFA: combined_alphabet = set(self.alphabet_index.keys()) | set(alphabet_index.keys()) combined_index = {c: i for (i, c) in enumerate(sorted(combined_alphabet))} - conversion_index = {v: combined_index[k] for (k, v) in self.alphabet_index.items()} + conversion_index = {combined_index[k]: v for (k, v) in self.alphabet_index.items()} n2 = len(combined_alphabet) - rules = [] - for i in range(0, len(self.rules), n1): - row = ([m]*n2) - for (j, st) in enumerate(self.rules[i:i+n1]): - row[conversion_index[j]] = st - rules.extend(row) + rules = [ + self.rules[i*n1 + conversion_index[j]] + if j in conversion_index else m + for i in range(m) for j in range(n2) + ] rules.extend([m]*n2) return RegexpDFA(rules, self.end_states, combined_index).reduce().normalize() diff --git a/src/regexp.rs b/src/regexp.rs --- a/src/regexp.rs +++ b/src/regexp.rs @@ -298,18 +298,17 @@ impl RegexpDFA { let mut combined_vec = Vec::from_iter(combined_alphabet.into_iter()); combined_vec.sort(); let combined_index = HashMap::from_iter(combined_vec.iter().enumerate().map(|(i, c)| (*c, i))); - let conversion_index: HashMap<usize, usize> = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (*v, combined_index[k]))); + let conversion_index: HashMap<usize, usize> = HashMap::from_iter(self.alphabet_index.iter().map(|(k, v)| (combined_index[k], *v))); let n2 = combined_vec.len(); - let mut rules = vec![]; - for i in 0..m { - let mut row = vec![m;n2]; - for (j, st) in self.rules[i*n1..(i+1)*n1].iter().enumerate() { - row[conversion_index[&j]] = *st; + let rules: Vec<usize> = (0..m*n2).map( + |i| { + let (j, k) = (i/n2, i%n2); + return if conversion_index.contains_key(&k) { + self.rules[j*n1 + conversion_index[&k]] + } else {m}; } - rules.append(&mut row); - } - rules.append(&mut vec![m;n2]); + ).chain(std::iter::repeat(m).take(n2)).collect(); return RegexpDFA{rules, end_states: self.end_states.clone(), alphabet_index: combined_index}.reduce().normalize(); }