AtCoderをVS CodeとJavaScriptで挑戦する方法

AtCoderとは

AtCoderとは競技プログラミングコンテストを主催するWebサイトで、参加者はコードを書いて問題を解くことでスキルを競います。

AtCoderは主にアルゴリズムとデータ構造の知識をテストします。参加者は問題に対する最適な解決策を見つけるために、複雑な問題解決スキルと数学的思考を必要とします。

AtCoderは多くの異なる難易度レベルの問題が提供されています。これにより、初心者から上級者まで多くの人が自分のレベルに合った問題に挑戦できます。

問題は以下のような内容のものが出題されます。

AtCoderをVS CodeとJavaScriptで挑戦する方法

PracticeA - Welcome to AtCoder

データの入力と回答の提出方法

AtCoderの問題を解いて提出するにはアカウントが必要なので、アカウントを持っていない場合は新規登録からアカウントを作成してください。

ログインした状態であれば問題の一番下にソースコードの入力欄が表示されるので、言語に「JavaScript」を選択してコードを記述します。

入力データを受け取るには

JavaScriptで入力データを受け取るには require('fs').readFileSync('/dev/stdin', 'utf8') を使用します。

これを関数に入れて入力データを利用します。

// main.js
const main = (input) => {
  console.log(input)
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'))

VS Codeで問題に挑戦する方法

AtCoderのWebページ内のソースコードの入力欄だと入力しにくいので、コードを書くときはVS Codeを利用したほうが良いです。

VS Codeは画面下にターミナルを表示できるので、「node main.js」を実行すれば結果を確認できます。

以下のように入力例1のデータを入れて試すことも簡単にできます。

const main = (input) => {
  console.log(input)
}

main(`1
2 3
test`)
// main(require('fs').readFileSync('/dev/stdin', 'utf8'))

online-judge-toolsをインストールする

online-judge-toolsはAtCoderのような競技プログラミングの問題のテストケースを確認するツールです。

online-judge-toolsをインストールするには以下のコマンドを実行します。

pip3 install online-judge-tools

インストールが完了したらmain.jsと同じディレクトリで以下のコマンドを実行して、テストケースをダウンロードします。

oj dl https://atcoder.jp/contests/abs/tasks/practice_1

testフォルダが作成されて、中にsample-1.inやsample-1.outなどのファイルが入っていればダウンロードできています。

複数の問題のテストケースをtestフォルダに入れることはできないので、別問題のテストケースをダウンロードしたい場合は「rm -rf test/」コマンドで削除してからダウンロードしてください。

テストを実行するには以下のコマンドを実行します。

oj t -c 'sh -c "node main.js"'

例えば以下のJavaScriptコードの場合、入力データを出力しているだけで問題の出力例と一致しないのでエラーになります。

const main = (input) => {
  console.log(input)
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'))
入力データを出力しているだけで問題の出力例と一致しないのでエラーになります。

以下のような正解のコードを記述してテストケースで問題なしと判断されれば [SUCCESS] AC と表示されます。

const main = (input) => {
  const inputs = input.split('\n')
  const tmp = inputs[1].split(' ')
  const a = parseInt(inputs[0])
  const b = parseInt(tmp[0])
  const c = parseInt(tmp[1])
  const s = inputs[2]
  console.log(a + b + c + ' ' + s)
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'))

入力データは文字列で受け取るので数値計算が必要な場合は必ずparseIntで数値化してください。

テストケースで問題なしと判断されれば [SUCCESS] AC と表示されます。

テストケースですべてSUCCESSの表示がでたらAtCoderのソースの入力欄に貼り付けて提出してください。

同じテストケースなので結果は「AC (合格)」になるはずです。

同じテストケースなので結果は「AC (合格)」になるはずです。

Node.jsのバージョンは合わせる

ローカルのNode.jsでテストする際はAtCoderで使用しているNode.jsのバージョンに合わせてください。

使用するバージョンがローカルとAtCoderで異なると、ojコマンドを実行できなかったり、結果に違いが生じる可能性があります。

package.jsonで"type": "module"の設定だとエラーになる

package.jsonで"type": "module"の設定をしているフォルダ内でmain.jsを実行すると、以下のようなエラーが発生して、必ずoutput: (empty) になってしまうので注意が必要です。

[INFO] sample-1
file:///Users/iwbjp/example/main.js:11
main(require('fs').readFileSync('/dev/stdin', 'utf8'))
^

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/Users/iwbjp/my-svelte-mongo/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///Users/iwbjp/exapmle/main.js:11:1
    at ModuleJob.run (node:internal/modules/esm/module_job:194:25)

Node.js v18.13.0
[INFO] time: 0.064255 sec
[FAILURE] RE: return code 1
input:
1
2_3
test

output:
(empty)
expected:
6_test

ojコマンドで提出する方法

ojコマンドはローカルでテストするコマンドだけでなく、提出するコマンドも存在する。

やり方はまず、以下のログインコマンドでログインします。

実行すると初回のみユーザー名とパスワードを入力するよう要求されます。

oj login https://atcoder.jp/contests/abs/tasks/practice_1

ログインしたら「oj submit [URL] main.js --language 5009」を実行すれば提出できます。

⚠️ --language 5009 のオプションは以前は必要なかったが、現在は指定しないと提出できない。

oj submit https://atcoder.jp/contests/abs/tasks/practice_1 --language 5009

package.jsonを設定して入力を簡単にする

「oj t -c 'sh -c "node main.js"'」だと手入力しにくいので、package.jsonのtestに書いておくと「npm t」で実行できて使いやすくなります。

{
  "scripts": {
    "clean": "rm -rf test/",
    "test": "oj t -c 'sh -c \"node main.js\"'",
    "submit": "oj submit $npm_config_url main.js --language 5009"
  }
}

上記の場合、submitは以下のコマンドになります。

npm run submit --url=https://atcoder.jp/contests/abs/tasks/practice_1