签到题:引号

GitHub跳转原题关系图返回列表

用双引号把全文切成 n+1 段,再与无限交替的左、右 TeX 引号对拼接:第奇数个双引号换左引号、第偶数个换右引号。

OJ: roj

题目 ID: 20006

难度:入门

标签:入门字符串模拟python

创建: 2026-10-02 19:28

更新: 2026-10-06 02:18

题目描述

输入一篇包含 ASCII 双引号 " 的文章,把它转换成 TeX 格式:第奇数个 " 换成左双引号 ``,第偶数个 " 换成右双引号 '',其余字符原样输出。输入可能有多个行。

思路

全文顺序扫描,遇到 " 就按当前奇偶状态输出左/右引号并翻转状态,其它字符直接输出。单引号、反引号都不参与替换。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 19:29
# update_at: 2026-10-02 19:29

import sys
from itertools import cycle

QUOTES = ("``", "''")  # 第 1、3、5… 个双引号用左引号,第 2、4、6… 个用右引号


def solve() -> None:
    """把文章中交替出现的双引号改写成 TeX 的左、右双引号。"""
    text = sys.stdin.buffer.read().decode()
    head, *parts = text.split('"')  # n 个双引号把文章切成 n+1 段
    # 第 i 个双引号位于第 i 段与第 i+1 段之间;cycle 让引号奇偶交替
    sys.stdout.write(head + ''.join(q + part for q, part in zip(cycle(QUOTES), parts)))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-06 02:18
 * update_at: 2026-10-06 02:18
 */

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    char ch;
    bool is_open = true; // 下一个双引号是开引号(左)还是闭引号(右)
    while (cin.get(ch)) {
        if (ch == '"') {
            // 第奇数个双引号输出左引号,第偶数个输出右引号
            if (is_open) cout << "``";
            else cout << "''";
            is_open = !is_open; // 翻转奇偶状态
        } else {
            cout << ch;
        }
    }
    return 0;
}