4
0

Cランク解いてイキりたい

サマージャンボが当たったら、フルテレOKな会社に転職して、犬のブリーダーやりたい。。。
こんなクソ暑い中、コロってても出社を推進してくる会社があるとか頭おかしいよね~

面倒くさいので画面パタメータをListでもらった後のFunctionだけ

ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!

lottery.js
// [問題文(原文)]
// 今年もパイザ宝くじの季節がやってきました。パイザ宝くじ券には 100000 以上 199999 以下の 6 桁の番号がついています。毎年1つ当選番号 (100000 以上 199999 以下)が発表され、当たりクジの番号が以下のように決まります。
// 
// 1等:当選番号と一致する番号
// 前後賞:当選番号の ±1 の番号(当選番号が 100000 または 199999 の場合,前後賞は一つしかありません)
// 2等:当選番号と下 4 桁が一致する番号(1等に該当する番号を除く)
// 3等:当選番号と下 3 桁が一致する番号(1等および2等に該当する番号を除く)
// 
// たとえば、当選番号が 142358 の場合、当たりの番号は以下のようになります。
// 
// 1等:142358
// 前後賞:142357 と 142359
// 2等:102358, 112358, 122358, …, 192358 (全 9 個)
// 3等:100358, 101358, 102358, …, 199358 (全 90 個)
// 
// あなたが購入した n 枚の宝くじ券の各番号が入力されるので、それぞれの番号について、何等に当選したかを出力するプログラムを書いて下さい。
function lottery(lines) {
  // 入力は以下のフォーマットで与えられます。
  // 
  // b
  // n
  // a_1
  // a_2
  // :
  // a_n
  // 
  // ここで、b は当選番号、n は購入した宝くじの数、a_1,…,a_n は購入した宝くじ券の番号をそれぞれ表します。
  if (!Array.isArray(lines) || lines.length < 3) {
    console.log("3行以上入れろや!");
    return;
  }
  if (!lines.every(line => Number.isInteger(Number(line)))) {
    console.log("全行数値入れろや!");
    return;
  }
  // 当選番号(1等)
  const hitNo = lines[0];
  const hitNoNum = Number(hitNo);
  // 購入数
  const buyCnt = Number(lines[1]);
  if (!(buyCnt >= 1 && buyCnt <= 100)) {
    console.log("購入数は1~100の整数入れろや!");
    return;
  }
  // 当選確認したいやつら
  const lots = lines.slice(2);
  if (lots.length !== buyCnt) {
    console.log("購入数と確認したい数が合わんのや!");
    return;
  }
  if (![hitNo, ...lots].map(lot => Number(lot)).every(lot => Number.isInteger(lot) && lot >= 100000 && lot <= 199999)) {
    console.log("番号は100000~199999の範囲で入れろや!");
    return;
  }
  // 期待する出力は n 行から成ります。各 i 行目 (1 ≦ i ≦ n) には、a_i が何等に当たったかに応じて、以下の文字列を出力して下さい。
  // 
  // 1等の場合: first
  // 前後賞の場合: adjacent
  // 2等の場合: second
  // 3等の場合: third
  // それ以外(外れ)の場合: blank
  // 
  // 最後は改行し、余計な文字、空行を含んではいけません。

  // 当選番号情報
  const hitNos = [
    { value: hitNo, label: "first" },
    { value: String(hitNoNum + 1), label: "adjacent" },
    { value: String(hitNoNum - 1), label: "adjacent" },
    { value: hitNo.slice(-4), label: "second" },
    { value: hitNo.slice(-3), label: "third" },
  ];
  lots.forEach(lot => {
    const check = hitNos.find(hit => lot.endsWith(hit.value));
    console.log(check ? check.label : "blank");
  });
}

module.exports = {
  lottery
};

Cランクに上がったからか、ちょっとコード量が増えた気がするけど気のせいかもね。
ちなみにfindは見つかった最初の値を返すので、比較する側(当選番号)の配列の順番さえきちんと定義していれば大丈夫。
条件として6桁固定の比較になるので、endsWithで全部チェックしても問題なし。

4
0
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
4
0