第48回【JavaScript】二点間の距離 1、二点間の距離 2

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

はじめに

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

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

ひとつのものを作っている際に、あーすれば、こーすれば、といろいろなアイデアが浮かんでくることがあります。危険です。あーすればに寄り道をしていると、深みにはまって戻ってこれなくなります。こーすればに寄り道をしていると、あーすればの方が良かったんじゃないか、と疑心暗鬼になります。そして、元がどんなだったかすっぽり抜け落ちて、余計に時間を喰われてしまいます。

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

二点間の距離 1 (paizaランク D 相当)

1 行目に整数 N が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
点 (2, 3) と各点の距離を改行区切りで出力してください。

距離の計算にはマンハッタン距離

|x1 - x2| + |y1 - y2|

を用いることとします。


入力される値

N
x_1 y_1
x_2 y_2
...
x_N y_N

1 行目に整数 N が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。

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


期待する出力

点 (2, 3) と各点の距離を改行区切りで出力してください。

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


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

* N は 1 以上 10 以下の整数
* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数


入力例

3
2 3
1 2
5 6

出力例

0
2
6

マンハッタン距離って、日本にいるとなかなか馴染みがないんですよね。碁盤の目のような街並みって本当に一部限られた地域だけですし。

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]);
  for (let i = 1; i <= n; i++) {
      const [x,y] = lines[i].split(/\s/).map(Number);
      console.log(Math.abs(x-2) + Math.abs(y-3));
  }
});
Python
N = int(input())
X = [0] * N
Y = [0] * N
for i in range(N):
    x,y = map(int,input().split())
    X[i] = x
    Y[i] = y
for i in range(N):
    print(abs(X[i]-2) + abs(Y[i]-3))

二点間の距離 2 (paizaランク D 相当)

1 行目に整数 N, A, B が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
A 番目の点 と B 番目の点の距離を出力してください。

距離の計算にはマンハッタン距離

|x1 - x2| + |y1 - y2|

を用いることとします。


入力される値

N A B
x_1 y_1
x_2 y_2
...
x_N y_N

1 行目に整数 N, A, B が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。

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


期待する出力

点 A と点 B の距離を出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。

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


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

* N は 1 以上 10 以下の整数
* A, B は 1 以上 N 以下の整数
* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数


入力例

3 1 3
2 3
1 2
5 6

出力例

6

無駄なことをする問題だなぁ、と思ったら、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,a,b] = lines[0].split(/\s/).map(Number);
  let L = [];
  for (let i = 1; i <= n; i++) {
      L.push(lines[i].split(/\s/).map(Number));
  }
  console.log(Math.abs(L[a-1][0]-L[b-1][0]) + Math.abs(L[a-1][1]-L[b-1][1]));
});
Python
N,A,B = map(int,input().split())
X = [0] * N
Y = [0] * N
for i in range(N):
    x,y = map(int,input().split())
    X[i] = x
    Y[i] = y
print(abs(X[A-1]-X[B-1])+abs(Y[A-1]-Y[B-1]))

最後に

2 問目は、Python 同様に、きちんと X と Y を分割して保存しておいた方が良かったのかもしれない、と後で見返して思いました。ちょっと分かりづらい気がします。

絶対値は、やっぱり abs 関数があるのですね。sum や average はないのに。

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

Python の第48回はこちら