some-advent-of-code: edff846b00a9d447728e5c226f9bb1dda9a3f7e1

     1: 
     2: import java.io.IOException;
     3: import java.nio.file.*;
     4: import java.util.*;
     5: 
     6: public class Exercise210401
     7: {
     8: 
     9: 	private BingoCell[][] bingoCells;
    10: 	private BingoCell[][] bingoCells2;
    11: 	private BingoCell[][] bingoCells3;
    12: 
    13: 
    14: 	public static void main(
    15: 			String args[]
    16: 	) {
    17: 		final String here = "e210401.m ";
    18: 		if ( args.length < 1 )
    19: 		{
    20: 			throw new RuntimeException( here +"add a filename argument" );
    21: 		}
    22: 		String userSaysFile = args[ 0 ];
    23: 		List<String> fileLines = new LinkedList<>();
    24: 		try
    25: 		{
    26: 			Path where = Paths.get( userSaysFile );
    27: 			fileLines = Files.readAllLines( where );
    28: 		}
    29: 		catch ( IOException | InvalidPathException ie )
    30: 		{
    31: 			System.err.println( here +"couldn't read file "+ userSaysFile +" because "+ ie );
    32: 			return;
    33: 		}
    34: 		/*
    35: 		- interpretation of spec -
    36: 		save drawn numbers
    37: 		save boards
    38: 		for board
    39: 			calculate its time to win
    40: 			calculate the final score
    41: 		choose board with the least time to win
    42: 		*/
    43: 		new Exercise210401().winBingo( fileLines );
    44: 	}
    45: 
    46: 
    47: 	private void winBingo(
    48: 			List<String> fileLines
    49: 	) {
    50: 		// parse called
    51: 		String[] asciiCalled = fileLines.get( 0 ).split( "," );
    52: 		int[] called = new int[ asciiCalled.length ];
    53: 		for ( int callInd = 0; callInd < asciiCalled.length; callInd++ )
    54: 			called[ callInd ] = Integer.parseInt( asciiCalled[ callInd ] );
    55: 			
    56: 
    57: 		// parse boards
    58: 		List<BingoBoard> boards = new LinkedList<>();
    59: 		for ( int lineInd = 2; lineInd < fileLines.size(); lineInd += 6 )
    60: 		{
    61: 			boards.add( new BingoBoard(
    62: 					fileLines.get( lineInd ),
    63: 					fileLines.get( lineInd +1 ),
    64: 					fileLines.get( lineInd +2 ),
    65: 					fileLines.get( lineInd +3 ),
    66: 					fileLines.get( lineInd +4 ) ) );
    67: 		}
    68: 
    69: 		chooseBoard( boards, called );
    70: 	}
    71: 
    72: 
    73: 	private void chooseBoard(
    74: 			List<BingoBoard> boards, int[] called
    75: 	) {
    76: 		int minWinningTurns = Integer.MAX_VALUE;
    77: 		int winningBoardInd = -1;
    78: 		for ( int boardInd = 0; boardInd < boards.size(); boardInd++ )
    79: 		{
    80: 			BingoBoard board = boards.get( boardInd );
    81: 			calcTurnsToWinOrQuit( board, called, minWinningTurns );
    82: 			if ( board.turnsToWin < minWinningTurns && board.finalScore >= 0 )
    83: 			{
    84: 				minWinningTurns = board.turnsToWin;
    85: 				winningBoardInd = boardInd;
    86: 			}
    87: 		}
    88: 		System.out.println( "\t"+ boards.get( winningBoardInd ).finalScore );
    89: 	}
    90: 
    91: 
    92: 	private void calcTurnsToWinOrQuit(
    93: 			BingoBoard board, int[] called, int turnsToBeat
    94: 	) {
    95: 		for ( int turnInd = 0;
    96: 				turnInd < called.length && turnInd <= turnsToBeat;
    97: 				turnInd++ )
    98: 		{
    99: 			// mark cell, if applicable
   100: 			for ( int markRowInd = 0; markRowInd < board.board.length; markRowInd++ )
   101: 			{
   102: 				for ( int markColInd = 0; markColInd < board.board[ markRowInd ].length; markColInd++ )
   103: 				{
   104: 					if ( board.board[ markRowInd ][ markColInd ].value == called[ turnInd ] )
   105: 					{
   106: 						board.board[ markRowInd ][ markColInd ].called = true;
   107: 						// check if column won
   108: 						boolean everythingMarked = true;
   109: 						for ( int scoreRowInd = 0; scoreRowInd < board.board.length; scoreRowInd++ )
   110: 						{
   111: 							everythingMarked &= board.board[ scoreRowInd ][ markColInd ].called;
   112: 						}
   113: 						if ( everythingMarked )
   114: 						{
   115: 							board.calcFinalScore( markRowInd, markColInd );
   116: 							return;
   117: 						}
   118: 						else
   119: 						{
   120: 							// check if row won
   121: 							everythingMarked = true;
   122: 							for ( int scoreColInd = 0; scoreColInd < board.board.length; scoreColInd++ )
   123: 							{
   124: 								everythingMarked &= board.board[ markRowInd ][ scoreColInd ].called;
   125: 							}
   126: 							if ( everythingMarked )
   127: 							{
   128: 								board.calcFinalScore( markRowInd, markColInd );
   129: 								board.turnsToWin = turnInd;
   130: 								return;
   131: 							}
   132: 						}
   133: 					}
   134: 				}
   135: 			}
   136: 		}
   137: 	}
   138: 
   139: 
   140: 	class BingoBoard
   141: 	{
   142: 
   143: 		final int boardWidth = 5;
   144: 		int turnsToWin = Integer.MAX_VALUE;
   145: 		int finalScore = -1;
   146: 		BingoCell[][] board = new BingoCell[ boardWidth ][ boardWidth ];
   147: 
   148: 
   149: 		public BingoBoard(
   150: 				String row0,
   151: 				String row1,
   152: 				String row2,
   153: 				String row3,
   154: 				String row4
   155: 		) {
   156: 			int rowInd = 0;
   157: 			fillRow( row0, rowInd );
   158: 			rowInd++;
   159: 			fillRow( row1, rowInd );
   160: 			rowInd++;
   161: 			fillRow( row2, rowInd );
   162: 			rowInd++;
   163: 			fillRow( row3, rowInd );
   164: 			rowInd++;
   165: 			fillRow( row4, rowInd );
   166: 			rowInd++;
   167: 		}
   168: 
   169: 
   170: 		private void fillRow(
   171: 				String rowValues, int rowInd
   172: 		) {
   173: 			String[] values = rowValues.split( " " );
   174: 			int cellInd = 0;
   175: 			for ( int valInd = 0; valInd < values.length; valInd++ )
   176: 			{
   177: 				if ( values[ valInd ].isEmpty() )
   178: 					continue;
   179: 				board[ rowInd ][ cellInd ] = new BingoCell( Integer.parseInt( values[ valInd ] ) );
   180: 				cellInd++;
   181: 			}
   182: 		}
   183: 
   184: 
   185: 		private void calcFinalScore(
   186: 				int lastRowInd, int lastColInd
   187: 		) {
   188: 			finalScore = 0;
   189: 			for ( int markRowInd = 0; markRowInd < board.length; markRowInd++ )
   190: 			{
   191: 				for ( int markColInd = 0; markColInd < board[ markRowInd ].length; markColInd++ )
   192: 				{
   193: 					if ( ! board[ markRowInd ][ markColInd ].called )
   194: 						finalScore += board[ markRowInd ][ markColInd ].value;
   195: 				}
   196: 			}
   197: 			finalScore *= board[ lastRowInd ][ lastColInd ].value;
   198: 		}
   199: 
   200: 	}
   201: 
   202: 
   203: 	class BingoCell
   204: 	{
   205: 		int value;
   206: 		boolean called = false;
   207: 
   208: 
   209: 		public BingoCell(
   210: 				int adopt
   211: 		) {
   212: 			value = adopt;
   213: 		}
   214: 
   215: 	}
   216: 
   217: }
   218: 
   219: 
   220: 
   221: 
   222: 
   223: 
   224: 
   225: 
   226: 
   227: 
   228: 
   229: 
   230: 
   231: 
   232: 
   233: 
   234: 
   235: 

Generated by git2html.