1. 程式人生 > >CCF-201403-3-命令列選項

CCF-201403-3-命令列選項

第三題一如既往的是模擬題,這次模擬解釋命令列。做第三題的心態就是:不要被題目嚇到,不用急,慢慢看完就好,最後注意細節。這一題規則很清晰,難度適中。

題目大意
給一個格式化字串(每個字母是一個選項),再給出幾個命令列,看每個命令列裡面哪些選項符合就輸出哪些,遇到不符合的就結束分析

思路

  1. 先把選項分類好。一種是不帶引數型別(列表儲存),另一種是帶引數型別(儲存資料結構因人而異,python用字典,java用map,反正要可以儲存帶引數選項的引數)
  2. 處理命令列,一個個選項看,如果該選項是帶引數型別的,讀取後面的引數,更新選項的引數值,把引數加入ans(答案列表,儲存不重複的選項);如果選項是不帶引數型別的,看是否已經加入過ans,沒有就加入。
  3. 最後遍歷ans,如果選項是帶引數型別輸出選項同時輸出引數,不帶引數型別只輸出選項
  4. 細節:注意帶引數型別的引數,組成字元可以是符號‘-’,字母和數字,還有處理格式字串和命令列選項的時候,注意不要溢位。
format_str = input()
no_arg_opt = []
has_arg_opt = {}

# 處理格式字串,分類
idx = 0
while idx < len(format_str):
    if idx + 1 < len(format_str) and format_str[idx + 1] == ':':
        has_arg_opt[format_str[idx]] = ''
        idx += 2
    else:
        no_arg_opt.append(format_str[idx])
        idx += 1

# 處理命令列
n = int(input())
for i in range(n):
    line = input().split()[1:]
    ans = []  # 正確匹配到的操作
    idx = 0
    while idx < len(line):
        op_or_arg = line[idx]
        # 如果是操作
        if op_or_arg[0] == '-':
            # 帶引數的操作
            if op_or_arg[1] in has_arg_opt:
                # 找到引數,更新字典,加入ans
                if idx + 1 < len(line):
                    has_arg_opt[op_or_arg[1]] = line[idx + 1]
                    if op_or_arg[1] not in ans:
                        ans.append(op_or_arg[1])
                idx += 2

            # 不帶引數的操作,不重複項才加入ans
            else:
                if op_or_arg[1] in no_arg_opt:
                    if op_or_arg[1] not in ans:
                        ans.append(op_or_arg[1])
                else:
                    break
                idx += 1
        # 不是操作,結束分析
        else:
            break

    # 處理ans,按升序輸出操作如果是帶引數的操作,輸出後面帶引數
    print('Case {}: '.format(i + 1), end='')
    ans = sorted(ans)
    for op in ans:
        if op in has_arg_opt:
            print('-{} {}'.format(op, has_arg_opt[op]), end=' ')
        else:
            print('-{}'.format(op), end=' ')
    print()

# 測試用例
# albw:x
# 4
# ls -a -l -a documents -b
# ls
# ls -w 10 -x -w 15
# ls -a -b -c -d -e -l

# albxw:
# 4
# ls -a -l -a documents -b
# ls
# ls -w 10 -x -w -15 -w
# ls -a -b -c -d -e -l