[CPE一星49題] UVA272 - TEX Quotes 題目解析與實作


編輯製作:
 蔡豐聲、莊祺仁 

單位: 中國醫藥大學 醫療資訊學系 程式俱樂部

 YT: https://youtu.be/aYX7ogK9JVk

## 題目資訊

  • 題目名稱: TEX Quotes
  • 編號: CPE22131, UVA272

## 題目解析

在普通的打字機文件中,雙引號通常是用一個符號 " 來表示 。但在 $\text{TeX}$ 排版系統中,雙引號有方向之分:

    左雙引號:使用兩個反引號 ` ` 表示 。
    右雙引號:使用兩個單引號 ' ' 表示 。
本題要求將輸入文本中成對出現的雙引號 ",依序替換為 $\text{TeX}$ 格式的左引號與右引號。

## 輸入說明

  • 輸入包含多行文字,其中包含若干雙引號 " 。

  • 程式需處理直到檔案結束 (EOF) 。

## 輸出說明

  • 將輸入中的第 1、3、5... 個 " 轉換為 ` ` 。

  • 將輸入中的第 2、4、6... 個 " 轉換為 ' ' 。

  • 其餘字元保持不變輸出 。

## 範例測試

  • 輸入:
                 "To be or not to be," quoth the Bard, "that is the question."
  • 輸出:
                 ` `To be or not to be,' ' quoth the Bard, ` `that is the question.' '

## 解題思路

  • 狀態記錄:
  1. 需要一個布林變數(例如 is_first)來記錄當前的引號是「左引號」還是「右引號」。
  2. 初始值設為 True(代表下一個遇到的 " 是左引號)。
  • 逐字處理:
  1. 遍歷輸入字串中的每一個字元。
  2. 如果字元不是 ",直接原樣輸出。
  3. 如果字元是 ":若 is_first 為真,輸出 ` ` 並將 is_first 改為 False 。若 is_first 為假,輸出 ' ' 並將 is_first 改為 True。
布林變數亦可改為整數變數,初始值設為偶數,每次遇到「左引號」或是「右引號」,整數變數累加1。用整數變數的奇偶值決定輸出 ` ` 或是 ' '。

## 實作程式碼 (Python)

import sys

# 記是第一個雙引號還是第二個
q = 0
# 用sys.stdin讀入所有的測試資料
for line in sys.stdin:
    # 把字串再單獨拆開(逐字處理)
    for c in line:
        # 如果遇到雙引號
        if c == '"':
            # 判斷目前是第幾個(偶數個為開引號,奇數個為關引號)
            print("``" if q % 2 == 0 else "''", end="")
            q += 1
        # 一般的字元就直接原樣輸出
        else:
            print(c, end="")