コイツ、もう挫折したのかと思われた方。実はちゃんとやっていました。
👇 前の記事
14日目までにやったこと
とりあえず毎日
- AOJのAtCoder Beginners Selection
- AtCoderのIntroduction To Programming I
はコツコツやっていました。それ以外やっていません。
コンテストは「AtCoder Beginner Contest 381」だけ参加しました。
改めて「がんばらない」ルール
- 使う教材は以下の記事とその記事内で紹介されている記事のみ
- 1日2問以上練習問題を解かない
- 1時間以上競プロに時間を割かない(コンテストは除く)
- JavaScriptのみを使う
- 他人と比較しない
目標
中期目標:2025/1/15 までにAtCoderで入茶する
最終目標:2025/3/31までにAtCoderで入緑する
このルールで2週間やった結果
結論:A,B問題くらいなら時間をかけたら正解できそう。
「AtCoder Beginner Contest 381」に参加した結果です。
40分くらいかけて2完でしたところで完全に集中力が切れて、C,D問題にそれぞれ1回アタックしてTLEが出たところで飽きたので終わりました。集中力が一番の敵まであります。
A, B問題は毎日練習問題やっていたから正解した気がします。C,D問題は「あ、これなんかコツいりそうだけど多分知らねぇわ」って思いながらやって案の定TLEが出ました。
レート15って。
次のコンテストまでにやること
- アルゴリズムの引き出しが壊滅的に無いので、一個くらい引き出しを作ろうと思います
- 全文探索?みたいなやつに手を出しみようかな
- AtCoderの Introduction To Programming I は全部解き終えたので適当な過去コンテストを毎日1問だけ解くようにします
- AOJのAtCoder Beginners Selection は引き続き行います
ここまでが第1章で、第2章はこの2週間で「あ、これ結構使いそう」と思ったJavaScriptのコードテクをメモしたいと思います。
14日間やってみて競プロでよく使いそうだと思ったJavaScriptのコード
標準入力の処理
これ書けないと間違いなく死ぬ。
const a = require("fs").readFileSync("/dev/stdin", "utf8")
ここから派生して色々やります。
// 標準入力で受け付けた文字を分割して数値にする
const [a,b]
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split(" ").map(Number);
// 1行目が要素数で2行目以降に処理する対象系の問題
const [N, ...An]
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
for (const Ai of An.slice(0,N)) {
// ...
}
数値操作
ソート
JSのソートの仕様、結構ややこしいけど「return値が1以上なら右(👉👉👉👉)に追いやる」で覚える。
const nums = [10, 4, 9];
const sorted = nums.sort((a,b) => a - b); // [4, 9 10]
配列内の数値の合計
const num = [1,2,3];
const sum = num.reduce((a,b)=> a + b)); // 6
最大値を取り出す
const nums = [1, 10, 5];
const max = nums.reduce((a,b) => Math.max(a,b)); // 10
各桁の合計
一旦数字を文字に変換して一文字ずつ分割後、各項を合計する。最初に思いついた人すげーと思った。
const num = 1235;
const sum = [...num.toString()].map(Number).reduce((a,b) => a + b); // 11
割り算の整数値を取り出す
Math.floor(a/b); // 2.34566 の 2が取得できる
小数点の桁数を指定
罠だけど「文字列」が返ってくる。
(a/b).toFixed(6); // <- 指定したい桁数を引数に入れる
文字列操作
反転
これから使いそう。
const str = "abcdef";
const revstr = str.split("").reverse().join(""); // fedcba
配列操作
指定回数繰り返す
[...Array(5)].map((v,i) => console.log('i'))
回数が超大きい数字だとメモリエラー起こしそうなので、その場合はジェネレータを使う。100万以上の要素を取り扱いそうなら選択肢に入れる。
function* gen(n) {
for (let i = 0; i < n; i++) {
yield i;
}
}
for (const g of gen(1000000)) {
console.log(g);
}
👇 参考
中身が全部同じか判定
文字列に変換する。文字列変換は超便利っぽい。
array1.toString() === array2.toString()
要素の種類の数を取得
new Set()
を使う。
const array = [1,1,2,2,3,3];
const s = new Set(array);
console.log(s.size); // 3