some-advent-of-code: diff fc72d0ba 44b01e5b

Branch: master

Commit: fc72d0ba92319965dd9fcffafd791415e3688018

Author: Nicholas Prado <nmprado@nzen.ws>
Date: Sat Dec 4 20:06:31 UTC 2021
Parent: 44b01e5bc184805cbb6a9edc868f3f70e964e210
Log message:

    feat 21 04 iterate over array

    1: diff --git a/src/java/y2021/Exercise210401.java b/src/java/y2021/Exercise210401.java
    2: new file mode 100644
    3: index 0000000..edff846
    4: --- /dev/null
    5: +++ b/src/java/y2021/Exercise210401.java
    6: @@ -0,0 +1,235 @@
    7: +
    8: +import java.io.IOException;
    9: +import java.nio.file.*;
   10: +import java.util.*;
   11: +
   12: +public class Exercise210401
   13: +{
   14: +
   15: +	private BingoCell[][] bingoCells;
   16: +	private BingoCell[][] bingoCells2;
   17: +	private BingoCell[][] bingoCells3;
   18: +
   19: +
   20: +	public static void main(
   21: +			String args[]
   22: +	) {
   23: +		final String here = "e210401.m ";
   24: +		if ( args.length < 1 )
   25: +		{
   26: +			throw new RuntimeException( here +"add a filename argument" );
   27: +		}
   28: +		String userSaysFile = args[ 0 ];
   29: +		List<String> fileLines = new LinkedList<>();
   30: +		try
   31: +		{
   32: +			Path where = Paths.get( userSaysFile );
   33: +			fileLines = Files.readAllLines( where );
   34: +		}
   35: +		catch ( IOException | InvalidPathException ie )
   36: +		{
   37: +			System.err.println( here +"couldn't read file "+ userSaysFile +" because "+ ie );
   38: +			return;
   39: +		}
   40: +		/*
   41: +		- interpretation of spec -
   42: +		save drawn numbers
   43: +		save boards
   44: +		for board
   45: +			calculate its time to win
   46: +			calculate the final score
   47: +		choose board with the least time to win
   48: +		*/
   49: +		new Exercise210401().winBingo( fileLines );
   50: +	}
   51: +
   52: +
   53: +	private void winBingo(
   54: +			List<String> fileLines
   55: +	) {
   56: +		// parse called
   57: +		String[] asciiCalled = fileLines.get( 0 ).split( "," );
   58: +		int[] called = new int[ asciiCalled.length ];
   59: +		for ( int callInd = 0; callInd < asciiCalled.length; callInd++ )
   60: +			called[ callInd ] = Integer.parseInt( asciiCalled[ callInd ] );
   61: +			
   62: +
   63: +		// parse boards
   64: +		List<BingoBoard> boards = new LinkedList<>();
   65: +		for ( int lineInd = 2; lineInd < fileLines.size(); lineInd += 6 )
   66: +		{
   67: +			boards.add( new BingoBoard(
   68: +					fileLines.get( lineInd ),
   69: +					fileLines.get( lineInd +1 ),
   70: +					fileLines.get( lineInd +2 ),
   71: +					fileLines.get( lineInd +3 ),
   72: +					fileLines.get( lineInd +4 ) ) );
   73: +		}
   74: +
   75: +		chooseBoard( boards, called );
   76: +	}
   77: +
   78: +
   79: +	private void chooseBoard(
   80: +			List<BingoBoard> boards, int[] called
   81: +	) {
   82: +		int minWinningTurns = Integer.MAX_VALUE;
   83: +		int winningBoardInd = -1;
   84: +		for ( int boardInd = 0; boardInd < boards.size(); boardInd++ )
   85: +		{
   86: +			BingoBoard board = boards.get( boardInd );
   87: +			calcTurnsToWinOrQuit( board, called, minWinningTurns );
   88: +			if ( board.turnsToWin < minWinningTurns && board.finalScore >= 0 )
   89: +			{
   90: +				minWinningTurns = board.turnsToWin;
   91: +				winningBoardInd = boardInd;
   92: +			}
   93: +		}
   94: +		System.out.println( "\t"+ boards.get( winningBoardInd ).finalScore );
   95: +	}
   96: +
   97: +
   98: +	private void calcTurnsToWinOrQuit(
   99: +			BingoBoard board, int[] called, int turnsToBeat
  100: +	) {
  101: +		for ( int turnInd = 0;
  102: +				turnInd < called.length && turnInd <= turnsToBeat;
  103: +				turnInd++ )
  104: +		{
  105: +			// mark cell, if applicable
  106: +			for ( int markRowInd = 0; markRowInd < board.board.length; markRowInd++ )
  107: +			{
  108: +				for ( int markColInd = 0; markColInd < board.board[ markRowInd ].length; markColInd++ )
  109: +				{
  110: +					if ( board.board[ markRowInd ][ markColInd ].value == called[ turnInd ] )
  111: +					{
  112: +						board.board[ markRowInd ][ markColInd ].called = true;
  113: +						// check if column won
  114: +						boolean everythingMarked = true;
  115: +						for ( int scoreRowInd = 0; scoreRowInd < board.board.length; scoreRowInd++ )
  116: +						{
  117: +							everythingMarked &= board.board[ scoreRowInd ][ markColInd ].called;
  118: +						}
  119: +						if ( everythingMarked )
  120: +						{
  121: +							board.calcFinalScore( markRowInd, markColInd );
  122: +							return;
  123: +						}
  124: +						else
  125: +						{
  126: +							// check if row won
  127: +							everythingMarked = true;
  128: +							for ( int scoreColInd = 0; scoreColInd < board.board.length; scoreColInd++ )
  129: +							{
  130: +								everythingMarked &= board.board[ markRowInd ][ scoreColInd ].called;
  131: +							}
  132: +							if ( everythingMarked )
  133: +							{
  134: +								board.calcFinalScore( markRowInd, markColInd );
  135: +								board.turnsToWin = turnInd;
  136: +								return;
  137: +							}
  138: +						}
  139: +					}
  140: +				}
  141: +			}
  142: +		}
  143: +	}
  144: +
  145: +
  146: +	class BingoBoard
  147: +	{
  148: +
  149: +		final int boardWidth = 5;
  150: +		int turnsToWin = Integer.MAX_VALUE;
  151: +		int finalScore = -1;
  152: +		BingoCell[][] board = new BingoCell[ boardWidth ][ boardWidth ];
  153: +
  154: +
  155: +		public BingoBoard(
  156: +				String row0,
  157: +				String row1,
  158: +				String row2,
  159: +				String row3,
  160: +				String row4
  161: +		) {
  162: +			int rowInd = 0;
  163: +			fillRow( row0, rowInd );
  164: +			rowInd++;
  165: +			fillRow( row1, rowInd );
  166: +			rowInd++;
  167: +			fillRow( row2, rowInd );
  168: +			rowInd++;
  169: +			fillRow( row3, rowInd );
  170: +			rowInd++;
  171: +			fillRow( row4, rowInd );
  172: +			rowInd++;
  173: +		}
  174: +
  175: +
  176: +		private void fillRow(
  177: +				String rowValues, int rowInd
  178: +		) {
  179: +			String[] values = rowValues.split( " " );
  180: +			int cellInd = 0;
  181: +			for ( int valInd = 0; valInd < values.length; valInd++ )
  182: +			{
  183: +				if ( values[ valInd ].isEmpty() )
  184: +					continue;
  185: +				board[ rowInd ][ cellInd ] = new BingoCell( Integer.parseInt( values[ valInd ] ) );
  186: +				cellInd++;
  187: +			}
  188: +		}
  189: +
  190: +
  191: +		private void calcFinalScore(
  192: +				int lastRowInd, int lastColInd
  193: +		) {
  194: +			finalScore = 0;
  195: +			for ( int markRowInd = 0; markRowInd < board.length; markRowInd++ )
  196: +			{
  197: +				for ( int markColInd = 0; markColInd < board[ markRowInd ].length; markColInd++ )
  198: +				{
  199: +					if ( ! board[ markRowInd ][ markColInd ].called )
  200: +						finalScore += board[ markRowInd ][ markColInd ].value;
  201: +				}
  202: +			}
  203: +			finalScore *= board[ lastRowInd ][ lastColInd ].value;
  204: +		}
  205: +
  206: +	}
  207: +
  208: +
  209: +	class BingoCell
  210: +	{
  211: +		int value;
  212: +		boolean called = false;
  213: +
  214: +
  215: +		public BingoCell(
  216: +				int adopt
  217: +		) {
  218: +			value = adopt;
  219: +		}
  220: +
  221: +	}
  222: +
  223: +}
  224: +
  225: +
  226: +
  227: +
  228: +
  229: +
  230: +
  231: +
  232: +
  233: +
  234: +
  235: +
  236: +
  237: +
  238: +
  239: +
  240: +
  241: +
  242: diff --git a/src/java/y2021/Exercise210402.java b/src/java/y2021/Exercise210402.java
  243: new file mode 100644
  244: index 0000000..5d2efed
  245: --- /dev/null
  246: +++ b/src/java/y2021/Exercise210402.java
  247: @@ -0,0 +1,231 @@
  248: +
  249: +import java.io.IOException;
  250: +import java.nio.file.*;
  251: +import java.util.*;
  252: +
  253: +public class Exercise210402
  254: +{
  255: +
  256: +
  257: +	public static void main(
  258: +			String args[]
  259: +	) {
  260: +		final String here = "e210402.m ";
  261: +		if ( args.length < 1 )
  262: +		{
  263: +			throw new RuntimeException( here +"add a filename argument" );
  264: +		}
  265: +		String userSaysFile = args[ 0 ];
  266: +		List<String> fileLines = new LinkedList<>();
  267: +		try
  268: +		{
  269: +			Path where = Paths.get( userSaysFile );
  270: +			fileLines = Files.readAllLines( where );
  271: +		}
  272: +		catch ( IOException | InvalidPathException ie )
  273: +		{
  274: +			System.err.println( here +"couldn't read file "+ userSaysFile +" because "+ ie );
  275: +			return;
  276: +		}
  277: +		/*
  278: +		- interpretation of spec -
  279: +		save drawn numbers
  280: +		save boards
  281: +		for board
  282: +			calculate its time to win
  283: +			calculate the final score
  284: +		choose board with the least time to win
  285: +		*/
  286: +		new Exercise210402().winBingo( fileLines );
  287: +	}
  288: +
  289: +
  290: +	private void winBingo(
  291: +			List<String> fileLines
  292: +	) {
  293: +		// parse called
  294: +		String[] asciiCalled = fileLines.get( 0 ).split( "," );
  295: +		int[] called = new int[ asciiCalled.length ];
  296: +		for ( int callInd = 0; callInd < asciiCalled.length; callInd++ )
  297: +			called[ callInd ] = Integer.parseInt( asciiCalled[ callInd ] );
  298: +			
  299: +
  300: +		// parse boards
  301: +		List<BingoBoard> boards = new LinkedList<>();
  302: +		for ( int lineInd = 2; lineInd < fileLines.size(); lineInd += 6 )
  303: +		{
  304: +			boards.add( new BingoBoard(
  305: +					fileLines.get( lineInd ),
  306: +					fileLines.get( lineInd +1 ),
  307: +					fileLines.get( lineInd +2 ),
  308: +					fileLines.get( lineInd +3 ),
  309: +					fileLines.get( lineInd +4 ) ) );
  310: +		}
  311: +
  312: +		chooseBoard( boards, called );
  313: +	}
  314: +
  315: +
  316: +	private void chooseBoard(
  317: +			List<BingoBoard> boards, int[] called
  318: +	) {
  319: +		int maxWinningTurns = -1;
  320: +		int winningBoardInd = -1;
  321: +		for ( int boardInd = 0; boardInd < boards.size(); boardInd++ )
  322: +		{
  323: +			BingoBoard board = boards.get( boardInd );
  324: +			calcTurnsToWinOrQuit( board, called, maxWinningTurns );
  325: +			if ( board.turnsToWin > maxWinningTurns && board.finalScore >= 0 )
  326: +			{
  327: +				maxWinningTurns = board.turnsToWin;
  328: +				winningBoardInd = boardInd;
  329: +			}
  330: +		}
  331: +		System.out.println( "\t"+ boards.get( winningBoardInd ).finalScore );
  332: +	}
  333: +
  334: +
  335: +	private void calcTurnsToWinOrQuit(
  336: +			BingoBoard board, int[] called, int turnsToBeat
  337: +	) {
  338: +		for ( int turnInd = 0;
  339: +				turnInd < called.length; // && turnInd <= turnsToBeat;
  340: +				turnInd++ )
  341: +		{
  342: +			// mark cell, if applicable
  343: +			for ( int markRowInd = 0; markRowInd < board.board.length; markRowInd++ )
  344: +			{
  345: +				for ( int markColInd = 0; markColInd < board.board[ markRowInd ].length; markColInd++ )
  346: +				{
  347: +					if ( board.board[ markRowInd ][ markColInd ].value == called[ turnInd ] )
  348: +					{
  349: +						board.board[ markRowInd ][ markColInd ].called = true;
  350: +						// check if column won
  351: +						boolean everythingMarked = true;
  352: +						for ( int scoreRowInd = 0; scoreRowInd < board.board.length; scoreRowInd++ )
  353: +						{
  354: +							everythingMarked &= board.board[ scoreRowInd ][ markColInd ].called;
  355: +						}
  356: +						if ( everythingMarked )
  357: +						{
  358: +							board.calcFinalScore( markRowInd, markColInd );
  359: +							return;
  360: +						}
  361: +						else
  362: +						{
  363: +							// check if row won
  364: +							everythingMarked = true;
  365: +							for ( int scoreColInd = 0; scoreColInd < board.board.length; scoreColInd++ )
  366: +							{
  367: +								everythingMarked &= board.board[ markRowInd ][ scoreColInd ].called;
  368: +							}
  369: +							if ( everythingMarked )
  370: +							{
  371: +								board.calcFinalScore( markRowInd, markColInd );
  372: +								board.turnsToWin = turnInd;
  373: +								return;
  374: +							}
  375: +						}
  376: +					}
  377: +				}
  378: +			}
  379: +		}
  380: +	}
  381: +
  382: +
  383: +	class BingoBoard
  384: +	{
  385: +
  386: +		final int boardWidth = 5;
  387: +		int turnsToWin = Integer.MIN_VALUE;
  388: +		int finalScore = -1;
  389: +		BingoCell[][] board = new BingoCell[ boardWidth ][ boardWidth ];
  390: +
  391: +
  392: +		public BingoBoard(
  393: +				String row0,
  394: +				String row1,
  395: +				String row2,
  396: +				String row3,
  397: +				String row4
  398: +		) {
  399: +			int rowInd = 0;
  400: +			fillRow( row0, rowInd );
  401: +			rowInd++;
  402: +			fillRow( row1, rowInd );
  403: +			rowInd++;
  404: +			fillRow( row2, rowInd );
  405: +			rowInd++;
  406: +			fillRow( row3, rowInd );
  407: +			rowInd++;
  408: +			fillRow( row4, rowInd );
  409: +			rowInd++;
  410: +		}
  411: +
  412: +
  413: +		private void fillRow(
  414: +				String rowValues, int rowInd
  415: +		) {
  416: +			String[] values = rowValues.split( " " );
  417: +			int cellInd = 0;
  418: +			for ( int valInd = 0; valInd < values.length; valInd++ )
  419: +			{
  420: +				if ( values[ valInd ].isEmpty() )
  421: +					continue;
  422: +				board[ rowInd ][ cellInd ] = new BingoCell( Integer.parseInt( values[ valInd ] ) );
  423: +				cellInd++;
  424: +			}
  425: +		}
  426: +
  427: +
  428: +		private void calcFinalScore(
  429: +				int lastRowInd, int lastColInd
  430: +		) {
  431: +			finalScore = 0;
  432: +			for ( int markRowInd = 0; markRowInd < board.length; markRowInd++ )
  433: +			{
  434: +				for ( int markColInd = 0; markColInd < board[ markRowInd ].length; markColInd++ )
  435: +				{
  436: +					if ( ! board[ markRowInd ][ markColInd ].called )
  437: +						finalScore += board[ markRowInd ][ markColInd ].value;
  438: +				}
  439: +			}
  440: +			finalScore *= board[ lastRowInd ][ lastColInd ].value;
  441: +		}
  442: +
  443: +	}
  444: +
  445: +
  446: +	class BingoCell
  447: +	{
  448: +		int value;
  449: +		boolean called = false;
  450: +
  451: +
  452: +		public BingoCell(
  453: +				int adopt
  454: +		) {
  455: +			value = adopt;
  456: +		}
  457: +
  458: +	}
  459: +
  460: +}
  461: +
  462: +
  463: +
  464: +
  465: +
  466: +
  467: +
  468: +
  469: +
  470: +
  471: +
  472: +
  473: +
  474: +
  475: +
  476: +
  477: +
  478: +
  479: diff --git a/src/res/y2021/21_04_example.txt b/src/res/y2021/21_04_example.txt
  480: new file mode 100644
  481: index 0000000..49d17bc
  482: --- /dev/null
  483: +++ b/src/res/y2021/21_04_example.txt
  484: @@ -0,0 +1,19 @@
  485: +7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
  486: +
  487: +22 13 17 11  0
  488: + 8  2 23  4 24
  489: +21  9 14 16  7
  490: + 6 10  3 18  5
  491: + 1 12 20 15 19
  492: +
  493: + 3 15  0  2 22
  494: + 9 18 13 17  5
  495: +19  8  7 25 23
  496: +20 11 10 24  4
  497: +14 21 16 12  6
  498: +
  499: +14 21 17 24  4
  500: +10 16 15  9 19
  501: +18  8 23 26 20
  502: +22 11 13  6  5
  503: + 2  0 12  3  7
  504: \ No newline at end of file
  505: diff --git a/src/res/y2021/21_04_input.txt b/src/res/y2021/21_04_input.txt
  506: new file mode 100644
  507: index 0000000..780a141
  508: --- /dev/null
  509: +++ b/src/res/y2021/21_04_input.txt
  510: @@ -0,0 +1,601 @@
  511: +67,31,58,8,79,18,19,45,38,13,40,62,85,10,21,96,56,55,4,36,76,42,32,34,39,89,6,12,24,57,93,47,41,52,83,61,5,37,28,15,86,23,69,92,70,27,25,53,44,80,65,22,99,43,66,26,11,72,2,98,14,82,87,20,73,46,35,7,1,84,95,74,81,63,78,94,16,60,29,97,91,30,17,54,68,90,71,88,77,9,64,50,0,49,48,75,3,59,51,33
  512: +
  513: +12 75 58 21 87
  514: +55 80 14 63 17
  515: +37 35 76 92 56
  516: +72 68 51 19 38
  517: +91 60 34 30 88
  518: +
  519: + 0 66  5 51  8
  520: +45 57 31  3 62
  521: + 7 60 40 29 90
  522: +80 19 47 86 81
  523: +95 69 68 53 93
  524: +
  525: +30 99 16 34 42
  526: +94 39 83 78 49
  527: +57 81 97 77 52
  528: + 9 61 98 11 89
  529: +85  1 60 90 55
  530: +
  531: +87 49 12 85 88
  532: +67 89  7 35 70
  533: +37 45 93 84  9
  534: +80 58 54 13 22
  535: + 8 71 48 15 39
  536: +
  537: +40 79 34 18 42
  538: +35  8 64  5 63
  539: +93 57 16 10 96
  540: +22 20 23  0 86
  541: +61 78 68 83 12
  542: +
  543: +43 78 64 70 49
  544: +60 54 31 82  9
  545: +10 69  2  1 50
  546: +37 12 16 77 25
  547: +18 14 57 13 91
  548: +
  549: +42 85 53 57 52
  550: +19 41 84 68 28
  551: +39 22 55 51 87
  552: +49 23  5 66 71
  553: +72 83 86 35 50
  554: +
  555: +91 75  9 62 82
  556: +47 37 94  6 55
  557: +96 38  8 19 22
  558: +46 66 54 43 59
  559: + 1  0 26 36 74
  560: +
  561: +19 78 25 10 80
  562: +23 88 95 42 11
  563: +54 85 52 92 31
  564: +73 87  9 17 93
  565: + 2 46 12 24 83
  566: +
  567: +84 73 85 51 89
  568: +41 26 98 11 29
  569: +81  6 35 39 76
  570: +27 10 49  4 92
  571: +55 43 28 45 88
  572: +
  573: +23  0 19 26 73
  574: +72 42 40 58 38
  575: +36 46 18 89 52
  576: +85 35 50 13  1
  577: +66 57 45 81 25
  578: +
  579: +11 71 35  0 95
  580: +45 16 78 33 31
  581: +30 34 25 91 36
  582: +83 58  8  3 62
  583: +67 14 72 93 28
  584: +
  585: +63 41 19 80 27
  586: +69 15 99 75 95
  587: +47 86 52 22 12
  588: +66 43 37  6 97
  589: +13  1  5 71 83
  590: +
  591: +19 42 85 53 31
  592: +36 14 75 39 74
  593: +70 86 97 72 69
  594: +15 20 41  6 21
  595: +26 33 48 98 34
  596: +
  597: + 1 79 21 38 44
  598: +63 71 14 17 87
  599: +41 76 56 49 59
  600: + 3 18  6  4 77
  601: +34 19 88 24 10
  602: +
  603: +78 20 30 54 92
  604: +25 63 81  0 69
  605: +46 87 26 56 40
  606: +90 82 50 84 66
  607: +96 41 18 29 23
  608: +
  609: +34  1 59 55 30
  610: +97 19 82 23 77
  611: +21 52 56 48 24
  612: +29 43 28 99 69
  613: + 4 37 84 76 58
  614: +
  615: +96 10 11 79 40
  616: +90 29 59 73 84
  617: +16 62 74 42 92
  618: +43 32 58 46 34
  619: +75 12 57 22 15
  620: +
  621: +29 82 47 16 12
  622: +78 84 83  0 77
  623: +51 64  5 37  7
  624: +49 70 19 69  8
  625: +67 63  6 43 79
  626: +
  627: +87 67 52 64  8
  628: +55 43 82 50 13
  629: + 3 19 94 54 83
  630: +80 59 15 32 37
  631: + 0 58 12 89 96
  632: +
  633: +95 31 14 77 83
  634: +26 68 33 39 85
  635: +71 56 45 46 30
  636: +44 93 16 17 52
  637: +86  8 27  3 25
  638: +
  639: +27 67 81 30 95
  640: +48 89  7  4  3
  641: +82 90 78 85 44
  642: +22 16 97 92 11
  643: +15 87 47 79 62
  644: +
  645: +49 51 35 87 75
  646: + 3 70  8 43  5
  647: +77 88 73 81 29
  648: +42 62 50 37 85
  649: +26 86 14 38 65
  650: +
  651: +81  9 84  3 37
  652: +33 32  1 54 45
  653: +39 83 82 36  2
  654: +56 28 76 85 40
  655: +96 69 43 24 71
  656: +
  657: +83 72 50 46 34
  658: +15 51 87 44 71
  659: + 8 78 10 94 11
  660: +67 40 85 93 35
  661: +17 23 24  0 61
  662: +
  663: +62 55 47 77 95
  664: +81 20 35  8 78
  665: + 7  9 89 27 51
  666: +80 39 33 63 50
  667: +67 34  4 87 57
  668: +
  669: +72 88 74 46 91
  670: +67 66 32  0  9
  671: + 3 69 94  6 81
  672: +40 95 29 83 20
  673: +80 68 55 54  2
  674: +
  675: +72 68 65 91 81
  676: +52 34 88 46 48
  677: +66  4 54 27 62
  678: +83 60 69 26 56
  679: +19 11 35 22 84
  680: +
  681: +72 69 92 87 83
  682: +55 95 85 66  1
  683: +16  3 86  5 99
  684: +24 22 29 53 90
  685: +76 73 48 80 42
  686: +
  687: +38 22 94 50 20
  688: +40 52 61 39 62
  689: + 7 35 95 54 66
  690: +37 59 84 76  2
  691: +81 85  0 48  6
  692: +
  693: +90 95 34 93  8
  694: +46 13  6 58 85
  695: +91 89 83 80 18
  696: +56 57 44 99 17
  697: +21 42 12 74 38
  698: +
  699: +28 61 78 99 23
  700: +75 64 37 66 50
  701: +53 70 89 17 63
  702: +43 38 71 26 85
  703: + 4 13  2 27 18
  704: +
  705: +35 12 60  7 29
  706: +87 65 17 81 10
  707: +42 62 99 38 51
  708: + 2 57 92 27 89
  709: +82 58 97 36 72
  710: +
  711: +43 45  5 99 51
  712: +88  4 13 39 95
  713: +44 56 31 33 94
  714: +37 57 12  3 91
  715: +50 74  6 76 30
  716: +
  717: +67 85 56 69 84
  718: +74 65 61 66  8
  719: +43 50 55 25 97
  720: +78 15 49 73 27
  721: +71 44 93 23 64
  722: +
  723: +83 38 97 85 76
  724: +55 90 46 34 12
  725: + 1 52 18 59 48
  726: +62 63 30 82 92
  727: +68 95  0 72 84
  728: +
  729: +40 10 62 77 75
  730: +93 94 32 27 60
  731: +26 12 14 35 57
  732: +88 53 97 95 24
  733: +66 46 33  3 63
  734: +
  735: +25 44 90 34 17
  736: +91 93 42 37 86
  737: +95 41 82 92 31
  738: +65 35 52 40 84
  739: +85 57 71 19 29
  740: +
  741: +77 38 15 12  9
  742: +65 78 39 81 33
  743: +35 64 96 76 71
  744: +68 93 79 22 40
  745: +88 87 27  7 29
  746: +
  747: +10 81  7 92 64
  748: +60 25 11  6 87
  749: +34 49 20 13  0
  750: +48 38 14 61 75
  751: +71 86 39 37 22
  752: +
  753: +63 67 82 98 18
  754: +11 95  4 55 44
  755: +42 10 84 73 19
  756: +17 57 53 61 49
  757: + 7 32 24 75 58
  758: +
  759: +50 90  1 98 41
  760: +77  4 87 69 19
  761: +48 44 68 10 17
  762: +96 66 71 61 45
  763: +18 86 26 73 16
  764: +
  765: + 5 58 68 34 85
  766: +44 89 72 21 27
  767: + 0 50 39 94 82
  768: +23 13 41 81  6
  769: +83 60 61 22 40
  770: +
  771: +59 41 63 92 69
  772: +10 58 29 60  4
  773: +76 15 46 34 85
  774: +13 17 88 86 24
  775: +62 73 19 67 98
  776: +
  777: +96 69 70 87 80
  778: +28 27 40 77  9
  779: +23 52 99  3 60
  780: +81 53 26 45 35
  781: +82 33 71 43 67
  782: +
  783: +30  8 41 71 26
  784: +97 96  0 45 11
  785: +61 12 91  7 50
  786: +22 40 74 55 29
  787: +53 78 43 15  5
  788: +
  789: +93 25 12 62 84
  790: +95 31 87 83 23
  791: +29 41  6 55 17
  792: +33 85 42 20 56
  793: +57  1 65 45 16
  794: +
  795: +76 86 27 75 96
  796: +56 63 45 25 77
  797: +54 44 64 41 13
  798: +60 46 66 12 67
  799: +84 59 39 24  5
  800: +
  801: +79 39 22 84 66
  802: +76 38 99 21 47
  803: +52 73  7 45 94
  804: +70 78 24 16 40
  805: +48 57  9 13 64
  806: +
  807: +17 80 28 51 94
  808: +52 56 24 65 82
  809: +38 96 21 70 23
  810: +60 50 40 32 91
  811: +45 77 37 44 89
  812: +
  813: +18  3 42 68 66
  814: +22 35 95 29 65
  815: + 8 99 72 19  5
  816: +44 80 11 60 76
  817: +59 90 64 57 94
  818: +
  819: +66 97 62 49 89
  820: + 4 41  5  2 23
  821: +54 48 43 45 76
  822: +68 35 14  1 86
  823: +34 47 26 92 95
  824: +
  825: +57 36 52 42 11
  826: +49 83 94 72 26
  827: +91 48 50 88 80
  828: +70 23 81 33 15
  829: +64 90  2 47 18
  830: +
  831: +68 11 16 77 28
  832: +29 56 81 21 63
  833: + 2 88 54 82 40
  834: +69 93 92 55 70
  835: +57 51 25 80  3
  836: +
  837: +10 73  8 27 61
  838: +74 66 47 54  1
  839: +52 17 76  5 20
  840: +70 44 92 59 34
  841: +26 16 11 81 46
  842: +
  843: +10 31 95 17 44
  844: +76 67 19 69 33
  845: +36 70 25 71 99
  846: +56 42 53 46 40
  847: +90 85 81  6 26
  848: +
  849: +17 32 74 57 64
  850: +37 82 92 54 59
  851: +56 87 41 68 73
  852: +44 98 58 95 53
  853: +47 29 71 52 31
  854: +
  855: +19 58 84 14 91
  856: +75 89 18 67  3
  857: +11  5  2 24 37
  858: +62 35 48 56 81
  859: +54 77 16 70 45
  860: +
  861: + 7 20 41 87 74
  862: +17 47 45 96 49
  863: + 4 33 89 31 77
  864: +79 42 52 29 85
  865: +88 27 63 11 75
  866: +
  867: +61 87 90 15 17
  868: +22 82 28 21 93
  869: +65 98 12 23 24
  870: +73 70 42  1 94
  871: +83 79  5 18 55
  872: +
  873: +78 67 22 88 18
  874: + 2 43 14 56 92
  875: +61 32 87 20  8
  876: +28 11  7 12 70
  877: +21 72 36 74 77
  878: +
  879: +27  6 97 66  7
  880: +30 67 12 70 40
  881: +18 61 78 36 23
  882: +44 24 85 74 82
  883: +55 42 51 90 34
  884: +
  885: +98  9 39 42 44
  886: +50 54 43 66 57
  887: +85 58 91 13 11
  888: +67  5 23 59 70
  889: +45 41 87 29 20
  890: +
  891: +97 57 48 42 73
  892: +37 29 50 49 83
  893: +55 38 69 13 44
  894: +52 14 54 94 56
  895: +24 77 16 39 66
  896: +
  897: +31 61 44 38 80
  898: +11  3  0 56  8
  899: +94 81  1 25 19
  900: +71 23 36 66 41
  901: +70 35 77 79 46
  902: +
  903: +17 96 13 25 48
  904: +65 28 41 24 81
  905: +39 87 74 42  5
  906: +36 35 21 60 40
  907: + 3 83 11  1 34
  908: +
  909: +50 52 84 38 57
  910: +15 20 26  3 72
  911: +48 85  4 88 63
  912: +39 34 32 42  7
  913: +86 77 71 94 23
  914: +
  915: +28 60 13 25  0
  916: +22 74 20 75 30
  917: +97  5 21  2 73
  918: + 7 44 14 77 16
  919: +43 68 76 24  1
  920: +
  921: +99 85  4 62 67
  922: +46 86 43 45 77
  923: +42 21 81 47 57
  924: +71 35 23 10 29
  925: +58 60 79 61 48
  926: +
  927: +33 10  7 61 17
  928: +97 91 70 75 48
  929: +81 80 78 34 36
  930: +26 55 73 77 14
  931: +85 84 62  9 16
  932: +
  933: +17 41  3 82 86
  934: +58  0 51 79 29
  935: +60 70 61 95 46
  936: +98 85  1 72 93
  937: + 4 42 89 88 84
  938: +
  939: +95 16 26 32 29
  940: +27 37 51 23 55
  941: +36 10 50 70 57
  942: +60 79 96 40  9
  943: + 3 43 74 94 31
  944: +
  945: +15 56 51 72 62
  946: + 8 63 23 90 67
  947: +93 85 28 70 82
  948: +33 65 89  4 64
  949: +19 58 37 88 75
  950: +
  951: +34 71 60 84 85
  952: +64 87 92 67  8
  953: +42 58  4  9 75
  954: +49 95 26 91 12
  955: +27 56 74 90 20
  956: +
  957: +13 46 27 12 97
  958: +90 25 87 73 41
  959: +50 66 34 15 94
  960: +45 99 88 86 21
  961: +56 37 62 44 29
  962: +
  963: +77 31 59 94 74
  964: +19 15 11 23 68
  965: + 0 36  2 98 30
  966: +44 49 90 83  9
  967: +13 88 69 66 81
  968: +
  969: +31 71 58 11 47
  970: +42 41 10 83 21
  971: +38  9 51 17 64
  972: +37 13 93 81 39
  973: +33 22 98 26 43
  974: +
  975: +60 89 20 94  2
  976: +45 34 93 15 30
  977: + 4 16 49 92 28
  978: +67 75 27 61 70
  979: +25 84 55 91 88
  980: +
  981: +85 22 41 43  0
  982: +21 77 12 64 34
  983: +30 39 97 36 72
  984: +56  8 65 82 84
  985: +76  3  4 17 49
  986: +
  987: +16 61 63 41 47
  988: +48 46 37 70 87
  989: +57 31 36 83  1
  990: +71  3 93 24 80
  991: +51 78 91 17 86
  992: +
  993: +87 72 70 97 58
  994: +54 16  1 43 46
  995: +49 28 59 38 51
  996: +24 15 10 84 94
  997: +76 86 55 83 26
  998: +
  999: +93 10  5  1 92
 1000: +99  6 45 79 76
 1001: +74 87 47 25 24
 1002: +50 43  4 21 67
 1003: +81 39 49 12 86
 1004: +
 1005: +49 35 22 27 37
 1006: +90 80 68 52 59
 1007: +78 53 23 65 46
 1008: +30 61 75 97 31
 1009: + 1 76 66 26 48
 1010: +
 1011: +37 11 88 20 99
 1012: +45 96 95 81 39
 1013: +60 55 80 58 53
 1014: + 6 23  8  1 46
 1015: +98 89 16 73 78
 1016: +
 1017: + 0 58 88 69 66
 1018: +82  9 31 97 55
 1019: +22 37 90 79 14
 1020: +44 45 49 43 60
 1021: +93 62 36 57 30
 1022: +
 1023: + 1 34 89 90 46
 1024: +81 26  5  6 14
 1025: +75 74 62 55 37
 1026: +96 58 78 93 73
 1027: +35 40 13 95 45
 1028: +
 1029: +22 57 46 99 42
 1030: +65 39 38  7 81
 1031: + 4  1 76 59  8
 1032: +84 60 37 55 40
 1033: +49 31  5 80 30
 1034: +
 1035: +29  4 96 50 24
 1036: +61 77 70 88 93
 1037: +12 64 52 25 90
 1038: +67 34 59 95 16
 1039: +79 21 82  6 63
 1040: +
 1041: +26 41 52 91 57
 1042: +92 95 33  1 62
 1043: +45 31 87 29 59
 1044: +44 86 99 81  5
 1045: +36 20 58 73 30
 1046: +
 1047: +55 96 28 26 17
 1048: +62 51 64 43 49
 1049: +37 41 36 75 42
 1050: +11 94 87 27 63
 1051: +35 23 21 29  4
 1052: +
 1053: +99 54 74 83 92
 1054: +27 53 15  8 85
 1055: +94 36 63 29 91
 1056: +58 10 45 38 79
 1057: + 9 95 23 98 33
 1058: +
 1059: +52 14 99 30 50
 1060: +29 81 41 28 15
 1061: +43 51 61 56 62
 1062: +68 67 93 45 13
 1063: +23  6 70  8  7
 1064: +
 1065: +73 78 47  2  7
 1066: +45 16 46 65 21
 1067: +60 54 43 12  1
 1068: +20 23 42 56 81
 1069: +89 80 52 26 32
 1070: +
 1071: +79  5 10 11  7
 1072: +87 36  2 70 16
 1073: +99 44 49 43 19
 1074: +46 25  1 18 78
 1075: +55 76  3 73 15
 1076: +
 1077: +18 49 71 59 90
 1078: +97 37 23 68 62
 1079: +48  8 14 81 26
 1080: +88  4 22 76 12
 1081: +60 99 64 17 46
 1082: +
 1083: +99 25 79 42 33
 1084: + 5 28 38 15 11
 1085: + 8 78 51 40 65
 1086: +47  0 12 48 67
 1087: +14 98 53 43 86
 1088: +
 1089: +74 46 42 86 44
 1090: +83 96 61 38 70
 1091: +97  7 49  9 22
 1092: +65 34 66 90 51
 1093: + 0 36 13 85 53
 1094: +
 1095: +43 21 64 86 20
 1096: + 8 55 85 48 15
 1097: +58 49 87 29 35
 1098: +74  4 37 12 99
 1099: +98 69 75 39 71
 1100: +
 1101: +58 65 63 41 87
 1102: +19 49 91 34 37
 1103: +95 10 55 94 82
 1104: +78 71 66 60 96
 1105: +27 11 29 48 72
 1106: +
 1107: + 9 78 51 18 93
 1108: +71 55  0  5 37
 1109: +24 98  2 70 92
 1110: +85 15 46 91 99
 1111: +60 68 41 86 96
 1112: diff --git a/src/res/y2021/21_04_solutions.txt b/src/res/y2021/21_04_solutions.txt
 1113: new file mode 100644
 1114: index 0000000..ec84025
 1115: --- /dev/null
 1116: +++ b/src/res/y2021/21_04_solutions.txt
 1117: @@ -0,0 +1,6 @@
 1118: +
 1119: +example 1 : 4512
 1120: +puzzle 1 : 10680
 1121: +
 1122: +example 2 : 1924
 1123: +puzzle 2 : 31892

Generated by git2html.