jamaik

Untitled

Dec 4th, 2021
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { readFileSync } from "fs";
  2. const dataSet = readFileSync(`${__dirname}/inputs/day4.txt`, "utf8").replace(/\r\n/g,'\n').split("\n")
  3.  
  4. const SIZE = 5
  5.  
  6. class BingoNumber {
  7.     value: number;
  8.     marked: boolean;
  9.     constructor (value: string) {
  10.         this.value = parseInt(value);
  11.         this.marked = false;
  12.     }
  13.     call() {
  14.         this.marked = true;
  15.     }
  16. }
  17.  
  18. type Board = BingoNumber[][];
  19.  
  20. class Player {
  21.     static nextId = 1;
  22.     id: number;
  23.     board: Board;
  24.     constructor() {
  25.         this.id = Player.nextId;
  26.         Player.nextId += 1;
  27.         this.board = [];
  28.     }
  29.     get len() {
  30.         return this.board.length;
  31.     }
  32.     check() {
  33.         const checkRows = (M: Board) => !!M.find(r => r.filter(v => v.marked).length === SIZE);
  34.         const { board } = this;
  35.         if (checkRows(board)) {
  36.             return true;
  37.         }
  38.         const transpose = board[0].map((_, colIndex) => board.map(row => row[colIndex]));
  39.         return checkRows(transpose);
  40.     }
  41.     bingo() {
  42.         return this.check();
  43.     }
  44.     score(currentNumber: number) {
  45.         const sum = this.board.flat().reduce((s, c) => !c.marked ? s + c.value : s, 0);
  46.         return sum * currentNumber;
  47.     }
  48. }
  49.  
  50. class Bingo {
  51.     numbers: BingoNumber[];
  52.     players: Player[];
  53.     constructor(data: string[]) {
  54.         console.log("Welcome to the bingo, we've got fun and games!")
  55.         this.init(data);
  56.     }
  57.     init(data: string[]) {
  58.         this.numbers = data.splice(0, 2)[0].split(",").map(x => new BingoNumber(x));
  59.         const numberMap: Record<string, BingoNumber> = {};
  60.         this.numbers.forEach(x => {
  61.             numberMap[x.value] = x;
  62.         });
  63.         const players = [];
  64.         let player = new Player();
  65.         for (let i = 0; i < data.length; i += 1) {
  66.             if (data[i].trim().length === 0) {
  67.                 continue;
  68.             }
  69.             const rowAsList = data[i].trim()
  70.                 .replace(/\s+/g, " ")
  71.                 .split(" ")
  72.                 .map(x => numberMap[x]);
  73.             player.board.push(rowAsList)
  74.             if (player.board.length === SIZE) {
  75.                 players.push(player);
  76.                 player = new Player();
  77.             }
  78.         }
  79.         this.players = players;
  80.     }
  81.  
  82.     play() {
  83.         for (const number of this.numbers) {
  84.             console.log("The next number is...", number.value)
  85.             number.call();
  86.             const winners = this.players.filter(b => b.bingo());
  87.             if (winners[0]) {
  88.                 console.log("Ladies and gentlemen, we have a winner!", winners[0].id);
  89.                 console.log("Winning score", winners[0].score(number.value), "\n");
  90.                 break;
  91.             }
  92.             console.log("No winners for this number :(", "\n")
  93.         }
  94.     }
  95.  
  96.     findLosingScore() {
  97.         let players = this.players;
  98.         for (const number of this.numbers) {
  99.             number.call();
  100.             if (players.length > 1) {
  101.                 players = players.filter(b => !b.bingo());
  102.             } else if (players[0].bingo()) {
  103.                 console.log("And the loser is:", players[0].id);
  104.                 console.log("Losing score", players[0].score(number.value));
  105.                 break;
  106.             }
  107.         }
  108.     }
  109. }
  110.  
  111. const bingoNight = new Bingo(dataSet);
  112. bingoNight.play();
  113. bingoNight.findLosingScore();
  114.  
Add Comment
Please, Sign In to add comment