atam
Version:
atcoder on terminal
75 lines (66 loc) • 2.84 kB
JavaScript
// require
const puppeteer = require('puppeteer');
// 回答の結果を取得し、二次元配列にして保持。
const getAnswerStat = async () => {
// オプション
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
],
});
// とりあえず、コマンドライン引数からページのURLを取得。
// TODO: 「提出する」コードが完成したら、変更する必要あり。
const url = process.argv[2];
// ページのインスタンスを作る。
const page = await browser.newPage();
// URLのページに移動する。
await page.goto(url);
// スクレイピングによりデータを取得し、整形する。
const parseList = await page.evaluate(() => {
// 要素が適切にわけられた配列。
let dataList = [];
// tableクラス内の要素を取り出す。
const tableList = document.querySelectorAll('table');
// tableListを型変換しつつdataListに渡す。
tableList.forEach((_node) => {
dataList.push(_node.innerText);
});
// AtCoderには、tableクラスの2番目にサンプルの可否があるので、そこだけ取り出す。
// 配列から文字列になる。
dataList = dataList[2];
// 改行区切りで分割。ここで再び配列になる。
dataList = dataList.split('\n');
// 各要素をタブで分割する。二次元配列になる。
for (let i = 0; i < dataList.length; i++) dataList[i] = dataList[i].split('\t');
return dataList;
});
browser.close();
// 要素わけされた配列を戻り値とする。
return parseList;
};
// 結果をターミナルに表示する。
const printResult = async (scrapingData) => {
console.log('case\tstat\ttime\tmemory');
// TODO:もっといい書き方がないか聞く。
// インデックスによって処理が異なるので、通常のfor文。
for (let i = 1; i < scrapingData.length; i++) {
for (let j = 0; j < scrapingData[i].length; j++) {
if (j == 0) {
// 文字がずれてしまうので、最初の5文字だけ表示。
process.stdout.write(scrapingData[i][j].substr(0, 5));
// 6文字以上の場合は..を表記。
if (scrapingData[i][j].length > 5) process.stdout.write('..');
} else process.stdout.write(scrapingData[i][j]);
process.stdout.write('\t');
}
await console.log('');
}
};
// TODO: 提出時はジャッジ中の待機時間があるので、ジャッジが終わるまで待機するようにする。(「提出する」コードが完成したら)
// TODO: 途中でキャンセルもできるようにする。
// getAnswerStatのあとにprintResultを実行。
const main = async () => {
printResult(await getAnswerStat());
};
main();