Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมคำนวณสูตรใน Spreadsheet แบบ Excel ใน Python

มีเมทริกซ์ 2 มิติแทน Spreadsheet เซลล์อาจเป็นค่า ตำแหน่งอ้างอิงหรือสูตร (ขึ้นต้นด้วย =) ต้องคำนวณให้ได้ค่าจริงทั้งเมทริกซ์

ตัวอย่าง:

B170
35=A1+A2
→
770
3510

แนวทาง (Recursive Evaluation with Memoization)

  1. resolve(s): แปลงสตริงเป็นค่า (ถ้าเป็นตัวเลขคืนเลข, ถ้าเป็น reference เรียก solve)
  2. getIdx(s): แปลง "A1" → [0, 0] (row, col)
  3. do(a, b, op): คำนวณ + - * /
  4. solve(i, j): คำนวณเซลล์ (i,j) แบบ recursive

ตัวอย่างโค้ด

class Solution:
    def solve(self, matrix):
        def resolve(s):
            try:
                return int(s)
            except:
                return solve(*getIdx(s))
        
        def getIdx(s):
            return [int(s[1:]) - 1, ord(s[0]) - ord("A")]
        
        def do(a, b, op):
            if op == "+": return a + b
            if op == "-": return a - b
            if op == "*": return a * b
            if op == "/": return a / b
        
        def solve(i, j):
            try:
                return int(matrix[i][j])
            except:
                s = matrix[i][j]
                if s[0] == "=":
                    for c in s[2:]:
                        if c in "+-*/":
                            op = c
                            break
                    a, b = s[1:].split(op)
                    aRes, bRes = resolve(a), resolve(b)
                    return do(aRes, bRes, op)
                else:
                    return solve(*getIdx(s))
        
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                matrix[i][j] = str(solve(i, j))
        return matrix

ob = Solution()
matrix = [["B1", "7", "0"], ["3", "5", "=A1+A2"]]
print(ob.solve(matrix))
# [['7', '7', '0'], ['3', '5', '10']]

อินพุต

[["B1", "7", "0"], ["3", "5", "=A1+A2"]]

เอาต์พุต

[['7', '7', '0'], ['3', '5', '10']]