AtCoder Beginners Selection in JavaScript 完走
atcoder.jp
JavaScriptでACしていきます。
ちなみにコードゴルフでしかjavascriptを使ったことがないです。
Haskell->
naomi-notebook.hatenablog.com
メモ
等値演算子(==)と同値演算子(===)
最後の改行を.trim()とかで取り除かないと色々とバグります。こんなことに何時間も気づかなかった…
よく分からないけどやっぱりJavaScript、AtCoderのサイト上のコードテストでは正解しているはずのサンプルが提出するとWAになることが多い気がする…どこが悪いんだろう
— Naomi Yuritani (@NaomiatLibrary) June 25, 2019
(リプしてくれた某氏ありがとう)
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");