{ }codelper
大小写P0230

把大小写花样印过去

招牌店会把顾客选的花样单词的大小写样子原样印到新单词上。
第一行给出单词对的数量 n,接下来 n 行每行给出一对:花样单词 p 和目标单词 w,用一个空格分开。
w 的第 i 个字符(从 0 数起)跟随 p 的第(i 除以 p 的长度的余数)个字符。
所以 p 比 w 短时,p 的花样会从头重复。
跟随的 p 字符是大写英文字母,就把 w 的字符变成大写;是小写英文字母,就变成小写。
跟随的 p 字符是数字,就不改变 w 的字符。
w 中的数字不管花样如何总是保持不变,已经是大写的字母再变成大写也不变。
对每一对,把改好的 w 输出为一行。

输入
1 ≤ n ≤ 1,000。
p 和 w 由大小写英文字母和数字组成,1~20 个字符
输出
n 行,每行是改好的 w
样例 1 · stdin
3
HeLLo worlds
Ab codelper
x9Y PIZZA42
stdout
WoRLdS
CoDeLpEr
pIZzA42
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

判断是否大写、以及转换大小写的方法因语言而异。
Python m.isupper()/islower()、Java Character.isUpperCase、C# char.IsUpper、C/C++ <ctype.h> 的 isupper/toupper 处理单个字符;JS、TS、Craykon 没有这样的函数,要像 m >= "A" && m <= "Z" 这样按范围比较。
常见陷阱是用 m == m.upper()(JS m === m.toUpperCase())判断大写。
数字转大写后不变,所以 "7" 会被当成大写。
转换这边,Python upper()、JS/TS toUpperCase()、Craykon 大写() 会让非字母保持原样,不用担心。
在 C 里直接用 w[i] - 32 转换,已经是大写的字母和数字会被弄坏,所以要用 toupper 或先检查范围。
C++ std::toupper 返回 int,std::cout << std::toupper(c) 会输出 "65" 这样的数字,要转回 char。
Java String.toUpperCase() 和 C# char.ToUpper 跟随地区(文化)设置,在土耳其语里 i 会变成 İ,所以只处理英文字母时,Java Character.toUpperCase(char) 或 C# ToUpperInvariant 更安全。
花样重复的位置是 i % p.length。

Pythonmain.py · 12 行
n = int(input())for _ in range(n):    p, w = input().split()    out = []    for i, ch in enumerate(w):        m = p[i % len(p)]          # 무늬가 짧으면 처음부터 되풀이        if m.isupper():            # "7".isupper()는 False — 숫자는 대문자도 소문자도 아니다            ch = ch.upper()        elif m.islower():            ch = ch.lower()        out.append(ch)    print("".join(out))
JavaScriptmain.js · 18 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const isUpper = (c) => c >= "A" && c <= "Z";const isLower = (c) => c >= "a" && c <= "z";const out = [];for (let k = 1; k <= n; k++) {  const [p, w] = lines[k].trim().split(" ");  let s = "";  for (let i = 0; i < w.length; i++) {    const m = p[i % p.length];    // "7" === "7".toUpperCase()도 참이라, 같은지로 대문자를 가리면 숫자가 대문자로 친다    if (isUpper(m)) s += w[i].toUpperCase();    else if (isLower(m)) s += w[i].toLowerCase();    else s += w[i];  }  out.push(s);}console.log(out.join("\n"));
TypeScriptmain.ts · 18 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const isUpper = (c: string): boolean => c >= "A" && c <= "Z";const isLower = (c: string): boolean => c >= "a" && c <= "z";const out: string[] = [];for (let k = 1; k <= n; k++) {  const [p, w]: string[] = lines[k].trim().split(" ");  let s = "";  for (let i = 0; i < w.length; i++) {    const m: string = p[i % p.length];    if (isUpper(m)) s += w[i].toUpperCase();    else if (isLower(m)) s += w[i].toLowerCase();    else s += w[i];  }  out.push(s);}console.log(out.join("\n"));
JavaMain.java · 25 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(br.readLine().trim());        StringBuilder out = new StringBuilder();        for (int k = 0; k < n; k++) {            String[] parts = br.readLine().trim().split(" ");            String p = parts[0];            String w = parts[1];            for (int i = 0; i < w.length(); i++) {                char m = p.charAt(i % p.length());                char c = w.charAt(i);                // Character.toUpperCase(char)는 지역 설정과 상관없다(String.toUpperCase()는 지역 설정을 따른다)                if (Character.isUpperCase(m)) c = Character.toUpperCase(c);                else if (Character.isLowerCase(m)) c = Character.toLowerCase(c);                out.append(c);            }            out.append('\n');        }        System.out.print(out);    }}
C#Main.cs · 27 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        var sb = new StringBuilder();        for (int k = 0; k < n; k++)        {            string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            string p = parts[0], w = parts[1];            for (int i = 0; i < w.Length; i++)            {                char m = p[i % p.Length];                char c = w[i];                // char.ToUpper(c)는 지금 문화권을 따른다. 영어 글자만 다룰 때는 ToUpperInvariant가 안전하다                if (char.IsUpper(m)) c = char.ToUpperInvariant(c);                else if (char.IsLower(m)) c = char.ToLowerInvariant(c);                sb.Append(c);            }            sb.Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 21 行
#include <cctype>#include <iostream>#include <string> int main() {    std::ios::sync_with_stdio(false);    int n;    std::cin >> n;    for (int k = 0; k < n; k++) {        std::string p, w;        std::cin >> p >> w;        for (std::size_t i = 0; i < w.size(); i++) {            unsigned char m = p[i % p.size()];            unsigned char c = w[i];            // std::toupper는 int를 돌려주므로 char로 되돌려 담는다            if (std::isupper(m)) w[i] = static_cast<char>(std::toupper(c));            else if (std::islower(m)) w[i] = static_cast<char>(std::tolower(c));        }        std::cout << w << '\n';    }}
Cmain.c · 21 行
#include <ctype.h>#include <stdio.h>#include <string.h> int main(void) {    int n;    scanf("%d", &n);    for (int k = 0; k < n; k++) {        char p[32], w[32];        scanf("%31s %31s", p, w);        size_t lp = strlen(p);        for (size_t i = 0; w[i] != '\0'; i++) {            unsigned char m = (unsigned char)p[i % lp];            /* toupper·tolower는 영어 글자가 아니면 그대로 돌려준다 */            if (isupper(m)) w[i] = (char)toupper((unsigned char)w[i]);            else if (islower(m)) w[i] = (char)tolower((unsigned char)w[i]);        }        puts(w);    }    return 0;}
Craykonmain.cray · 26 行
n = 控制台.读行().转数字();循环 (k = 0; k < n; k++){    parts = 控制台.读行().去空白().分割(" ");    p = parts[0];    w = parts[1];    s = "";    循环 (i = 0; i < w.长度; i++)    {        m = p[i % p.长度];        // 숫자는 대문자로 바꿔도 그대로라서, 크기 비교로 영어 글자인지부터 가린다        如果 (m >= "A" && m <= "Z")        {            s = s + w[i].大写();        }        否则 如果 (m >= "a" && m <= "z")        {            s = s + w[i].小写();        }        否则        {            s = s + w[i];        }    }    控制台.输出(s);}