{ }codelper
字符串下标P0283

沿对角线取字母

纸条上写着 n 个单词,每行一个。
从第一个单词取第一个字母,从第二个单词取第二个字母,依此类推,从第 i 个单词取第 i 个字母。
如果第 i 个单词的长度比 i 短,没有字母可取,就写 * 代替字母。
第一行给出 n,接下来 n 行每行给出一个单词。
把这样得到的 n 个字符从第一个单词的开始依次连在一起,中间不加空格,输出为一行。

输入
1 ≤ n ≤ 100,单词是只含小写英文字母、长度 1 到 100 的字符串
输出
一行,n 个字符的字符串(小写英文字母和 *)
样例 1 · stdin
4
cat
bone
do
gold
stdout
co*d
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

8 种语言的字符下标都从 0 开始。
所以让循环变量 i 从 0 开始,就从第 i 号(按人的数法是第 i + 1 个)单词取 word[i],能用的下标是 0 到 长度 - 1。
取字符:Python、JS、TS、C#、C、C++、Craykon 用 word[i],Java 用 word.charAt(i)。
长度:Python len(word),JS、TS word.length,Java word.length(),C# word.Length,C++ word.size(),C strlen(word),Craykon word.长度。
读取越界下标时发生的事情,各语言差别很大。
Python 因 IndexError、Java 因 StringIndexOutOfBoundsException、C# 因 IndexOutOfRangeException 停止,Craykon 也会提示字符串只有 0 到 2 号并停止。
JS、TS 的 word[i] 不会停止,而是给出 undefined,于是答案里多出 "undefined" 这几个字(word.charAt(i) 是空字符串)。
C 不做检查,直接交出数组里前一个单词留下的字母或结束标记 \0。
C++ 的 word[i] 也不检查,用 word.at(i) 才会抛出 std::out_of_range。
所以取之前要先问 i < 长度。
两个陷阱:① 写成 i <= 长度,遇到长度恰好为 i 的单词就越界了。
② 把人数的序号(从 1 开始)直接用在 word[i] 上,取到的是后一个位置的字母。

Pythonmain.py · 9 行
n = int(input())answer = ""for i in range(n):    word = input().strip()    if i < len(word):       # 번호는 0부터라서 i째 낱말의 글자 번호는 0 ~ len - 1        answer += word[i]    else:        answer += "*"print(answer)
JavaScriptmain.js · 9 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);let answer = "";for (let i = 0; i < n; i++) {  const word = lines[i + 1].trim();  // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length - 1  answer += i < word.length ? word[i] : "*";}console.log(answer);
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);let answer = "";for (let i = 0; i < n; i++) {  const word: string = lines[i + 1].trim();  // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length - 1  answer += i < word.length ? word[i] : "*";}console.log(answer);
JavaMain.java · 17 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        StringBuilder answer = new StringBuilder();        for (int i = 0; i < n; i++) {            String word = in.readLine().trim();            // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ length() - 1            answer.append(i < word.length() ? word.charAt(i) : '*');        }        System.out.println(answer);    }}
C#Main.cs · 18 行
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var answer = new StringBuilder();        for (int i = 0; i < n; i++)        {            string word = Console.ReadLine().Trim();            // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ Length - 1            answer.Append(i < word.Length ? word[i] : '*');        }        Console.WriteLine(answer);    }}
C++main.cpp · 16 行
#include <iostream>#include <string> int main() {    int n;    std::cin >> n;    std::string answer;    for (int i = 0; i < n; i++) {        std::string word;        std::cin >> word;        // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ size() - 1        if (i < static_cast<int>(word.size())) answer += word[i];        else answer += '*';    }    std::cout << answer << '\n';}
Cmain.c · 16 行
#include <stdio.h>#include <string.h> int main(void) {    int n;    if (scanf("%d", &n) != 1) return 0;    char word[101];    for (int i = 0; i < n; i++) {        if (scanf("%100s", word) != 1) return 0;        // C는 범위를 검사해 주지 않으니 길이를 직접 물어야 한다        if (i < (int)strlen(word)) putchar(word[i]);        else putchar('*');    }    putchar('\n');    return 0;}
Craykonmain.cray · 16 行
n = 控制台.读行().转数字();answer = "";循环 (i = 0; i < n; i++){    word = 控制台.读行().去空白();    // 번호는 0부터라서 쓸 수 있는 글자 번호는 0 ~ 길이 - 1    如果 (i < word.长度)    {        answer += word[i];    }    否则    {        answer += "*";    }}控制台.输出(answer);