第33回【JavaScript】何番目にある? 1、何番目にある? 2、何番目にある? 3

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

はじめに

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

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

こうやって、Python と JavaScript の勉強を続けていますが、実際には、それだけやっていればいい、というわけにもいきません。特に、弱小企業の場合、様々な知識が求められます。サーバーの構築、ミドルウェア、ソフトウェアの設定、日々、勉強です。

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

何番目にある? 1 (paizaランク D 相当)

以下のような配列があります。

1 10 2 9 3 8 4 7 5 6

この配列の中で、8 が左から何番目にあるか出力してください。
左端を 1 番目とします。


入力される値

入力は与えられません。

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


期待する出力

8 が左から何番目にあるか出力してください。

6

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


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

入力は与えられません。

JavaScript
const L = [1, 10, 2, 9, 3, 8, 4, 7, 5, 6];
L.forEach((val,idx,arr) => {
    if (val == 8) {
        console.log(idx + 1);
        arr.length = idx + 1;
    }
});

forEach 文では、break が使えないことを始めて知った。こういうやり方が紹介されていたけれど、本当に良いのだろうか。とても分かりづらい。

JavaScript(これの方がわかりやすい)
const L = [1, 10, 2, 9, 3, 8, 4, 7, 5, 6];
console.log(L.indexOf(8) + 1);
Python
L = [1, 10, 2, 9, 3, 8, 4, 7, 5, 6]
for i,val in enumerate(L):
    if val == 8:
        print(i + 1)
        break

何番目にある? 2 (paizaランク D 相当)

整数 N が与えられます。
整数 N が、以下の配列の左から何番目にあるか出力してください。
左端を 1 番目とし、N は以下の配列に必ず含まれるものとします。

1 5 9 7 3 2 4 8 6 10

入力される値

N

整数 N が与えられます。

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


期待する出力

整数 N が左から何番目にあるか出力してください。

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


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

・N は与えられた配列内に必ず含まれる。


入力例

5

出力例

2

さっきの問題と変わらない。けど、ちゃんと考えてみる。

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]);
  const L = [1, 5, 9, 7, 3, 2, 4, 8, 6, 10];
  searchNum(n,L);
});

function searchNum(n,L) {
    L.forEach((val,idx,arr) => {
        if (val == n) {
            console.log(idx + 1);
            arr.length = idx + 1;
        }
    });
}
Python
N = int(input())
L = [1, 5, 9, 7, 3, 2, 4, 8, 6, 10]
for i,val in enumerate(L):
    if val == N:
        print(i + 1)
        break

何番目にある? 3 (paizaランク D 相当)

1 行目に整数 N, M が与えられます。
2 行目に M 個の整数 a_1, a_2, …, a_M が与えられます。
整数 N が、M 個の整数の左から何番目にあるか出力してください。
左端を 1 番目とし、N は M 個の整数に必ず 1 つだけ含まれるものとします。


入力される値

N M
a_1 a_2 ... a_M

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

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


期待する出力

整数 N が、M 個の整数の左から何番目にあるか出力してください。

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


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

・M は 1 以上 10 以下の整数
・N, a_i (1 ≦ i ≦ M) は 1 以上 10 以下の整数
・N は M 個の整数の中に必ず 1 つだけ含まれる


入力例

3 5
1 2 3 4 5

出力例

3

すべて標準入力から与えられるだけ。さっき書いたやつがそのまま使えてしまう。

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,m] = lines[0].split(/\s/).map(Number);
  const L = lines[1].split(/\s/).map(Number);
  searchNum(n,L);
});

function searchNum(n,L) {
    L.forEach((val,idx,arr) => {
        if (val == n) {
            console.log(idx + 1);
            arr.length = idx + 1;
        }
    });
}
Python
N,M = map(int,input().split())
L = list(map(int,input().split()))
for i,val in enumerate(L):
    if val == N:
        print(i + 1)
        break

最後に

簡単に終わったけれど、なんか、まだスッキリしないです。もっと綺麗な書き方、JavaScript らしい書き方があるんだろうなぁ。もっと勉強しよう。

例えば、console.log() を関数内に置くべきか、関数で戻り値を貰ってそれを出力するべきか、とか。考えだすとキリがない。いろいろ調べると更に泥沼。

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

Python の第33回はこちら