3
1

はじめに

paiza自体は、別の人のQiita記事で見たことはあったので、存在は知っていましたが、あまりやってみようという気にはなっていませんでした。
ですが、何か投稿しようと考えていたときに、ちょうどキャンペーンをしていたので、この機会にやってみようと思い、登録して、試しに一問解いてみました。

問題

今回解いてみたのは、ランクCの「宝くじ」です。
言語はなんとなく気分でJavaScriptにしました。

問題はシンプルで、
① 5つの数字が入力値としてくる。
② 1つ目の数字が当たりの数字。
③ 2つ目がくじを買った数
④ 3つ目以降は、買った番号。
⑤ 買った番号を当たりの番号と比較して、一等か前後賞かなどを判定する。
といった感じです。

問題の詳細は以下のURLから↓
https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery

解いてみた

とりあえず最初に自分の思った通りに書いてみました。

qitta.js
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]);
  }
});

雑なコードではありますが、これで提出前動作確認は通ったので、これでいいかと思い、提出しました。



...ところが
スクリーンショット 2024-08-15 185750.png

普通に引っかかってました。

なぜだと思い、試しに1つ与えられる入力を見てみたところ、くじの数が動作確認のときのデータよりも多いことに気づき、それに対応できていなかったことにも気づきました。
全てのくじの番号が取得できていなかったことが分かり、以下のコードに書き換えました。

qitta.js
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]);
  }
});

これで提出すると、
スクリーンショット 2024-08-15 190640.png

無事通りました。

さいごに

私自身が、こういった競技プログラミング的なものに、あまり慣れていないということもあったのですが、コードを書いていくうちに、"提出前動作確認に通る"ということに考えがいき、そもそもの問題の内容が頭から抜け落ちてしまっていました。
ただの初歩的なミスでした。

せっかく登録したので、時間があるときに、また問題を解いてみようと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1