はじめに
paiza自体は、別の人のQiita記事で見たことはあったので、存在は知っていましたが、あまりやってみようという気にはなっていませんでした。
ですが、何か投稿しようと考えていたときに、ちょうどキャンペーンをしていたので、この機会にやってみようと思い、登録して、試しに一問解いてみました。
問題
今回解いてみたのは、ランクCの「宝くじ」です。
言語はなんとなく気分でJavaScriptにしました。
問題はシンプルで、
① 5つの数字が入力値としてくる。
② 1つ目の数字が当たりの数字。
③ 2つ目がくじを買った数
④ 3つ目以降は、買った番号。
⑤ 買った番号を当たりの番号と比較して、一等か前後賞かなどを判定する。
といった感じです。
問題の詳細は以下のURLから↓
https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery
解いてみた
とりあえず最初に自分の思った通りに書いてみました。
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
reader.on('close', () => {
// データ取得
const winningNumber = lines[0];
const amount = lines[1];
const numbers = lines.slice(2, 5);
const results = [];
// 判定
for(let i = 0; i < numbers.length; i++){
if(numbers[i] == winningNumber){
results[i] = 'first';
}else if(numbers[i] == Number(winningNumber)+1
|| numbers[i] == Number(winningNumber)-1){
results[i] = 'adjacent';
}else if(numbers[i].substring(2) == winningNumber.substring(2)){
results[i] = 'second';
}else if(numbers[i].substring(3) == winningNumber.substring(3)){
results[i] = 'third';
}else{
results[i] = 'blank';
}
}
// 出力
for(let i = 0; i < results.length; i++){
console.log(results[i]);
}
});
雑なコードではありますが、これで提出前動作確認は通ったので、これでいいかと思い、提出しました。
普通に引っかかってました。
なぜだと思い、試しに1つ与えられる入力を見てみたところ、くじの数が動作確認のときのデータよりも多いことに気づき、それに対応できていなかったことにも気づきました。
全てのくじの番号が取得できていなかったことが分かり、以下のコードに書き換えました。
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
reader.on('close', () => {
// データ取得
const winningNumber = lines[0];
const amount = lines[1];
const numbers = lines.slice(2, lines.length);// ←書き換えた箇所
const results = [];
// 判定
for(let i = 0; i < numbers.length; i++){
if(numbers[i] == winningNumber){
results[i] = 'first';
}else if(numbers[i] == Number(winningNumber)+1
|| numbers[i] == Number(winningNumber)-1){
results[i] = 'adjacent';
}else if(numbers[i].substring(2) == winningNumber.substring(2)){
results[i] = 'second';
}else if(numbers[i].substring(3) == winningNumber.substring(3)){
results[i] = 'third';
}else{
results[i] = 'blank';
}
}
// 出力
for(let i = 0; i < results.length; i++){
console.log(results[i]);
}
});
無事通りました。
さいごに
私自身が、こういった競技プログラミング的なものに、あまり慣れていないということもあったのですが、コードを書いていくうちに、"提出前動作確認に通る"ということに考えがいき、そもそもの問題の内容が頭から抜け落ちてしまっていました。
ただの初歩的なミスでした。
せっかく登録したので、時間があるときに、また問題を解いてみようと思います。