看板屋は、客が選んだ模様の単語の大文字・小文字の形を、新しい単語にそのまま写してくれる。 一行目に単語の組の数 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
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(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);}