第37回【JavaScript】配列のソート、配列の反転

現在取り組んでいるのは、paiza ラーニング問題集「配列メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 37 回目です。

忙しい忙しいと騒いでいるうちは、まだ余裕があります。本当にヤバくなると、何も言わなくなります。ここ数日、そんな感じでした。なんとか落ち着いてみると、まだいけたなーとか思う部分もあります。それが成長の証だと思って、次に繋げられたらいいと思っています。

それでは、今日も頑張ってみようと思います。

配列のソート (paizaランク D 相当)

1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。
N 個の整数を小さい順にソートし、改行区切りで出力してください。


入力される値

N
a_1 a_2 ... a_N

1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

N 個の整数を小さい順にソートし、改行区切りで出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・N は 1 以上 10 以下の整数
・a_i (1 ≦ i ≦ N) は 1 以上 10 以下の整数


入力例

5
5 4 3 2 1

出力例

1
2
3
4
5

数値でソートを行うには、コールバック関数を利用しないといけないみたい。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  let l = lines[1].split(/\s/).map(Number);
  l.sort(function(a,b) {
      if (a > b) return 1;
      if (a < b) return -1;
      return 0;
  });
  for (let i = 0; i < n; i++) {
      console.log(l[i]);
  }
});
JavaScript(もっと簡単に書けるっぽい)
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  let l = lines[1].split(/\s/).map(Number);
  l.sort((a,b) => a - b);
  for (let i = 0; i < n; i++) {
      console.log(l[i]);
  }
});
Python
N = int(input())
L = list(map(int,input().split()))
L.sort()
print(*L,sep="\n")

配列の反転 (paizaランク D 相当)

1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。
N 個の整数の順番を反転させ、改行区切りで出力してください。


入力される値

N
a_1 a_2 ... a_N

1 行目に整数 N が与えられます。
2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

N 個の整数の順番を反転させ、改行区切りで出力してください。

a_N
a_(N-1)
...
a_1

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・N は 1 以上 10 以下の整数
・a_i (1 ≦ i ≦ N) は 1 以上 10 以下の整数


入力例

5
1 5 2 4 3

出力例

3
4
2
5
1

ふむぅ。こちらは、コールバックしなくても、逆順に並び替えることが出来るっぽい。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  let l = lines[1].split(/\s/).map(Number);
  l.reverse()
  for (let i = 0; i < n; i++) {
      console.log(l[i]);
  }
});
Python
N = int(input())
L = list(map(int,input().split()))
L.reverse()
print(*L,sep="\n")

最後に

まだまだコールバック関数に慣れないなぁ、と。コールバック関数をアロー関数で書く場合のルールは頭に入れましたが、いざ書いてみると、戸惑うことが多いです。

文字列のソートは sort() でよく、数値のソートは sort(function(){};) でないといけない。この辺、型をしっかり理解していないといけないところは、Python と違います。(Python でも似たようなハマりどころはありますけれど)

引き続き、よろしくお願いいたします!

Python の第37回はこちら