Advertisement
Guest User

Untitled

a guest
Apr 27th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 8.80 KB | None | 0 0
  1. use std::collections::HashMap;
  2. use core::iter::Peekable;
  3. use std::hash::{Hash, Hasher};
  4. use std::cmp::Reverse;
  5.  
  6. impl Solution {
  7.     pub fn basic_calculator_iv(expression: String, evalvars: Vec<String>, evalints: Vec<i32>) -> Vec<String> {
  8.         let mut constants = HashMap::new();
  9.        
  10.         for (name, value) in evalvars.into_iter().zip(evalints.into_iter()) {
  11.             constants.insert(name, value);
  12.         }
  13.        
  14.         let mut iter = expression.chars().peekable();
  15.         let mut it = &mut iter;
  16.  
  17.        
  18.         let tokens = parse_tokens(it);
  19.        
  20.         let eval_result = eval(tokens.as_slice(), &constants);
  21.        
  22.         eval_result.output()
  23.     }
  24. }
  25.  
  26. fn parse_tokens<I: Iterator<Item = char>>(it: &mut Peekable<I>) -> Vec<Token> {
  27.     // variable operator variable operator variable
  28.    
  29.    
  30.     let mut tokens = vec![];
  31.    
  32.     let member = parse_member(it).unwrap();
  33.     tokens.push(member);
  34.  
  35.     while let Some(op) = parse_operator(it) {
  36.         tokens.push(Token::Op(op));
  37.         let member = parse_member(it).unwrap();
  38.         tokens.push(member);
  39.     }
  40.  
  41.     tokens
  42. }
  43.  
  44. fn parse_member<I: Iterator<Item = char>>(it: &mut Peekable<I>) -> Option<Token> {
  45.     parse_spaces(it);
  46.  
  47.     if it.peek().copied() == Some('(') {
  48.         it.next();
  49.         let tokens = parse_tokens(it);
  50.         Some(Token::Group(tokens))
  51.     } else {
  52.         let mut variable = String::new();
  53.         while let Some(c) = it.peek().copied() {
  54.             if c.is_alphanumeric() {
  55.                 variable.push(c);
  56.                 it.next();
  57.             } else {
  58.                 break;
  59.             }
  60.         }
  61.  
  62.         if variable.is_empty() {
  63.             None
  64.         } else {
  65.             Some(Token::Var(variable))
  66.         }
  67.     }
  68. }
  69.  
  70. fn parse_operator<I: Iterator<Item = char>>(it: &mut Peekable<I>) -> Option<char> {
  71.     parse_spaces(it);
  72.    
  73.     if it.peek().copied() == Some(')') {
  74.         it.next();
  75.         None
  76.     } else {
  77.         if let Some(c) = it.peek().copied() {
  78.             if c == '+' || c == '-' || c== '*' {
  79.                 it.next();
  80.                 Some(c)
  81.             } else {
  82.                 None
  83.             }
  84.         } else {
  85.             None
  86.         }
  87.     }
  88. }
  89.  
  90. fn parse_spaces<I: Iterator<Item = char>>(it: &mut Peekable<I>) {
  91.     while it.peek().copied() == Some(' ') {
  92.         it.next();
  93.     }
  94. }
  95.  
  96. fn eval(tokens: &[Token], constants: &HashMap<String, i32>) -> Polynomial {
  97.     if tokens.len() == 1 {
  98.         eval_single(&tokens[0], constants)
  99.     } else {
  100.         let mut members = vec![];
  101.         let mut operators = vec![];
  102.        
  103.         for i in 0..tokens.len() {
  104.             if i % 2 == 0 {
  105.                 members.push(eval_single(&tokens[i], constants));
  106.             } else {
  107.                 if let Token::Op(c) = tokens[i] {
  108.                     operators.push(c);
  109.                 } else {
  110.                     panic!()
  111.                 }
  112.             }
  113.         }
  114.  
  115.         let mut new_members = vec![];
  116.         let mut new_operators = vec![];
  117.        
  118.         for op in ['*', '-', '+'].into_iter() {
  119.             {
  120.                 let mut it_mem = members.drain(..);
  121.                 let mut it_op = operators.drain(..);
  122.  
  123.                 new_members.push(it_mem.next().unwrap());
  124.  
  125.                 while let (Some(mem), Some(c)) = (it_mem.next(), it_op.next()) {
  126.                     if c == *op {
  127.                         let a = new_members.pop().unwrap();
  128.                         let b = mem;
  129.  
  130.                         let res = match op {
  131.                             '*' => Polynomial::mult(&a, &b),
  132.                             '+' => Polynomial::add(&a, &b, false),
  133.                             '-' => Polynomial::add(&a, &b, true),
  134.                             _ => panic!()
  135.                         };
  136.  
  137.                         new_members.push(res);
  138.                     } else {
  139.                         new_members.push(mem);
  140.                         new_operators.push(c);
  141.                     }
  142.  
  143.                 }
  144.             }
  145.  
  146.             std::mem::swap(&mut members, &mut new_members);
  147.             std::mem::swap(&mut operators, &mut new_operators);
  148.  
  149.         }
  150.  
  151.         assert!(operators.is_empty());
  152.         assert!(members.len() == 1);
  153.  
  154.         members.into_iter().next().unwrap()
  155.  
  156.     }
  157. }
  158.  
  159. fn eval_single(token: &Token, constants: &HashMap<String, i32>) -> Polynomial {
  160.     match token {
  161.         Token::Var(variable) => {
  162.             let constant = constants.get(variable).copied();
  163.             let num: Option<i32> = variable.parse().ok();
  164.            
  165.             let mut poly = Polynomial::new();
  166.            
  167.             if let Some(num) = num.or(constant) {
  168.                 let mono = Monomial::new();
  169.                 poly.set_member(mono, num);
  170.             } else {
  171.                 let mut mono = Monomial::new();
  172.                 mono.set_member(variable.clone(), 1);
  173.                 poly.set_member(mono, 1);
  174.             }
  175.            
  176.             poly
  177.         },
  178.         Token::Group(tokens) => {
  179.             eval(tokens.as_slice(), constants)
  180.         },
  181.         _ => { panic!() }
  182.     }
  183. }
  184.  
  185. #[derive(Debug, Eq, PartialEq, Clone)]
  186. struct Monomial{
  187.     members: HashMap<String, i32>,
  188. }
  189.  
  190.  
  191. impl Monomial {
  192.     fn new() -> Self {
  193.         Self {
  194.             members: HashMap::new(),
  195.         }
  196.     }
  197.    
  198.     fn set_member(&mut self, name: String, coefficient: i32) {
  199.         if coefficient == 0 {
  200.             return;
  201.         }
  202.  
  203.         let ret = self.members.insert(name, coefficient);
  204.         assert!(ret.is_none());
  205.     }
  206.    
  207.     fn multiply(m1: &Monomial, m2: &Monomial) -> Self {
  208.         let mut result = m1.clone();
  209.        
  210.         for (variable, coefficient) in m2.members.iter() {
  211.             let cnt = result.members.entry(variable.clone()).or_insert(0);
  212.             *cnt+= coefficient;
  213.         }
  214.        
  215.         result
  216.     }
  217.    
  218.     fn output(&self) -> (i32, Vec<String>, String) {
  219.         let mut degree = 0;
  220.         let mut vars = vec![];
  221.         let mut result = String::new();
  222.        
  223.         let mut members: Vec<_> = self.members.iter().collect();
  224.         members.sort();
  225.        
  226.         for (var, coeff) in members {
  227.             for _ in 0..*coeff {
  228.                 vars.push(var.clone());
  229.  
  230.                 result.push('*');
  231.                 result.push_str(var);
  232.             }
  233.             degree += coeff;
  234.         }
  235.        
  236.         (degree, vars, result)
  237.     }
  238.  
  239. }
  240.  
  241. impl Hash for Monomial {
  242.     fn hash<H: Hasher>(&self, state: &mut H) {
  243.         let mut pairs: Vec<_> = self.members.iter().collect();
  244.         pairs.sort();
  245.        
  246.         for (k,v) in pairs {
  247.             k.hash(state);
  248.             v.hash(state);
  249.         }
  250.     }
  251. }
  252.  
  253.  
  254.  
  255. #[derive(Debug, Clone)]
  256. struct Polynomial {
  257.     members: HashMap<Monomial, i32>,
  258. }
  259.  
  260. impl Polynomial {
  261.     fn new() -> Self {
  262.         Self {
  263.             members: HashMap::new(),
  264.         }
  265.     }
  266.    
  267.     fn set_member(&mut self, member: Monomial, coefficient: i32) {
  268.         if coefficient == 0 {
  269.             return;
  270.         }
  271.         let ret = self.members.insert(member, coefficient);
  272.         assert!(ret.is_none());
  273.     }
  274.    
  275.     fn add(p1: &Polynomial, p2: &Polynomial, subtract: bool) -> Polynomial {
  276.         let mut result = p1.clone();
  277.        
  278.         let mut op = if subtract {-1} else {1};
  279.        
  280.         for (mono, coefficient) in p2.members.iter() {
  281.             let cnt = result.members.entry(mono.clone()).or_insert(0);
  282.             *cnt+= op * coefficient;
  283.            
  284.             if *cnt == 0 {
  285.                 result.members.remove(mono);
  286.             }
  287.         }
  288.        
  289.         result
  290.     }
  291.    
  292.     fn mult(p1: &Polynomial, p2: &Polynomial) -> Polynomial {
  293.         let mut result = Self::new();
  294.        
  295.         let p1: Vec<_> = p1.members.iter().collect();
  296.         let p2: Vec<_> = p2.members.iter().collect();
  297.        
  298.         for (m1, coeff1) in p1.iter() {
  299.             for (m2, coeff2) in p2.iter() {
  300.                 let m = Monomial::multiply(m1, m2);
  301.                 let coeff = *coeff1 * *coeff2;
  302.                
  303.                 let mut p = Self::new();
  304.                 p.set_member(m, coeff);
  305.                
  306.                 result = Self::add(&result, &p, false);
  307.             }
  308.         }
  309.        
  310.         result
  311.     }
  312.    
  313.     fn output(&self) -> Vec<String> {
  314.         let mut parts = vec![];
  315.        
  316.         for (mono, coeff) in self.members.iter() {
  317.             let (degree, vars, mut out) = mono.output();
  318.             out = coeff.to_string() + &out;
  319.            
  320.             parts.push((Reverse(degree), vars, out));
  321.         }
  322.        
  323.         parts.sort();
  324.        
  325.         parts.into_iter().map(|(_, _, out)| out).collect()
  326.     }
  327. }
  328.  
  329. #[derive(Debug, Eq, PartialEq)]
  330. enum Token {
  331.     Var (String),
  332.     Op(char),
  333.     Group(Vec<Token>)
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement