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.