2019. The Score of Students Solving Math Expression
Description
You are given a string s
that contains digits 0-9
, addition symbols '+'
, and multiplication symbols '*'
only, representing a valid math expression of single digit numbers (e.g., 3+5*2
). This expression was given to n
elementary school students. The students were instructed to get the answer of the expression by following this order of operations:
- Compute multiplication, reading from left to right; Then,
- Compute addition, reading from left to right.
You are given an integer array answers
of length n
, which are the submitted answers of the students in no particular order. You are asked to grade the answers
, by following these rules:
- If an answer equals the correct answer of the expression, this student will be rewarded
5
points; - Otherwise, if the answer could be interpreted as if the student applied the operators in the wrong order but had correct arithmetic, this student will be rewarded
2
points; - Otherwise, this student will be rewarded
0
points.
Return the sum of the points of the students.
Example 1:
Input: s = "7+3*1*2", answers = [20,13,42] Output: 7 Explanation: As illustrated above, the correct answer of the expression is 13, therefore one student is rewarded 5 points: [20,13,42] A student might have applied the operators in this wrong order: ((7+3)*1)*2 = 20. Therefore one student is rewarded 2 points: [20,13,42] The points for the students are: [2,5,0]. The sum of the points is 2+5+0=7.
Example 2:
Input: s = "3+5*2", answers = [13,0,10,13,13,16,16] Output: 19 Explanation: The correct answer of the expression is 13, therefore three students are rewarded 5 points each: [13,0,10,13,13,16,16] A student might have applied the operators in this wrong order: ((3+5)*2 = 16. Therefore two students are rewarded 2 points: [13,0,10,13,13,16,16] The points for the students are: [5,0,0,5,5,2,2]. The sum of the points is 5+0+0+5+5+2+2=19.
Example 3:
Input: s = "6+0*1", answers = [12,9,6,4,8,6] Output: 10 Explanation: The correct answer of the expression is 6. If a student had incorrectly done (6+0)*1, the answer would also be 6. By the rules of grading, the students will still be rewarded 5 points (as they got the correct answer), not 2 points. The points for the students are: [0,0,5,0,0,5]. The sum of the points is 10.
Constraints:
3 <= s.length <= 31
s
represents a valid expression that contains only digits0-9
,'+'
, and'*'
only.- All the integer operands in the expression are in the inclusive range
[0, 9]
. 1 <=
The count of all operators ('+'
and'*'
) in the math expression<= 15
- Test data are generated such that the correct answer of the expression is in the range of
[0, 1000]
. n == answers.length
1 <= n <= 104
0 <= answers[i] <= 1000
Solution
the-score-of-students-solving-math-expression.py
class Solution:
def scoreOfStudents(self, s: str, A: List[int]) -> int:
c = collections.Counter(A)
n = len(s) // 2 + 1
res = [[set() for _ in range(n)] for j in range(n)]
for i in range(n):
res[i][i].add(int(s[2 * i]))
for dif in range(1, n):
for start in range(n - dif):
end = start + dif
curset = set()
for i in range(start * 2 + 1, end * 2, 2):
if s[i] == "+":
for a in res[start][i // 2]:
for b in res[i // 2 + 1][end]:
if a + b <= 1000:
curset.add(a + b)
else:
for a in res[start][i // 2]:
for b in res[i // 2 + 1][end]:
if a * b <= 1000:
curset.add(a * b)
res[start][end] = curset
ans = 0
crt = eval(s)
for i in res[0][-1]:
if i in c:
if i == crt:
ans += 5 * c[i]
else:
ans += 2 * c[i]
return ans