2022年5月14日 アルゴ式 番外編
Ryuji's answer
TypeScript
import * as fs from 'fs' const input = fs.readFileSync("/dev/stdin", "utf8") const [nv, alist] = input.split("\n") const [n,v,..._] = nv.split(" ").map(Number) const list = alist.split(" ").map(Number) type LastIndex = { (numArray: number[], v: number): number }; const lastIndex: LastIndex = (numArray, v) => { return numArray.lastIndexOf(v); }; console.log(lastIndex(list, v));
- javascript 配列インデックス 取得で検索したところ
Array.prototype.indexOf()
のメソッドがヒットし、javascript indexOf() 配列で再検索したら、lastIndexOf()の説明の記事がヒットしたのでjavascript lastindexof 配列で再再建策したところ、Array.prototype.lastIndexOf()のMDN)がヒットし使用しました。 - 命名がよくないので次回は命名をそれを読んだだけでわかるほど具体的で読めば理解できるようなものを選ぶようにします。
Yano's answer
- 『IndexOf 最後から JavaScript』と検索したところlastIndexOfという関数があることがわかりました。
- 関数の命名(fetchIndexMatchTheLastV)は『最後のVとマッチする』を英訳すると"match the last V"と出てきたので命名しました。
import * as fs from 'fs' const input = fs.readFileSync("/dev/stdin", "utf8") const [nv, alist] = input.split("\n") const [n, v] = nv.split(" ").map(Number) const a = alist.split(" ").map(Number) type FetchIndexMatchTheLastV = { (v: number, a: number[]): number; } const fetchIndexMatchTheLastV: FetchIndexMatchTheLastV = (v, a) => { return a.lastIndexOf(v); } console.log(fetchIndexMatchTheLastV(v, a));
- 命名にtheなどの冠詞は使わない方が良いそうです。
Yui's answer
import * as fs from 'fs' // fsモジュールは、Node.jsでファイルの読み書きを行うための基本的な関数を提供するモジュール const input = fs.readFileSync("/dev/stdin", "utf8") // 同期形式でファイルを読み込むreadFileSyncメソッドです。今回は入力値を受け取ります。 const [nv, alist] = input.split("\n") // 受け取った入力を改行で分割代入 const [n,v,..._] = nv.split(" ").map(Number) // 要素数nと探索に使う整数vを空白文字で分割してからそれぞれの変数に代入します(その時mapメソッドで数値に変換) const list = alist.split(" ").map(Number) // 受け取った配列の要素をnumber型に変換 type ArrayType = { (list: number[], v: number): number; } const arraySearchIndex: ArrayType = (list, v) => { return list.lastIndexOf(v); }; console.log(arraySearchIndex(list, v));
- 今回は、型エイリアスを定義し、関数に適用しました。
- 「javascript 何番目にあるかを調べる」で調べたところindexOfメソッドに辿り着き、特に配列の最後の要素から探索するlastIndexOfメソッドを見つけました。
- lastIndexOfメソッドは、与えられた要素が配列内で見つかった最後のインデックス番号を返し、見つからなければ-1を返します。
- 最初、問題の意図を正しく理解していなかったため、なかなか正解にならず苦戦しました。
- 具体的には、「最も右にあるVは前から何番目にあるかを出力」という部分をインデックス0番を含めない順番で数えようとしていました。
- しかし、「N 個の整数のうち先頭の要素 A[0]を、前から0番目であると数えることとします。」と書かれていることからインデックス番号0番目から何番目であるかを調べれば要件を満たせたと反省しました。
- 問題を正しく読むように心がけたいと思います。
Yuno's answer
import * as fs from 'fs' const input = fs.readFileSync("/dev/stdin", "utf8") const [nv, alist] = input.split("\n") const [n,v,..._] = nv.split(" ").map(Number) const list:number[] = alist.split(" ").map(Number) const selectLastIndexOfIntegers = (list:number[],v:number)=>{ return list.lastIndexOf(v); } console.log(selectLastIndexOfIntegers(list,v))
Yuki's answer
- lastIndexOfを知らなかったので、for文とif文でゴリ押ししました。
- 標準でメソッドが用意してあるので、そちらを使った方が良いです。
- 良い命名をつける、適したメソッドを見つけるのが今後の課題です。
import * as fs from 'fs' const input = fs.readFileSync("/dev/stdin", "utf8") const [nv, alist] = input.split("\n") const [n,v,..._] = nv.split(" ").map(Number) const list = alist.split(" ").map(Number) type IdentifyMostRightPosition = { (v: number, list: number[]): number; }; const identifyMostRightPosition: IdentifyMostRightPosition = ( v, list ) => { let mostRightPosition = -1; for(let i = 0; i < list.length; i++) { if(list[i] === v) { mostRightPosition = i; } } return mostRightPosition }; console.log(identifyMostRightPosition(v, list));