{ }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);}