{ }codelper
リストの切り出し剰余P0032

リストを右に回す

一行目に整数の個数 n と回す回数 k、二行目に n 個の整数が与えられる。
リストを右に k マス回した結果を、空白一つで区切って一行に出力せよ。
一マス回すと最後の値が先頭に来る(1 2 3 4 5 を 2 マス回すと 4 5 1 2 3)。
k は n より大きいことがあり、n マス回すと元に戻る。

入力
1 ≤ n ≤ 100、0 ≤ k ≤ 1,000,000,000、-1000 ≤ 各整数 ≤ 1000
出力
回したリストを一行で
例 1 · stdin
5 2
1 2 3 4 5
stdout
4 5 1 2 3
例 2 · stdin
5 7
1 2 3 4 5
stdout
4 5 1 2 3
main.py
入力(stdin)

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

$ 準備完了

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

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

まず k %= n で小さくします。
一マスずつ k 回回すと k = 10 億では遅すぎ、小さくせずに Python a[-k:] + a[:-k] を使うと k > n のとき a[-k:] がリスト全体になってそのまま出ます。
切り出し:Python a[n-k:] + a[:n-k]、JS a.slice(n - k)、C# a[(n-k)..]、C++ std::rotate、Craykon a.部分リスト(n - k, k)。
位置の式 (i - k + n) % n から + n を抜くと、C・C++・Java・C#・JS では -1 % 5 が -1 なので配列の外を読みます(Python だけ 4)。

Pythonmain.py · 4 行
n, k = map(int, input().split())a = input().split()k %= nprint(" ".join(a[n - k:] + a[:n - k]))
JavaScriptmain.js · 5 行
const [first, second] = require("fs").readFileSync(0, "utf8").split("\n");const [n, k0] = first.trim().split(/\s+/).map(Number);const a = second.trim().split(/\s+/);const k = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
TypeScriptmain.ts · 6 行
import { readFileSync } from "node:fs";const [first, second] = readFileSync(0, "utf8").split("\n");const [n, k0]: number[] = first.trim().split(/\s+/).map(Number);const a: string[] = second.trim().split(/\s+/);const k: number = k0 % n;console.log([...a.slice(n - k), ...a.slice(0, n - k)].join(" "));
JavaMain.java · 15 行
import java.util.Scanner;import java.util.StringJoiner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int k = sc.nextInt() % n;        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = sc.nextInt();        StringJoiner out = new StringJoiner(" ");        for (int i = 0; i < n; i++) out.add(String.valueOf(a[(i - k + n) % n]));        System.out.println(out);    }}
C#Main.cs · 13 行
using System;using System.Linq; class Program{    static void Main()    {        int[] nk = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int n = nk[0], k = nk[1] % n;        string[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        Console.WriteLine(string.Join(" ", a[(n - k)..].Concat(a[..(n - k)])));    }}
C++main.cpp · 13 行
#include <algorithm>#include <iostream>#include <vector> int main() {    int n, k;    std::cin >> n >> k;    std::vector<int> a(n);    for (int& x : a) std::cin >> x;    std::rotate(a.begin(), a.end() - k % n, a.end());    for (int i = 0; i < n; i++) std::cout << (i ? " " : "") << a[i];    std::cout << "\n";}
Cmain.c · 14 行
#include <stdio.h> int main(void) {    int n, k, a[100];    scanf("%d %d", &n, &k);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);    k %= n;    for (int i = 0; i < n; i++) {        if (i > 0) putchar(' ');        printf("%d", a[(i - k + n) % n]);    }    putchar('\n');    return 0;}
Craykonmain.cray · 10 行
nk = コンソール.数読み();n = nk[0];k = nk[1] % n;a = コンソール.数読み();result = a.部分リスト(n - k, k);それぞれ (x の中 a.部分リスト(0, n - k)){    result.追加(x);}コンソール.書く(result);