some-advent-of-code: 5d2efed973130a6d63006cf29032b97f96d7fec2

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

Generated by git2html.