JavaScript (node.js) による AtCoder Beginners Selection 11 本ノック
やる
0. PracticeA - はじめてのあっとこーだー(Welcome to AtCoder)
var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { var a = parseInt(lines[0]); var bc = lines[1].split(/,|\s|\n/); var b = parseInt(bc[0]); var c = parseInt(bc[1]); var s = lines[2]; console.log(`%d %s`, a + b + c, s); });
Submission #3089553 - AtCoder Beginners Selection
- 入出力だいぶだるい
- split + 正規表現が強そう
- format 指定子みたいなのが使える
1. ABC086A - Product
var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { var ab = lines[0].split(/\s/); var a = parseInt(ab[0]); var b = parseInt(ab[1]); if(a * b % 2 === 0) console.log("Even"); else console.log("Odd"); });
Submission #3089618 - AtCoder Beginners Selection
- 一問目より簡単
- tie(a, b) = str.split() みたいなの欲しい
2. ABC081A - Placing Marbles
var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); var counter = function(str,seq){ return str.split(seq).length - 1; } reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { console.log(counter(lines[0], /1/)); });
Submission #3089660 - AtCoder Beginners Selection
- split + 正規表現でパターンにマッチする要素の個数を取得 (便利)
3. ABC081B - Shift only
var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); var cntDiv2 = function(a){ var cnt = 0; while(a % 2 === 0){ cnt++; a /= 2; } return cnt; } reader.on('close', function() { var N = parseInt(lines[0]); var A = lines[1].split(/\s/) .map(function(a){ return parseInt(a) }) .map(function(a){ return cntDiv2(a) }); console.log(Math.min.apply(null, A)); });
Submission #3089742 - AtCoder Beginners Selection
- 高階関数をガシガシ使っていけ
4. ABC087B - Coins
var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { var cnt = 0; var A = lines.map(function(a) {return parseInt(a)}); for(var i = 0; i <= A[0]; i++) for(var j = 0; j <= A[1]; j++) for(var k = 0; k <= A[2]; k++) if(i * 500 + j * 100 + k * 50 === A[3]) cnt++; console.log(cnt); });
Submission #3089937 - AtCoder Beginners Selection
var を let に変えたら怒らREが発生した
プログラムの最初に 'use strict' と書くと動くらしい
var より let の方がスコープの扱いが C++ に近そうなので以降は let を使うようにしよう
5. ABC083B - Some Sums
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); let digitSum = (n) => { let res = 0; while(n !== 0){ res += n % 10; n = Math.floor(n / 10); } return res; } reader.on('close', function() { let params = lines[0].split(/\s/).map(function(n){ return parseInt(n)}); let ans = 0; for(let i = 1; i <= params[0]; i++){ let sum = digitSum(i); if(params[1] <= sum && sum <= params[2]) ans += i; } console.log(ans); });
Submission #3090165 - AtCoder Beginners Selection
整数型がなく除算切り捨てで発狂しています
6. ABC088B - Card Game for Two
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); let descend = (a, b) => { return b - a; } reader.on('close', function() { let N = parseInt(lines[0]); let a = lines[1].split(/\s/).map(function(x) { return parseInt(x); }).sort(descend); let A = 0; let B = 0; for(let i = 0; i < a.length; i++){ if(i % 2 === 0) A += a[i]; else B += a[i]; } console.log(A - B); });
Submission #3090257 - AtCoder Beginners Selection
比較関数を設定しないと文字列としてソートされると知って発狂しています
7. ABC085B - Kagami Mochi
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { let N = parseInt(lines.shift()); let A = lines.map((a) => { return parseInt(a); }); let set = new Set(A); console.log(set.size); });
Submission #3090326 - AtCoder Beginners Selection
shift は O(N) なのかなあ
Set があってよかった
8. ABC085C - Otoshidama
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { let params = lines[0].split(/\s/).map((x) => { return parseInt(x); }); let N = params[0], Y = params[1]; Y /= 1000; for(let a = 0; 9 * a <= Y - N; a++){ for(let b = 0; 9 * a + 4 * b <= Y - N; b++){ if(9 * a + 4 * b !== Y - N) continue; let c = N - a - b; if(c < 0) continue; console.log(a, b, c); return; } } console.log(-1, -1, -1); });
Submission #3090490 - AtCoder Beginners Selection
調べたら let [N, Y] = [foo, bar] のような便利な分割代入が存在するらしい
早速書いてはみたものの RE が出て発狂しました (未対応なのかな)
9. ABC049C - 白昼夢 / Daydream
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { let S = lines[0]; let dd = ["dream", "erase", "eraser", "dreamer"]; while(S.length !== 0){ let flag = false; for(let i = 0; i < dd.length; i++){ let n = dd[i].length; if(dd[i] === S.slice(-n)){ flag = true; S = S.slice(0, -n); } } if(!flag){ console.log("NO"); return; } } console.log("YES"); });
Submission #3090627 - AtCoder Beginners Selection
文字列の操作 慣れれば slice とかでサクサクできそう
10. ABC086C - Traveling
'use strict' let lines = []; let reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', function(line) { lines.push(line); }); reader.on('close', function() { let N = parseInt(lines.shift()); let ct = 0, cx = 0, cy = 0; for(let i = 0; i < N; i++){ let params = lines[i].split(/\s/).map((p) => { return parseInt(p); }); let t = params[0], x = params[1], y = params[2]; let dt = t - ct; let dist = Math.abs(x - cx) + Math.abs(y - cy); if(dist > dt || (dt - dist) % 2 === 1){ console.log("No"); return; } ct = t; cx = x; cy = y; } console.log("Yes"); });
Submission #3090706 - AtCoder Beginners Selection
おわり~
userscript に少し興味が出てきたのでやってみた
多分三日で飽きるけど