Author: Nicholas Prado <nmprado@nzen.ws>
Date: Sat Dec 4 05:30:04 UTC 2021
Parent: dbcceed90ae0239ad9451d837cae064a967b4cdc
Log message:
feat 21 03.2 stepwise sum and discard
1: diff --git a/src/java/y2021/Exercise210302.java b/src/java/y2021/Exercise210302.java 2: new file mode 100644 3: index 0000000..cc6f3e1 4: --- /dev/null 5: +++ b/src/java/y2021/Exercise210302.java 6: @@ -0,0 +1,165 @@ 7: + 8: +import java.io.IOException; 9: +import java.nio.file.*; 10: +import java.util.*; 11: + 12: +public class Exercise210302 13: +{ 14: + 15: + public static void main( 16: + String args[] 17: + ) { 18: + final String here = "e210302.m "; 19: + if ( args.length < 1 ) 20: + { 21: + throw new RuntimeException( here +"add a filename argument" ); 22: + } 23: + String userSaysFile = args[ 0 ]; 24: + List<String> fileLines = new LinkedList<>(); 25: + try 26: + { 27: + Path where = Paths.get( userSaysFile ); 28: + fileLines = Files.readAllLines( where ); 29: + } 30: + catch ( IOException | InvalidPathException ie ) 31: + { 32: + System.err.println( here +"couldn't read file "+ userSaysFile +" because "+ ie ); 33: + return; 34: + } 35: + /* 36: + - interpretation of spec - 37: + sum the bits individually, discard and resum as necessary 38: + */ 39: + Exercise210302.interpretDiagnostic( fileLines ); 40: + } 41: + 42: + 43: + private static void interpretDiagnostic( 44: + List<String> fileLines 45: + ) { 46: + int ones = 0, nils = 0; 47: + int oxygenRating = 0, carbonRating = 0; 48: + List<String> previousCandidates = new ArrayList<>( fileLines.size() ); 49: + previousCandidates.addAll( fileLines ); 50: + List<String> currentCandidates = new LinkedList<>(); 51: + int len = fileLines.get( 0 ).length(); 52: + 53: + // oxygen 54: + for ( int charInd = 0; charInd < len; charInd++ ) 55: + { 56: + ones = 0; 57: + nils = 0; 58: + for ( String line : previousCandidates ) 59: + { 60: + if ( line.charAt( charInd ) == '1' ) 61: + ones += 1; 62: + else // == 0 63: + nils += 1; 64: + } 65: + 66: + char toMatch; 67: + if ( ones > nils ) 68: + toMatch = '1'; 69: + else if ( ones < nils ) 70: + toMatch = '0'; 71: + else 72: + toMatch = '='; // for clarity when comparing == below 73: + for ( String candidate : previousCandidates ) 74: + { 75: + if ( candidate.charAt( charInd ) == toMatch 76: + || ( ones == nils 77: + && candidate.charAt( charInd ) == '1' ) ) 78: + currentCandidates.add( candidate ); 79: + } 80: + if ( currentCandidates.size() == 1 ) 81: + break; 82: + previousCandidates.clear(); 83: + previousCandidates.addAll( currentCandidates ); 84: + currentCandidates.clear(); 85: + } 86: + oxygenRating = Exercise210302.asInt( currentCandidates.get( 0 ) ); 87: + 88: + // carbon 89: + previousCandidates.clear(); 90: + previousCandidates.addAll( fileLines ); 91: + currentCandidates.clear(); 92: + for ( int charInd = 0; charInd < len; charInd++ ) 93: + { 94: + ones = 0; 95: + nils = 0; 96: + for ( String line : previousCandidates ) 97: + { 98: + if ( line.charAt( charInd ) == '1' ) 99: + ones += 1; 100: + else // == 0 101: + nils += 1; 102: + } 103: + 104: + char toMatch; 105: + if ( ones < nils ) 106: + toMatch = '1'; 107: + else if ( ones > nils ) 108: + toMatch = '0'; 109: + else 110: + toMatch = '='; // for clarity when comparing == below 111: + for ( String candidate : previousCandidates ) 112: + { 113: + if ( candidate.charAt( charInd ) == toMatch 114: + || ( ones == nils 115: + && candidate.charAt( charInd ) == '0' ) ) 116: + currentCandidates.add( candidate ); 117: + } 118: + if ( currentCandidates.size() == 1 ) 119: + break; 120: + previousCandidates.clear(); 121: + previousCandidates.addAll( currentCandidates ); 122: + currentCandidates.clear(); 123: + } 124: + carbonRating = Exercise210302.asInt( currentCandidates.get( 0 ) ); 125: + 126: + System.out.println( "\to"+ oxygenRating +" c"+ carbonRating +" t"+ oxygenRating * carbonRating ); 127: + } 128: + 129: + 130: + private static int asInt( 131: + String bitChars 132: + ) { 133: + int value = 0, multiplier = 1; 134: + for ( int charInd = bitChars.length() -1; charInd >= 0; charInd-- ) 135: + { 136: + if ( bitChars.charAt( charInd ) == '1' ) 137: + value += multiplier; 138: + multiplier *= 2; 139: + } 140: + return value; 141: + } 142: + 143: + 144: +} 145: + 146: + 147: + 148: + 149: + 150: + 151: + 152: + 153: + 154: + 155: + 156: + 157: + 158: + 159: + 160: + 161: + 162: + 163: + 164: + 165: + 166: + 167: + 168: + 169: + 170: + 171: + 172: diff --git a/src/res/y2021/21_03_solutions.txt b/src/res/y2021/21_03_solutions.txt 173: new file mode 100644 174: index 0000000..15f4557 175: --- /dev/null 176: +++ b/src/res/y2021/21_03_solutions.txt 177: @@ -0,0 +1,6 @@ 178: + 179: +example 1 : 198 180: +puzzle 1 : 1071734 181: + 182: +example 2 : 230 183: +puzzle 2 : 6124992