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で全部チェックしても問題なし。