{ }codelper
文字の添字P0192

メモの中の文字番号

友だちが、一つの長い文字列と文字番号の並びでできたメモを送ってきた。
一行目に英小文字からなる文字列 s、二行目に番号の数 q、三行目に q 個の番号が空白区切りで与えられる。
番号 k が正なら、s の前から k 番目の文字を表す。
先頭の文字が 1 番目である。
番号 k が負なら、s の後ろから -k 番目の文字を表す。
末尾の文字が -1、その前の文字が -2 である。
番号は 0 ではなく、いつも s の中の文字を指す。
番号が指す文字を与えられた順につなげた文字列を一行に出力せよ。

入力
1 ≤ s の長さ ≤ 1,000、s は英小文字のみ、1 ≤ q ≤ 1,000、1 ≤ |k| ≤ s の長さ
出力
q 文字の文字列を一行
例 1 · stdin
secretnote
4
3 -3 7 -1
stdout
cone
main.py
入力(stdin)

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

$ 準備完了

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

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

「前から k 番目」は人が 1 から数えた番号で、八つの言語の文字列の添字はどれも 0 から始まります。
だから正の数はどの言語でも s[k - 1] です(Java は s.charAt(k - 1))。
後ろから数える番号は言語ごとに違います。
Python は s[-1] がそのまま末尾の文字なので、負の数をそのまま使えます。
ここでも正の数と同じく 1 を引くと(s[k - 1])一つずつずれます。
C# には s[^1] のように ^ をつけた末尾からの添字があります。
JS・TS の s[-1] はエラーにならず undefined を返し、つなげると "undefined" という文字が入り込みます。
s.at(-1) なら後ろから数えてくれます。
Java の charAt(-1) は例外、C の s[-1] と C++ の s[-1] は配列の外を読む未定義動作です。
Craykon の s[-1] は「0〜n 番しかありません」という実行エラーで止まります。
これらの言語では長さを足して s[len + k](Craykon は s[s.長さ + k])にします。

Pythonmain.py · 9 行
s = input().strip()q = int(input())out = []for k in map(int, input().split()):    if k > 0:        out.append(s[k - 1])  # 앞에서 k번째 → 번호는 k - 1    else:        out.append(s[k])      # Python은 s[-1]이 맨 끝 글자print("".join(out))
JavaScriptmain.js · 9 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const s = lines[0].trim();const ks = lines[2].trim().split(/\s+/).map(Number);let out = "";for (const k of ks) {  // s[-1]은 undefined라서 음수는 길이를 더해 번호로 바꾼다(s.at(k)도 된다)  out += k > 0 ? s[k - 1] : s[s.length + k];}console.log(out);
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const s = lines[0].trim();const ks: number[] = lines[2].trim().split(/\s+/).map(Number);let out = "";for (const k of ks) {  // s[-1]은 undefined라서 음수는 길이를 더해 번호로 바꾼다(s.at(k)도 된다)  out += k > 0 ? s[k - 1] : s[s.length + k];}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 in = new BufferedReader(new InputStreamReader(System.in));        String s = in.readLine().trim();        in.readLine();        StringBuilder out = new StringBuilder();        for (String t : in.readLine().trim().split("\\s+")) {            int k = Integer.parseInt(t);            // charAt은 0부터, 음수는 받지 않는다 → 뒤에서 세면 길이를 더한다            out.append(k > 0 ? s.charAt(k - 1) : s.charAt(s.length() + k));        }        System.out.println(out);    }}
C#Main.cs · 19 行
using System;using System.Text; class Program{    static void Main()    {        string s = Console.ReadLine().Trim();        Console.ReadLine();        var sb = new StringBuilder();        foreach (string t in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries))        {            int k = int.Parse(t);            // s[^m]은 뒤에서 m번째 글자(C# 8 이후) — ^1이 맨 끝            sb.Append(k > 0 ? s[k - 1] : s[^(-k)]);        }        Console.WriteLine(sb);    }}
C++main.cpp · 16 行
#include <iostream>#include <string> int main() {    std::string s, out;    int q;    std::cin >> s >> q;    int len = (int)s.size();    for (int i = 0; i < q; i++) {        int k;        std::cin >> k;        // s[-1]은 정해지지 않은 동작 → 뒤에서 세면 길이를 더한다        out += k > 0 ? s[k - 1] : s[len + k];    }    std::cout << out << '\n';}
Cmain.c · 19 行
#include <stdio.h>#include <string.h> int main(void) {    static char s[1001];    static char out[1001];    int q;    scanf("%1000s %d", s, &q);    int len = (int)strlen(s);    for (int i = 0; i < q; i++) {        int k;        scanf("%d", &k);        /* C 배열은 0부터, 음수 번호는 배열 밖을 읽는다 → 길이를 더해 바꾼다 */        out[i] = k > 0 ? s[k - 1] : s[len + k];    }    out[q] = '\0';    puts(out);    return 0;}
Craykonmain.cray · 16 行
s = コンソール.行読み().空白除去();q = コンソール.行読み().数に();ks = コンソール.数読み();out = "";それぞれ (k の中 ks){    もし (k > 0)    {        out = out + s[k - 1]; // 앞에서 k번째 → 번호는 k - 1    }    でなければ    {        out = out + s[s.長さ + k]; // s[-1]은 오류라서 길이를 더한다    }}コンソール.書く(out);