{ }codelper
文字コード剰余P0026

シーザー暗号

一行目に整数 k、二行目に一行の文字列が与えられる。
英字ごとにアルファベット順で k 個後ろの文字に変えて出力せよ。
z の次は a に戻り(Z の次は A)、大文字は大文字、小文字は小文字のままとする。
英字でない文字(数字・記号・空白)はそのままにする。

入力
0 ≤ k ≤ 1000。
文字列の長さ 1〜200、ASCII の表示可能文字(コード 32〜126)のみ
出力
変換した文字列一行
例 1 · stdin
3
Hello, World! xyz
stdout
Khoor, Zruog! abc
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

文字を数に、数を文字に変える方法は言語ごとに違います:Python ord(c)/chr(n)、JS・TS c.charCodeAt(0)/String.fromCharCode(n)、Craykon 文字.コード(c)/文字.コードから(n)。
Java・C#・C・C++ は char がそのまま数なので c - 'a' と直接引き、(char) で戻します。
式はどれも同じ:(c - 'a' + k) % 26 + 'a'。
落とし穴は二つ:% 26 を忘れると z の後ろが { のような記号になり(k は 1000 まであるので必須)、英字かどうか調べずに全部ずらすと空白や数字まで変わります。

Pythonmain.py · 11 行
k = int(input())s = input()out = []for c in s:    if "a" <= c <= "z":        out.append(chr((ord(c) - ord("a") + k) % 26 + ord("a")))    elif "A" <= c <= "Z":        out.append(chr((ord(c) - ord("A") + k) % 26 + ord("A")))    else:        out.append(c)print("".join(out))
JavaScriptmain.js · 11 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const k = Number(lines[0]);const s = lines[1].replace(/\r$/, "");const shift = (c, base) => String.fromCharCode(((c.charCodeAt(0) - base + k) % 26) + base);let out = "";for (const c of s) {  if (c >= "a" && c <= "z") out += shift(c, 97);  else if (c >= "A" && c <= "Z") out += shift(c, 65);  else out += c;}console.log(out);
TypeScriptmain.ts · 12 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const k: number = Number(lines[0]);const s: string = lines[1].replace(/\r$/, "");const shift = (c: string, base: number): string => String.fromCharCode(((c.charCodeAt(0) - base + k) % 26) + base);let out = "";for (const c of s) {  if (c >= "a" && c <= "z") out += shift(c, 97);  else if (c >= "A" && c <= "Z") out += shift(c, 65);  else out += c;}console.log(out);
JavaMain.java · 17 行
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 k = Integer.parseInt(br.readLine().trim());        String s = br.readLine();        StringBuilder out = new StringBuilder();        for (char c : s.toCharArray()) {            if (c >= 'a' && c <= 'z') out.append((char) ((c - 'a' + k) % 26 + 'a'));            else if (c >= 'A' && c <= 'Z') out.append((char) ((c - 'A' + k) % 26 + 'A'));            else out.append(c);        }        System.out.println(out);    }}
C#Main.cs · 19 行
using System;using System.Text; class Program{    static void Main()    {        int k = int.Parse(Console.ReadLine());        string s = Console.ReadLine();        var sb = new StringBuilder();        foreach (char c in s)        {            if (c >= 'a' && c <= 'z') sb.Append((char)((c - 'a' + k) % 26 + 'a'));            else if (c >= 'A' && c <= 'Z') sb.Append((char)((c - 'A' + k) % 26 + 'A'));            else sb.Append(c);        }        Console.WriteLine(sb.ToString());    }}
C++main.cpp · 16 行
#include <iostream>#include <string> int main() {    int k;    std::string s;    std::cin >> k;    std::cin.ignore(1, '\n');    std::getline(std::cin, s);    if (!s.empty() && s.back() == '\r') s.pop_back();    for (char& c : s) {        if (c >= 'a' && c <= 'z') c = static_cast<char>((c - 'a' + k) % 26 + 'a');        else if (c >= 'A' && c <= 'Z') c = static_cast<char>((c - 'A' + k) % 26 + 'A');    }    std::cout << s << "\n";}
Cmain.c · 17 行
#include <stdio.h>#include <string.h> int main(void) {    int k;    char s[256];    if (scanf("%d ", &k) != 1) return 0;    if (!fgets(s, sizeof s, stdin)) return 0;    s[strcspn(s, "\r\n")] = '\0';    for (int i = 0; s[i]; i++) {        char c = s[i];        if (c >= 'a' && c <= 'z') s[i] = (char)((c - 'a' + k) % 26 + 'a');        else if (c >= 'A' && c <= 'Z') s[i] = (char)((c - 'A' + k) % 26 + 'A');    }    puts(s);    return 0;}
Craykonmain.cray · 22 行
k = コンソール.行読み().数に();s = コンソール.行読み();a = 文字.コード("a");bigA = 文字.コード("A");out = "";それぞれ (c の中 s){    code = 文字.コード(c);    もし (c >= "a" && c <= "z")    {        out = out + 文字.コードから((code - a + k) % 26 + a);    }    でなければ もし (c >= "A" && c <= "Z")    {        out = out + 文字.コードから((code - bigA + k) % 26 + bigA);    }    でなければ    {        out = out + c;    }}コンソール.書く(out);