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.