{ }codelper
値の入れ替え改行なし出力P0133

整列ネットワークを動かす

整列ネットワークは、決まった順に二つの位置ずつ比べて入れ替える装置である。
一行目に数の個数 n が与えられ、二行目に n 個の数が左から与えられる。
左から 1 番、2 番、…、n 番の位置とする。
三行目に比較器の数 m が与えられ、続く m 行に比較器が一つずつ位置の番号 i, j(i < j)で与えられる。
比較器を与えられた順に一つずつ使う。
i 番の数が j 番の数より大きければ二つを入れ替え、そうでなければ(等しいときも)そのままにする。
一行目には比較器ごとに一文字ずつ、入れ替えたら "x"、そのままなら "." を、間に空白を入れずに m 文字続けて出力せよ。
二行目には、すべての比較器を使った後の数を左から空白一つずつで区切って出力せよ。
三行目には、それらの数が左から小さくならない順(等しい値は隣り合ってよい)なら "整列済み"、そうでなければ "未整列" を出力せよ。

入力
2 ≤ n ≤ 100、数は -1,000,000,000 以上 1,000,000,000 以下の整数、1 ≤ m ≤ 1,000、1 ≤ i < j ≤ n
出力
三行:m 文字の x/.
の記録、最後の数、"整列済み" または "未整列"
例 1 · stdin
4
3 1 3 2
5
1 2
3 4
1 3
2 4
2 3
stdout
xx..x
1 2 3 3
整列済み
例 2 · stdin
3
2 1 0
2
1 2
2 3
stdout
xx
1 0 2
未整列
main.py
入力(stdin)

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

$ 準備完了

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

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

二つの値の入れ替えは言語ごとに形が違います。
Python a[i], a[j] = a[j], a[i]、JS・TS [a[i], a[j]] = [a[j], a[i]](分割代入)、C# (a[i], a[j]) = (a[j], a[i])(タプル)、C++ std::swap(a[i], a[j]) です。
Java・C・Craykon にはこういう一行がないので、t = a[i]; a[i] = a[j]; a[j] = t; のように一時変数を使います。
一時変数なしで a[i] = a[j]; a[j] = a[i]; と書くと、一行目で元の a[i] が消え、二つの場所が同じ値になります。
比較は > でなければなりません。
>= にすると等しい値も入れ替えるので、最後の数は同じに見えても記録に x が増えます。
改行なしの出力:Python print(c, end="")、JS・TS process.stdout.write(c)(console.log は必ず改行します)、Java System.out.print(println とは違う)、C# Console.Write(WriteLine とは違う)、C putchar・printf("%c")、C++ std::cout << c(std::endl を付けない)、Craykon コンソール.続けて書く(コンソール.書く は改行する)です。
続けて書いた後は、自分で改行を一回書いてその行を終えないと、二行目が別の行になりません(Python print()、Craykon コンソール.書く(""))。

Pythonmain.py · 15 行
n = int(input())a = list(map(int, input().split()))m = int(input())for _ in range(m):    i, j = map(int, input().split())    i -= 1    j -= 1    if a[i] > a[j]:        a[i], a[j] = a[j], a[i]  # 튜플로 한 번에 맞바꾼다        print("x", end="")  # end=""라야 줄을 바꾸지 않는다    else:        print(".", end="")print()  # 표시 줄을 끝낸다print(*a)print("整列済み" if all(a[k] <= a[k + 1] for k in range(n - 1)) else "未整列")
JavaScriptmain.js · 18 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "整列済み" : "未整列");
TypeScriptmain.ts · 19 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const a: number[] = lines[1].trim().split(/\s+/).map(Number);const m = Number(lines[2]);for (let k = 0; k < m; k++) {  const [i, j] = lines[3 + k].trim().split(/\s+/).map((v) => Number(v) - 1);  if (a[i] > a[j]) {    [a[i], a[j]] = [a[j], a[i]]; // 구조 분해로 맞바꾼다    process.stdout.write("x"); // console.log와 달리 줄을 바꾸지 않는다  } else {    process.stdout.write(".");  }}process.stdout.write("\n");let sorted = true;for (let k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;console.log(a.join(" "));console.log(sorted ? "整列済み" : "未整列");
JavaMain.java · 39 行
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        PrintWriter out = new PrintWriter(System.out);        int n = Integer.parseInt(in.readLine().trim());        int[] a = new int[n];        StringTokenizer st = new StringTokenizer(in.readLine());        for (int k = 0; k < n; k++) a[k] = Integer.parseInt(st.nextToken());        int m = Integer.parseInt(in.readLine().trim());        for (int k = 0; k < m; k++) {            st = new StringTokenizer(in.readLine());            int i = Integer.parseInt(st.nextToken()) - 1, j = Integer.parseInt(st.nextToken()) - 1;            if (a[i] > a[j]) {                int t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다                a[i] = a[j];                a[j] = t;                out.print('x'); // print는 줄을 바꾸지 않는다(println은 바꾼다)            } else {                out.print('.');            }        }        out.println();        boolean sorted = true;        StringBuilder row = new StringBuilder();        for (int k = 0; k < n; k++) {            if (k > 0) row.append(' ');            row.append(a[k]);            if (k + 1 < n && a[k] > a[k + 1]) sorted = false;        }        out.println(row);        out.println(sorted ? "整列済み" : "未整列");        out.flush();    }}
C#Main.cs · 31 行
using System;using System.Linq; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] a = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int m = int.Parse(Console.ReadLine());        for (int k = 0; k < m; k++)        {            int[] ij = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();            int i = ij[0] - 1, j = ij[1] - 1;            if (a[i] > a[j])            {                (a[i], a[j]) = (a[j], a[i]); // 튜플로 맞바꾼다                Console.Write('x'); // Write는 줄을 바꾸지 않는다(WriteLine은 바꾼다)            }            else            {                Console.Write('.');            }        }        Console.WriteLine();        bool sorted = true;        for (int k = 0; k + 1 < n; k++) if (a[k] > a[k + 1]) sorted = false;        Console.WriteLine(string.Join(" ", a));        Console.WriteLine(sorted ? "整列済み" : "未整列");    }}
C++main.cpp · 25 行
#include <algorithm>#include <iostream>#include <utility>#include <vector> int main() {    int n, m;    std::cin >> n;    std::vector<int> a(n);    for (int& v : a) std::cin >> v;    std::cin >> m;    for (int k = 0; k < m; k++) {        int i, j;        std::cin >> i >> j;        if (a[i - 1] > a[j - 1]) {            std::swap(a[i - 1], a[j - 1]); // 표준 라이브러리가 맞바꿔 준다            std::cout << 'x'; // endl이나 '\n'을 붙이지 않으면 줄이 이어진다        } else {            std::cout << '.';        }    }    std::cout << '\n';    for (int k = 0; k < n; k++) std::cout << (k ? " " : "") << a[k];    std::cout << '\n' << (std::is_sorted(a.begin(), a.end()) ? "整列済み" : "未整列") << '\n';}
Cmain.c · 32 行
#include <stdbool.h>#include <stdio.h> int main(void) {    int n, m;    int a[100];    scanf("%d", &n);    for (int k = 0; k < n; k++) scanf("%d", &a[k]);    scanf("%d", &m);    for (int k = 0; k < m; k++) {        int i, j;        scanf("%d %d", &i, &j);        i--;        j--;        if (a[i] > a[j]) {            int t = a[i]; /* 임시 변수에 하나를 맡겨 두고 맞바꾼다 */            a[i] = a[j];            a[j] = t;            putchar('x'); /* 글자 하나만, 줄바꿈 없이 */        } else {            putchar('.');        }    }    putchar('\n');    bool sorted = true;    for (int k = 0; k < n; k++) {        printf(k ? " %d" : "%d", a[k]);        if (k + 1 < n && a[k] > a[k + 1]) sorted = false;    }    printf("\n%s\n", sorted ? "整列済み" : "未整列");    return 0;}
Craykonmain.cray · 31 行
n = コンソール.行読み().数に();a = コンソール.数読み();m = コンソール.行読み().数に();繰り返す (k = 0; k < m; k++){    ij = コンソール.数読み();    i = ij[0] - 1;    j = ij[1] - 1;    もし (a[i] > a[j])    {        t = a[i]; // 임시 변수에 하나를 맡겨 두고 맞바꾼다        a[i] = a[j];        a[j] = t;        コンソール.続けて書く("x"); // 이어쓰기는 줄을 바꾸지 않는다    }    でなければ    {        コンソール.続けて書く(".");    }}コンソール.書く(""); // 표시 줄을 끝낸다정렬됨 = 真;繰り返す (k = 0; k + 1 < n; k++){    もし (a[k] > a[k + 1])    {        정렬됨 = 偽;    }}コンソール.書く(a);コンソール.書く(정렬됨 ? "整列済み" : "未整列");