{ }codelper
文字列の繰り返し文字コードP0097

文字のピラミッド

英大文字一つ C が与えられる。
A から C までの k + 1 行(k は C が A から何文字後ろか。
A なら 0)の文字のピラミッドを出力せよ。
上から i 行目(0 から)は空白 k - i 個、続いて A から A の i 文字後ろの文字まで順に、続いてそのすぐ前の文字から逆に A までである。
例えば C = D なら最後の行は "ABCDCBA" である。
行末には空白を入れない。

入力
C は A から Z までの大文字一つ
出力
k + 1 行のピラミッド
例 1 · stdin
D
stdout
   A
  ABA
 ABCBA
ABCDCBA
例 2 · stdin
A
stdout
A
main.py
入力(stdin)

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

$ 準備完了

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

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

文字を数に変えて足し、また文字に戻す方法は言語によって違います。
Python chr(ord("A") + j)、JS・TS String.fromCharCode(65 + j)。
JS で "A" + 1 は計算ではなく文字列の連結なので "A1" になります。
C・C++・Java・C# で 'A' + j は int です。
C の putchar は int を文字として出しますが、C++ cout << 'A' + j と Java StringBuilder.append('A' + j) は 65 のように数を出します。
(char) や static_cast<char> で戻す必要があります。
同じ文字を繰り返す方法も違います。
Python " " * n、JS・TS・Java(11 から)" ".repeat(n)、C# new string(' ', n)、C++ std::string(n, ' ')。
C には繰り返し関数がないので、ループを使うか printf("%*s", n, "") で幅の分だけ空白を出します。
Craykon は 文字.コード("A") で数を得て 文字.コードから(a + j) で戻し、空白は " ".繰り返し(k - i) で作ります。

Pythonmain.py · 5 行
k = ord(input().strip()) - ord("A")for i in range(k + 1):    up = "".join(chr(ord("A") + j) for j in range(i + 1))    # 올라간 글자 + 마지막 글자를 뺀 거꾸로    print(" " * (k - i) + up + up[-2::-1])
JavaScriptmain.js · 9 行
const k = require("fs").readFileSync(0, "utf8").trim().charCodeAt(0) - 65;const lines = [];for (let i = 0; i <= k; i++) {  let up = "";  for (let j = 0; j <= i; j++) up += String.fromCharCode(65 + j);  const down = up.slice(0, -1).split("").reverse().join("");  lines.push(" ".repeat(k - i) + up + down);}console.log(lines.join("\n"));
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const k: number = readFileSync(0, "utf8").trim().charCodeAt(0) - 65;const lines: string[] = [];for (let i = 0; i <= k; i++) {  let up = "";  for (let j = 0; j <= i; j++) up += String.fromCharCode(65 + j);  const down: string = up.slice(0, -1).split("").reverse().join("");  lines.push(" ".repeat(k - i) + up + down);}console.log(lines.join("\n"));
JavaMain.java · 16 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        int k = new Scanner(System.in).next().charAt(0) - 'A';        StringBuilder out = new StringBuilder();        for (int i = 0; i <= k; i++) {            out.append(" ".repeat(k - i));            // 'A' + j 는 int라서 (char)로 되돌려야 글자로 붙는다            for (int j = 0; j <= i; j++) out.append((char) ('A' + j));            for (int j = i - 1; j >= 0; j--) out.append((char) ('A' + j));            out.append('\n');        }        System.out.print(out);    }}
C#Main.cs · 20 行
using System;using System.Text; class Program{    static void Main()    {        int k = Console.ReadLine().Trim()[0] - 'A';        var output = new StringBuilder();        for (int i = 0; i <= k; i++)        {            output.Append(new string(' ', k - i));            // 'A' + j 는 int라서 (char)로 되돌려야 글자로 붙는다            for (int j = 0; j <= i; j++) output.Append((char)('A' + j));            for (int j = i - 1; j >= 0; j--) output.Append((char)('A' + j));            output.Append('\n');        }        Console.Write(output);    }}
C++main.cpp · 15 行
#include <iostream>#include <string> int main() {    char c;    std::cin >> c;    int k = c - 'A';    for (int i = 0; i <= k; i++) {        std::string line(k - i, ' ');        // 'A' + j 는 int라서 char로 되돌려 붙인다        for (int j = 0; j <= i; j++) line += static_cast<char>('A' + j);        for (int j = i - 1; j >= 0; j--) line += static_cast<char>('A' + j);        std::cout << line << '\n';    }}
Cmain.c · 15 行
#include <stdio.h> int main(void) {    char c;    scanf(" %c", &c);    int k = c - 'A';    for (int i = 0; i <= k; i++) {        // C에는 되풀이 함수가 없다: %*s 에 빈 문자열을 주면 그 너비만큼 빈칸이 찍힌다        printf("%*s", k - i, "");        for (int j = 0; j <= i; j++) putchar('A' + j);        for (int j = i - 1; j >= 0; j--) putchar('A' + j);        putchar('\n');    }    return 0;}
Craykonmain.cray · 15 行
a = 文字.コード("A");k = 文字.コード(コンソール.行読み().空白除去()) - a;繰り返す (i = 0; i <= k; i++){    line = " ".繰り返し(k - i);    繰り返す (j = 0; j <= i; j++)    {        line += 文字.コードから(a + j);    }    繰り返す (j = i - 1; j >= 0; j--)    {        line += 文字.コードから(a + j);    }    コンソール.書く(line);}