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