【招聘】Readme
欢迎来到编程笔试
在这个笔试题目里,你将着手编写一个实现一些简易功能的Excel。
本笔试题目为测试驱动,即:全部笔试题由20个测试案例组成,其对应文件位于/test/model/目录下。其中,test_spreadsheet1.py包含5个,test_spreadsheet2.py包含10个,test_spreadsheet3.py包含5个,为了通过上述这20个测试案例,你需要逐步完善位于/src/model/目录下的spreadsheet.py文件的代码。
请你尽可能多的完善Excel的功能来满足测试案例。你不需要完成全部案例,只需要在规定的2小时内通过尽可能多的测试案例即可。
请从第一个测试文件的第一个测试用例开始,逐步增添、重构excel的函数功能。测试案例的难度是从简到难。 如果你记不住某个内置函数库的用法,你可以上网进行查找,但是不可以和其他人进行协商。
用到的技术
关于该Excel对象的基本功能介绍
该Excel只有一行。列数为A到Z,AA到ZZ等。没有储值的列数默认存储值为空字符串。
- get(column: str), 该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get(“A1”)应返回"10"。
- getLiteral(column: str), 该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral(“A1”)应返回"=7+3"。
- put(column: str, value: str), 该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。
以下是给定的代码
/src/model/spreadsheet.py
class Sheet:
def get(self, column: str):
"""
该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get("A1")应返回"10"。
:param column: 列数
:return: 该列存储的值,默认为空字符串
"""
raise NotImplementedError("Not implemented!")
def getLiteral(self, column:str):
"""
该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral("A1")应返回"=7+3"。
:param column: 列数
:return: 该列存储的字符串值,默认为空字符串
"""
raise NotImplementedError("Not implemented!")
def put(self, column: str, value: str):
"""
该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。
:param column: 列数
:param value: 在该列需要存储的值
"""
raise NotImplementedError("Not implemented!")
/test/model/test_spreadsheet1.py
import unittest
from src.model.spreadsheet import Sheet
class SpreadsheetTestUnit1(unittest.TestCase):
def test_that_cells_are_empty_by_default(self):
"""
每列默认值为空字符串
"""
sheet = Sheet()
self.assertEqual("", sheet.get("A"))
self.assertEqual("", sheet.get("ZX"))
def test_that_text_cells_are_stored(self):
"""
Excel可以正确地存储put的值
"""
sheet = Sheet()
cell = 'A'
sheet.put(cell, "A string")
self.assertEqual("A string", sheet.get(cell))
sheet.put(cell, "A different string")
self.assertEqual("A different string", sheet.get(cell))
sheet.put(cell, "")
self.assertEqual("", sheet.get(cell))
def test_that_many_cells_exist(self):
"""
Excel可以正确地覆盖之前的值
"""
sheet = Sheet()
sheet.put("A", "First")
sheet.put("X", "Second")
sheet.put("ZX", "Third")
self.assertEqual("First", sheet.get("A"), "A")
self.assertEqual("Second", sheet.get("X"), "X")
self.assertEqual("Third", sheet.get("ZX"), "ZX")
sheet.put("A", "Fourth")
self.assertEqual("Fourth", sheet.get("A"), "A after")
self.assertEqual("Second", sheet.get("X"), "X same")
self.assertEqual("Third", sheet.get("ZX"), "ZX same")
def test_that_numeric_cells_are_identified_and_stored(self):
"""
Excel可以正确识别纯数字,对于纯数字,将多余的空格去掉。
"""
sheet = Sheet()
cell = 'A'
sheet.put(cell, "X99")
self.assertEqual("X99", sheet.get(cell))
sheet.put(cell, "14")
self.assertEqual("14", sheet.get(cell))
sheet.put(cell, " 99 X")
self.assertEqual(" 99 X", sheet.get(cell))
sheet.put(cell, " 1234 ")
self.assertEqual("1234", sheet.get(cell))
sheet.put(cell, " ")
self.assertEqual(" ", sheet.get(cell))
def test_that_we_have_access_to_cell_literal_values_for_editing(self):
"""
getLiteral需要返回未处理的纯字符串。
"""
sheet = Sheet()
cell = 'A'
sheet.put(cell, "Some string")
self.assertEqual("Some string", sheet.getLiteral(cell))
sheet.put(cell, " 1234 ")
self.assertEqual(" 1234 ", sheet.getLiteral(cell))
sheet.put(cell, "=7")
self.assertEqual("=7", sheet.getLiteral(cell))
/test/model/test_spreadsheet2.py
import unittest
from src.model.spreadsheet import Sheet
class SpreadsheetTestUnit2(unittest.TestCase):
def test_formula_spec(self):
"""
对于格式不正确的等式(前面多了一个空格), Excel应该不予识别。
"""
sheet = Sheet()
sheet.put("B", " =7")
self.assertEqual(" =7", sheet.get("B"), "Not a formula")
self.assertEqual(" =7", sheet.getLiteral("B"), "Unchanged")
def test_constant_formula(self):
"""
Excel应该正确识别等式
"""
sheet = Sheet()
sheet.put("A", "=7")
self.assertEqual("=7", sheet.getLiteral("A"), "Formula")
self.assertEqual("7", sheet.get("A"), "Value")
def test_parentheses(self):
"""
Excel应该正确识别包含括号的等式
"""
sheet = Sheet()
sheet.put("A", "=(7)")
self.assertEqual("7", sheet.get("A"), "Parenthesis")
def test_deep_parentheses(self):
"""
Excel应该正确识别包含很多括号的等式
"""
sheet = Sheet()
sheet.put("A", "=((((10))))")
self.assertEqual("10", sheet.get("A"), "Parenthesis")
def test_multiply(self):
"""
Excel应该正确计算包含乘法的等式
"""
sheet = Sheet()
sheet.put("A", "=2*3*4")
self.assertEqual("24", sheet.get("A"), "Times")
def test_add(self):
"""
Excel应该正确计算包含加法的等式
"""
sheet = Sheet()
sheet.put("A", "=71+2+3")
self.assertEqual("76", sheet.get("A"), "Add")
def test_procedence(self):
"""
Excel应该根据先乘后加的顺序计算
"""
sheet = Sheet()
sheet.put("A", "=7+2*3")
self.assertEqual("13", sheet.get("A"), "Procedence")
def test_full_expression(self):
"""
Excel应该正确地计算等式
"""
sheet = Sheet()
sheet.put("A", "=7*(2+3)*((((2+1))))")
self.assertEqual("105", sheet.get("A"), "Expr")
def test_simple_formula_error(self):
"""
Excel应该返回错误信息若等式输入有错
"""
sheet = Sheet()
sheet.put("A", "=7*")
self.assertEqual("#Error", sheet.get("A"), "Error")
def test_parenthesis_error(self):
"""
Excel应该返回错误信息若等式输入有错
"""
sheet = Sheet()
sheet.put("A", "=(((((7))")
self.assertEqual("#Error", sheet.get("A"), "Error")
/test/model/test_spreadsheet3.py
import unittest
from src.model.spreadsheet import Sheet
class SpreadsheetTestUnit3(unittest.TestCase):
def test_that_cell_reference_works(self):
"""
Excel的等式应该正确地获取其他列的值
"""
sheet = Sheet()
sheet.put("A", "8")
sheet.put("B", "=A")
self.assertEqual("8", sheet.get("B"), "cell lookup")
sheet.put("A", "9")
self.assertEqual("9", sheet.get("B"), "cell change propagation")
def test_that_formulas_know_cells_and_recalculate(self):
"""
Excel的等式应该正确地计算包含其他列的值的等式
"""
sheet = Sheet()
sheet.put("A", "8")
sheet.put("B", "3")
sheet.put("E", "=A*(A-B)+B/3")
self.assertEqual("41", sheet.get("E"), "calculation with cells")
sheet.put("B", "6")
self.assertEqual("18", sheet.get("E"), "re-calculation")
def test_that_deep_propagation_works(self):
"""
Excel的等式应该正确地获取其他列的值
"""
sheet = Sheet()
sheet.put("A", "8")
sheet.put("B", "=A")
sheet.put("C", "=B")
sheet.put("D", "=C")
self.assertEqual("8", sheet.get("D"), "deep propagation")
sheet.put("B", "6")
self.assertEqual("6", sheet.get("D"), "deep re-calculation")
def test_that_formula_works_with_many_cells(self):
"""
Excel的等式应该正确地处理复杂的计算。
"""
sheet = Sheet()
sheet.put("A", "10")
sheet.put("B", "=A+E")
sheet.put("C", "=B+F")
sheet.put("D", "=C")
sheet.put("E", "7")
sheet.put("F", "=B")
sheet.put("G", "=C-B")
sheet.put("H", "=D+G")
self.assertEqual("34", sheet.get("D"), "multiple expressions - D")
self.assertEqual("51", sheet.get("H"), "multiple expressions - H")
def test_that_circular_references_admit_it(self):
"""
如果出现了循环引用,Excel应该提示。
"""
sheet = Sheet()
sheet.put("A", "=A")
self.assertEqual("#Circular", sheet.get("A"), "Detect circularity")
下面是我的答案
class Sheet:
sheet = {}
def get(self, column: str):
"""
该函数的目的是获取在column列的值,内容为等式的话需要计算并返回其结果。举例,若在"A1"列存储的值为"=7+3",sheet.get("A1")应返回"10"。
:param column: 列数
:return: 该列存储的值,默认为空字符串
"""
temp = self.sheet.get(column)
if not temp:
return ""
value = temp.replace(" ", "")
if value.isdigit():
temp = value
if temp[0] == "=":
if temp[1:] == column:
return "#Circular"
char = ""
for i in temp[1:]:
value = i
if i in self.sheet:
value = self.get(i)
char += value
try:
temp = int(eval(char))
return str(temp)
except SyntaxError:
return "#Error"
return str(temp)
def getLiteral(self, column: str):
"""
该函数的目的是获取在column列的字符串值,内容为等式的话不需要计算,直接返回字符串。举例,若在"A1"列存储的值为"=7+3",sheet.getLiteral("A1")应返回"=7+3"。
:param column: 列数
:return: 该列存储的字符串值,默认为空字符串
"""
temp = self.sheet.get(column)
if not temp:
return ""
return temp
def put(self, column: str, value: str):
"""
该函数的目的是在column列存储value的值。如果该列已经被占用,则替换为当前值。
:param column: 列数
:param value: 在该列需要存储的值
"""
self.sheet.update({column: value})
测试结果
|