質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1585閲覧

Javascript 数値の間隔の計算(標準入力)

shinji389

総合スコア8

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/28 04:06

5つある数字についてそれぞれ (2 個目以降) について1つ上の数字との間隔を出力したいのですが
1つ1つ計算して出力する方法以外で適切な構文があれば教えていただきたいです。

例)標準入力で入力される数値

1
4
12
20
27

出力される数値

3 //(4-1)
8 //(12-4)
8 //(20-12)
7 //(27-20)

自分のコード
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', () => {
console.log(lines[1] - lines[0]);
console.log(lines[2] - lines[1]);
console.log(lines[3] - lines[2]);
console.log(lines[4] - lines[3]);
});

1つの数値ごとに計算、出力しているがもっとすっきりとしたコードにする方法が
あれば教えていただきたいです。
また、入力される数字は状況に合わせて変化することを考慮する必要があります。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/07/28 04:41

nodeですか?
shinji389

2021/07/28 23:33

nodeです。
guest

回答1

0

標準入力は一旦おいておいて

javascript

1const lines=[1,4,12,20,27]; 2const result=lines.reduce((x,y,z)=>(x instanceof Array?x:[]).concat([y-lines[z-1]])); 3console.log(result);

分解したサンプル

javascript

1const lines=[1,4,12,20,27]; 2const result=lines.reduce((accumulator,currentValue,index)=>{ 3 console.log([accumulator,currentValue,index]);//デバグ用 4 let arr; 5 if(accumulator instanceof Array){ 6 arr=accumulator; 7 }else{ 8 arr=[]; 9 } 10 let previousValue=lines[index-1]; 11 arr=arr.concat([currentValue-previousValue]); 12 return arr; 13}); 14console.log(result);

投稿2021/07/28 04:59

編集2021/07/29 09:59
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinji389

2021/07/28 23:18

回答ありがとうございます。 instanceofの部分ではどのような処理をおこなっているのでしょうか。
yambejp

2021/07/29 00:12

reduceの動作はちょっと特殊なのでそういうものだと理解するしかありません 1巡目:x=1,y=4,z=1としてxが配列ならxのままそうでないなら空配列を設定し、yから一個前のlines[0]を引いたものを結合します 2巡目:x=[3],y=12,z=2としてxが配列なので(このあとの処理は常に配列確定)、yから一個前のlines[1]を引いたものを結合します 3巡目:x=[3,8],y=20,z=3、4巡目:x=[3,8,8],y=27,z=4・・・ 結果[3,8,8,7]が得られます
shinji389

2021/07/29 09:49

すみません。 内容がまだ理解出来ていないのですがコードを引用して出力すると[ -1, 4, 1, 2 ]となります。 どのような間違いが考えられますでしょうか。 また、全体のやっていることの流れはわかりましたが 初めて見た内容で調べてもわからないので教えてください。 reduceは累積値を出しているんですよね?(x,y,z)はどこから出てきたなんの役割をするものでしょうか? 以降の(x instanceof Array?x:[]).と concat([y-lines[z-1]]));についても 個別にどのようなことを行なっているか教えて貰えないでしょうか。 申し訳ありませんが何卒よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問