題目描述
SnowCal 是一種用於執行計算的簡單程式語言。SnowCal 程式在記憶體中保存一個整數 X,初始設定為零,並重複對其執行加法和乘法操作。
形式上,該語言有 5 種操作:
- ADD Y → 將 Y 加到 X
- MUL Y → 將 X 乘以 Y
- FUN F → 開始定義名為 F 的函數
- END → 當前函數結束
- INV F → 調用函數 F
編寫一個直譯器,接收命令字串陣列,並返回 X 的最終值。
問題分析
這道題要求你實作一個簡單程式語言 SnowCal 的直譯器。語言中只有一個整數變數 X(初始為 0)。
重點考察:
- 直譯器設計能力
- 函數定義與作用域管理
- 指令解析 (parsing)
- 狀態管理與執行引擎實作
屬於中高階工程師常見的系統設計類 Coding 題。
解法實作
class SnowCalInterpreter:
def __init__(self):
self.X = 0
self.functions = {} # 儲存函數定義
def interpret(self, commands):
i = 0
while i < len(commands):
cmd = commands[i]
if cmd == 'ADD':
value = int(commands[i + 1])
self.X += value
i += 2
elif cmd == 'MUL':
value = int(commands[i + 1])
self.X *= value
i += 2
elif cmd == 'FUN':
func_name = commands[i + 1]
i += 2
# 找到函數體(直到 END)
func_body = []
depth = 1 # 處理嵌套函數定義
while depth > 0:
if commands[i] == 'FUN':
depth += 1
elif commands[i] == 'END':
depth -= 1
if depth == 0:
break
func_body.append(commands[i])
i += 1
self.functions[func_name] = func_body
i += 1 # 跳過 END
elif cmd == 'INV':
func_name = commands[i + 1]
if func_name in self.functions:
# 遞迴執行函數體
self.interpret(self.functions[func_name])
i += 2
else:
i += 1
return self.X
def snowcal_interpreter(commands):
interpreter = SnowCalInterpreter()
return interpreter.interpret(commands)
總結
SnowCal 直譯器題考察點:
- 指令解析:字串處理和狀態機
- 函數管理:定義、儲存、調用
- 嵌套處理:深度計數和堆疊管理
- 狀態維護:變數和調用堆疊
oavoservice 專注於 Snowflake / Google / Amazon 等大廠面試輔導,提供 OA 代做、VO 即時輔助等服務。如需幫助,歡迎聯繫我們。
需要面試真題? 立刻聯繫微信 Coding0201,獲得真題。