第13回【JavaScript】加算された数列の最大値、加算された数列の最小値、1 はどこにある?

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

はじめに

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

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

やりたいことがたくさんあって、時間が足りない。やるべきことに絞って、やるべきことをやればいい、と言われたことがあるのですが、根本的にやりたいこととやるべきことは違うんですよね。やるべきことはちゃんとやる。そのうえで、やりたいことをやる。そのやりたいことがたくさんある。困りものです。

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

加算された数列の最大値 (paizaランク D 相当)

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、a_1 , … , a_N の最大値を出力してください。


入力される値

N
a_1 a_2 ... a_N

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

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


期待する出力

a_i に i を足したとき、a_1 , … , a_N の最大値を出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ a_i ≦ 100


入力例

5
1 2 3 4 5

出力例

10

Python を学習したときにも書いたけれど、問題文を理解するのに一瞬間が必要になる問題。1 番目の数字には 1 を足して、2 番目の数字には 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 a = lines[1].split(/\s/).map(Number);
  let ans = 0;
  for (let i = 0; i < n; i++) {
      ans = Math.max(ans,a[i] + (i + 1));
  }
  console.log(ans);
});

多分、reduce() を利用したりしたら、もっと美しく書けると思うけれど、まだまだ勉強不足。

Python
N = int(input())
A = list(map(int,input().split()))
ans = 0
for i in range(N):
    ans = max(ans, A[i] + (i + 1))
print(ans)

加算された数列の最小値 (paizaランク D 相当)

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、N 個の整数の最小値を出力してください。


入力される値

N
a_1 a_2 ... a_N

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

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


期待する出力

a_i に i を足したとき、N 個の整数の最小値を出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ a_i ≦ 100


入力例

5
5 4 3 2 1

出力例

6

過去に書いた Python のコードは致命的な誤りがある。これで paiza のチェックは通ったんだろうか。最小値の仮の値を 100 にしていると、条件的に合わない。

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 a = lines[1].split(/\s/).map(Number);
  let ans = 1000;
  for (let i = 0; i < n; i++) {
      ans = Math.min(ans,a[i] + (i + 1));
  }
  console.log(ans);
});
Python
N = int(input())
A = list(map(int,input().split()))
ans = 100 → ans = 1000
for i in range(N):
    ans = min(ans, A[i] + (i + 1))
print(ans)

1 はどこにある? (paizaランク D 相当)

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_1, a_2, …, a_N のうち、1 がある位置を先頭から順に改行区切りで出力してください。
a_1 を 1 番目とし、a_1, a_2, …, a_N には少なくとも 1 個は 1 が含まれます。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に N 個の整数 a_1, a_2, …, a_N が与えられます。
・ a_1, a_2, …, a_N には少なくとも 1 個は 1 が含まれます。

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


期待する出力

a_1, a_2, …, a_N のうち、1 がある位置を先頭から順に改行区切りで出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ a_i ≦ 100


入力例

5
1 5 5 5 1

出力例

1
5

イチの位置を探せ! Python のときと同じようなことを書いている。まったく成長していない??

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 a = lines[1].split(/\s/).map(Number);
  for (let i = 0; i < n; i++) {
      if (a[i] == 1) console.log(i + 1);
  }
});
Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    if A[i] == 1:
        print(i+1)

最後に

過去のコードのミスを見つけてしまって、かなりショックを受けています。ちゃんと確認したつもりだったんだけど、「つもり」ではダメですよね。

お仕事においては、ミスをしない人、として認識されているのですが、結構細かいミスをしていて、慌てて自分で直しているのが本当のところ。かなり恥ずかしい・・・。

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

Python の第13回はこちら