絶滅

どうでもいい

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

qiita.com

  • 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

qiita.com

www.softel.co.jp


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 を使うようにしよう

qiita.com


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

整数型がなく除算切り捨てで発狂しています

q-az.net


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

比較関数を設定しないと文字列としてソートされると知って発狂しています

webbibouroku.com


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 があってよかった

developer.mozilla.org

developer.mozilla.org


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 が出て発狂しました (未対応なのかな)

developer.mozilla.org

teratail.com


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 とかでサクサクできそう

suin.io

lab.syncer.jp


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 に少し興味が出てきたのでやってみた
多分三日で飽きるけど