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