C/C++/Java/Python/Go/JavaScript/TypeScript での AtCoder/Yukicoder への参加をサポートする Visual Studio Code の拡張機能です。
- 2024/6/15
- リファクタ
- 認証情報の格納先を SecretStorage に変更しました。認証情報を格納したファイルがあれば SecretStorage に移動してから元のファイルを削除します。
- 認証情報の格納先を変更したことに起因して内部的に非同期処理が増加しました。問題があれば連絡願います。
- リファクタ
- 2023/9/9
- 2023/04/05
- 機能強化
- C++の場合に Init Task/Test Task/Debug Task でAtCoder Libraryを自動ダウンロードするようにしました。
- AtCoder Library は
$projectpath/lib/atcoder
に格納します。 - AtCoder Library のドキュメントに従い C++コンパイルコマンドを以下のとおり変更しました。
- 変更前:
g++ -g $taskfile -o $execfile
- 変更後:
g++ -g $taskfile -o $execfile -std=c++17 -I $projectpath/lib
- 変更前:
- AtCoder Library は
- C++のテンプレートファイルを修正しました。Init Task してから AtCoder の場合はコメントアウトを元に戻します。Yukicoder の場合は行を削除します。
- 追加行:
// #include <atcoder/all>
- 追加行:
- パラメタを拡張しました。
$projectpath
- 作業フォルダを変更しました。
- 変更前:
C:\Users\...\AppData\Local\Temp\ac-ts-extension
- 変更後:
C:\Users\...\AppData\Local\Temp\.ac-ts-extension
- 変更前:
- C++の場合に Init Task/Test Task/Debug Task でAtCoder Libraryを自動ダウンロードするようにしました。
- 機能強化
- 2022/12/08
- 機能強化
- Linux でのデバッグ実行に対応しました。
- 問題があれば連絡願います。
- 現時点でデバッグ実行に対応していないのは Windows/Linux ともに Go だけです。
- Linux でのデバッグ実行に対応しました。
- 機能強化
- 2022/12/04
- 機能強化
- Windows での Java/C/C++のデバッグ実行に対応しました。
- C/C++はデバッグ実行のためコンパイルオプションに"-g"を追加しています。
- 現時点では Go のみデバッグ実行に対応していません。
- Linux は未検証のためエラーにしています。
- Windows での Java/C/C++のデバッグ実行に対応しました。
- 機能強化
- 2022/08/29
- 機能強化
- Go に対応しました。
- ローカルでタスクを登録できるようにしました。
- 競技プログラミングサイトに関係なく問題を登録することができます。
- 機能強化
- 2022/08/24
- 機能強化
- Linux 環境に対応しました。
- 任意の言語に対応しました。
- 設定の"User1"に対して以下を参考に設定します。
- 拡張子、例:
.bat
- チェックコマンド、例:
cmd /c
- コンパイルコマンド、例:空文字列
- 実行コマンド、例:
$taskfile
- 拡張子、例:
- パラメタを拡張しました。
$site
,$contest
,$task
,$extension
- 設定の"User1"に対して以下を参考に設定します。
- 機能強化
C/C++/Java/Python/Go/JavaScript/TypeScript での Visual Studio Code から AtCoder/Yukicoder への参加をサポートします。
- AtCoder/Yukicoder へのログイン
- C/C++/Java/Python/Go/JavaScript/TypeScript のソースコードの生成
- テストデータのダウンロード
- 解答のテスト実行、デバッグ実行
- 解答の提出
- ブラウザでの問題ページの表示
- マルチルートワークスペースには対応していません。
- Linux でのデバッグ実行はサポートしていません。
- Python/JavaScript/TypeScript のデバッグ実行時は以下の場合の NG 判定ができません。
- 戻り値が 0 以外による NG 判定
- 例外が発生したことによる NG 判定
- Windows
- Windows 10 (21H2)
- Visual Studio Code (1.70.2)
- C (mingw 11.2.0.07112021) 実行+デバッグ
- C++ (mingw 11.2.0.07112021) 実行+デバッグ
- Java (AdoptOpenJDKjre 16.0.1.901) 実行+デバッグ
- Python (3.10.6) 実行+デバッグ
- Go (1.19) 実行のみ
- JavaScript (Node.js 16.13.0) 実行+デバッグ
- TypeScript (Node.js 16.13.0) 実行+デバッグ
- Linux
- Ubuntu (WSL2)
- C (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0) 実行+デバッグ
- C++ (g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0) 実行+デバッグ
- Java (openjdk version "1.8.0_342") 実行+デバッグ
- Python (Python 3.8.5) 実行+デバッグ
- Go (go version go1.13.8 linux/amd64) 実行のみ
- JavaScript (Node.js 12.22.12) 実行+デバッグ
- TypeScript (Node.js 12.22.12) 実行+デバッグ
AtCoder および Yukicoder でユーザ登録します。Yukicoder の場合はプロフィール画面の API キーを確認しておいてください。
vscode の [拡張機能] から AtCoder Extension
を検索してインストールします。
gcc/g++/clang/jdk 等をインストールします。
環境に合わせて設定からコマンドを変更します。
Python をインストールします。
Go をインストールします。
Node.js をインストールしてから TypeScript の初期設定をします。
- vscode の [ファイル] > [フォルダを開く] からフォルダを選択します。
- [ターミナル] > [新しいターミナル] から以下のコマンドを実行します。入力を求められたらすべて Enter キーを押して進めてください。
npm init
Node.js をインストールしてから TypeScript の初期設定をします。
- vscode の [ファイル] > [フォルダを開く] からフォルダを選択します。
- [ターミナル] > [新しいターミナル] から以下のコマンドを実行します。入力を求められたらすべて Enter キーを押して進めてください。
npm init npm install --save-dev typescript ts-node @types/node
vscode で F1
を押下(もしくは [表示] > [コマンド パレット] を選択、Ctrl+Shift+P
を押下)して [コマンド パレット] から機能を選択します。
はじめに AtCoder Extension: Login Site
でユーザ名とパスワードを入力して AtCoder にログインします。
Yukicoder の場合はプロフィール画面の API キーを入力します。
まずはじめに AtCoder Extension: Init Task
で問題名を入力して提出用のソースコードの生成と問題用のテストデータのダウンロードをします。
- サイトを
atcoder
,yukicoder
から選択します。 - コンテスト名は AtCoder の場合は
abc190
の形式、Yukicoder の場合は351
の形式で入力します。いずれも URL から確認してください。 - 問題名は AtCoder の場合は
abc190_a
の形式、Yukicoder の場合は1692
の形式で入力します。いずれも URL から確認してください。 - 解答する言語は
.py
,.ts
,.js
から選択します。 - ソースコードは
src/atcoder/abcXXX/abcXXX_X.ts
に生成されます。 - テストデータは
src/atcoder/abcXXX/abcXXX_X.txt
にダウンロードされます。 - フォルダは自動的に作成されます。
- 既にソースコードやテストデータがある場合はスキップされます。
生成されたソースコードの main()を修正します。 ソースコードのひな型にカスタマイズしたい場合は、後述の設定を参照してください。
#include <stdio.h>
int main(void)
{
/* TODO edit this code */
/* param */
int n;
scanf("%d", &n);
/* solve */
int ans;
ans = n;
/* answer */
printf("%d", ans);
return 0;
}
#include <stdio.h>
#include <iostream>
int main()
{
/* TODO edit this code */
/* param */
int n;
std::cin >> n;
/* solve */
int ans;
ans = n;
/* answer */
std::cout << ans;
return 0;
}
import java.util.Scanner;
public class template {
public static void main(String[] args) {
// TODO edit this code
// param
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.next());
sc.close();
// resolve
int ans = n;
// answer
System.out.println(ans);
}
}
# TODO edit this code
# param
n = int(input())
# solve
ans = n
# answer
print(ans)
package main
import (
"fmt"
)
func main() {
// TODO edit this code, this code is for https://atcoder.jp/contests/practice/tasks/practice_1
// param
var a int
var b, c int
var s string
fmt.Scanf("%d\n", &a)
fmt.Scanf("%d %d\n", &b, &c)
fmt.Scanf("%s\n", &s)
// answer
fmt.Printf("%d %s\n", a+b+c, s)
}
TypeScript と同様です。
import * as fs from "fs";
// util for input
const lineit = (function* () { for (const line of fs.readFileSync(process.stdin.fd, "utf8").split("\n")) yield line.trim(); })();
const wordit = (function* () { while (true) { let line = lineit.next(); if (line.done) break; for (const word of String(line.value).split(" ")) yield word; } })();
const charit = (function* () { while (true) { let word = wordit.next(); if (word.done) break; for (const char of String(word.value).split("")) yield char; } })();
const readline = () => String((lineit.next()).value);
const read = () => String((wordit.next()).value);
const readchar = () => String((charit.next()).value);
// main
const main = function () {
// TODO edit this code
// param
let n: number;
// init
n = Number(read());
// solve
let ans;
// answer
console.log(ans);
return;
};
main();
問題の解答を作成したら、ソースコードを開いてから AtCoder Extension: Test Task
でテスト実行します。
- 処理が 5 秒以上続くと自動的に中断します。
- 誤差が許容される問題の多くは NG になります。目視で判断してください。
- bigint での出力が必要な問題は文字列化して末尾の
n
を除去して出力してください。
テストデータの例です。テストデータを追加する場合は --------
で区切って入力値・出力値を追加します。
2 1 0
--------
Takahashi
--------
2 2 0
--------
Aoki
--------
2 2 1
--------
Takahashi
--------
問題の解答をデバッグするには、ソースコードを開いてから AtCoder Extension: Debug Task
でデバッグ実行します。
- テストデータの個数だけデバッグ実行が繰り返されます。
解答の作成が完了したら、ソースコードを開いてから AtCoder Extension: Submit Task
で解答を提出します。
- 言語を選択します。
- 構文エラーがあっても提出されます。テスト実行が失敗していても提出されます。注意してください。
AtCoder Extension: Remove Task
を実行すると、問題のソースコードとテストデータを対で削除します。
AtCoder Extension: Browse Task
を実行すると、ブラウザで問題ページを開きます。
独自のソースコードをひな形に使用する場合はフォルダ配下の template/template.c
, template.cpp
, template.java
, template.py
, template.js
, template.ts
に格納してください。
自身の環境に合わせて vscode の設定を変更します。
設定名 | 内容 | 補足 |
---|---|---|
C Checker | gcc --version |
C コンパイラ存在チェック |
C Compiler | gcc $taskfile -o $execfile -lm |
C コンパイラ |
C Executor | $execfile |
C 実行ファイル |
C++ Checker | g++ --version |
C++コンパイラ存在チェック |
C++ Compiler | g++ $taskfile -o $execfile |
C++コンパイラ |
C++ Executor | $execfile |
C++実行ファイル |
Java Checker | javac --version |
Java コンパイラ存在チェック |
Java Compiler | javac -J-Duser.language=en $taskfile |
Java コンパイラ |
Java Executor | cd $tmppath && java Main |
Java 実行ファイル |
パラメタを使用できます。
パラメタ名 | 記法 | 展開例 |
---|---|---|
タスクファイル | $taskfile |
C:\Users\...\project\src\atcoder\practice\practice_1.c |
実行ファイル | $execfile |
C:\Users\...\project\src\atcoder\practice\practice_1.exe |
タスクフォルダ | $taskpath |
C:\Users\...\project\src\atcoder\practice |
プロジェクトフォルダ | $projectpath |
C:\Users\...\project |
一時フォルダ | $tmppath |
C:\Users\...\AppData\Local\Temp\.ac-ts-extension |
サイト | $site |
atcoder |
コンテスト | $contest |
practice |
タスク | $task |
practice_1 |
拡張子 | $extension |
.c |
特にありません。
特にありません。
特にありません。
TypeScript のテスト実行には ts-node を使用しています。
- 起動時間の短縮のためにトランスパイルのみしています(環境変数
TS_NODE_TRANSPILE_ONLY=1
)。そのため、ts-node 起動時の型チェックは行いません。 tsconfig.json
があればそれに従います。
TypeScript のデバッグ実行には vscode のデバッグ機能から ts-node を呼び出しています。
tsconfig.json
があればそれに従います。
プロキシ環境では環境変数HTTP_PROXY
およびHTTPS_PROXY
を設定します。
set HTTP_PROXY=http://proxy.server:8080
set HTTPS_PROXY=http://proxy.server:8080
認証プロキシ環境では以下の形式で設定します。
set HTTP_PROXY=http://username:password@proxy.server:8080
set HTTPS_PROXY=http://username:password@proxy.server:8080