Naomi's notebook

Naomi's notebook

AtCoder Beginners Selection in JavaScript 完走

atcoder.jp
JavaScriptでACしていきます。
ちなみにコードゴルフでしかjavascriptを使ったことがないです。

Haskell->
naomi-notebook.hatenablog.com

メモ

等値演算子(==)と同値演算子(===)
最後の改行を.trim()とかで取り除かないと色々とバグります。こんなことに何時間も気づかなかった…


(リプしてくれた某氏ありがとう)




Welcome to AtCoder

function Solve(input){
    var lis=input.split(/\n| /g);
    console.log("%d %s",parseInt(lis[0])+parseInt(lis[1])+parseInt(lis[2]),lis[3]);
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC086A - Product

function Solve(input){
    var lis=input.split(/ /g);
    
    console.log(parseInt(lis[0])*parseInt(lis[1])%2?"Odd":"Even");
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC081A - Placing Marbles

function Solve(input){
    console.log("%d",parseInt(input[0])+parseInt(input[1])+parseInt(input[2]) );
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ところで後から見つけたんですけど
AtCoder に登録したら解くべき精選過去問 10 問を JavaScript で解いてみた - Qiita
これ 天才ですね

ABC081B - Shift only

ループはmapで書きます(コードゴルフでしかjavascriptを使ったことがないので)

function Dividetwo(num){
    var ans=0;
    while(num%2===0){ans++;num>>=1;}
    return ans
}
function Solve(input){
    input=input.split("\n")[1].split(" ");
    console.log("%d",Math.min.apply(null, input.map(x=>Dividetwo(parseInt(x))))     );
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ところでほとんど同じ?で手元では正解なのでACするはずのこれがバグるんですけどなんででしょうか…(デバッグ力のなさ)
→最後の改行によるアレでした .trim()すればACします。

function Dividetwo(num){
    var ans=0;
    while(num%2===0){ans++;num=num/2|0;}
    return ans
}
function Solve(input){
    input=input.split(/ |\n/g);
    console.log(Math.min.apply(null, input.slice(1).map(x=>Dividetwo(parseInt(x))))     );
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC087B - Coins

はい。parseIntのし忘れには気をつける。

function Solve(input){
    input=input.split("\n").map(x=>parseInt(x));
    var ans=0;
    for(var i=0;i<=input[0];i++)for(var j=0;j<=input[1];j++)for(var k=0;k<=input[2];k++)if(500*i+100*j+50*k===input[3])ans++;
    console.log("%d",ans);
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC083B - Some Sums

A<=x<=Bと書けないタイプの言語。(むしろ書けるタイプの言語(あった気がするけど)なんだっけ…)

function Solve(input){
    input=input.split(" ").map(x=>parseInt(x));
    var ans=0;
    for(var i=1;i<=input[0];i++){
        var sum10=0;var ni=i;
        while(ni>0){sum10+=ni%10;ni=ni/10|0;}
        if(input[1]<=sum10&&sum10<=input[2])ans+=i;
    }
    console.log("%d",ans);
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC088B - Card Game for Two

アロー関数を使うと簡単に逆順ソートができる。アロー関数の使い方がちょっとわかりました(なるほどなあ)

function Solve(input){
    input=input.split("\n")[1].split(" ").map(x=>parseInt(x));
    var ans=0;var side=1;
    input.sort((a,b)=>b-a).map(x=>ans+=side++%2?x:-x);
    console.log(ans)
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC085B - Kagami Mochi

後述の理由によりほぼ他人のコピペ
Set使うの頭いいな…

function Solve(input){
    const inputs=input.split("\n").slice(1).filter(v=>v);
    const size=new Set(inputs).size;
    console.log(size);
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

なんか手元とコードテストではこれでサンプル通るんですけど、全てWAになる?
→最後の改行によるアレでした .trim()すればACします。

function Solve(input){
    var ans=0,
        bef=-1;
    input.split("\n").slice(1).map(x=>parseInt(x)).sort().map(function(x){
        ans+=x!=bef?1:0;
        bef=x;
    });
    console.log(ans);
}

Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC085C - Otoshidama

これは普通に

function Solve(input){
    var N=input.split(" ")[0],
        Y=input.split(" ")[1];
    for(var i=0;i<=N;i++){
        for(var j=0;j+i<=N;j++){
            var k=N-i-j;
            if(i*10000+j*5000+k*1000==Y){console.log(i+" "+j+" "+k);return 0;}
        }
    }
    console.log("-1 -1 -1");
}
Solve(require("fs").readFileSync("/dev/stdin","utf-8"));

ABC049C - 白昼夢 / Daydream

正規表現を勉強した(お恥ずかしいことにあまり使わないので)
.trim()がないとWAる(この時だけわかった)

function Solve(input){
    if(/^(erase|eraser|dream|dreamer)*$/.test(input.trim()))return true
    else return false;
}
console.log(Solve(require("fs").readFileSync("/dev/stdin","utf-8"))?"YES":"NO");

ABC086C - Traveling

for...inは順不同の時しか使えない
function Solve(input){
    input=input.trim().split("\n");
    input.shift();
    var t=0,x=0,y=0;
    for(var i=0;i<input.length;i++){
        var ntxy=input[i].split(" ").map(x=>parseInt(x));
        var d=Math.abs(ntxy[0]-t)-Math.abs(ntxy[1]-x)-Math.abs(ntxy[2]-y);
        if(d>=0&&d%2===0){t=ntxy[0];x=ntxy[1];y=ntxy[2];}
        else{return false};
    }
    return true;
}
console.log(Solve(require("fs").readFileSync("/dev/stdin","utf-8"))?"Yes":"No");