Author: Nicholas Prado <nmprado@nzen.ws>
Date: Fri Dec 3 02:01:11 UTC 2021
Parent: f4171cc89f10cffc399b41553fe39c75fa0b51a8
Log message:
checkin 20 07 moved intermediate work to year folder This does not resolve the second part of 2020 exercise seven, but I'm unlikely to return to it, so I might as well commit it.
1: diff --git a/src/java/y2020/Exercise200702.java b/src/java/y2020/Exercise200702.java 2: new file mode 100644 3: index 0000000..1db4c49 4: --- /dev/null 5: +++ b/src/java/y2020/Exercise200702.java 6: @@ -0,0 +1,152 @@ 7: + 8: +import java.io.IOException; 9: +import java.nio.file.*; 10: +import java.util.*; 11: +import java.util.regex.*;; 12: + 13: +public class Exercise200702 14: +{ 15: + 16: + public static void main( String args[] ) 17: + { 18: + final String here = "e20071.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: + */ 38: + // gather 39: + Map<String, Collection<String>> reverseAdjacency = new HashMap<>(); 40: + for ( String line : fileLines ) 41: + { 42: + if ( line.isEmpty() || line.contains( "no other" ) ) 43: + continue; 44: + int firstBagsInd = line.indexOf( "bags" ); 45: + String container = line.substring( 0, firstBagsInd -1 ); 46: +// System.out.println( here +"is "+ container ); 47: + Collection<String> inside = containedIn( line.substring( 48: + firstBagsInd +"bags contain ".length() ) ); 49: + for ( String inner : inside ) 50: + { 51: + if ( ! reverseAdjacency.containsKey( inner ) ) 52: + reverseAdjacency.put( inner, new HashSet<String>() ); 53: + reverseAdjacency.get( inner ).add( container ); 54: + } 55: + } 56: +/* everything 57: +for ( String inner : reverseAdjacency.keySet() ) 58: +{ 59: + System.out.print( inner +";\t" ); 60: + for ( String has : reverseAdjacency.get( inner ) ) 61: + System.out.print( has +", " ); 62: + System.out.println(); 63: +} 64: + System.out.println(); 65: +*/ 66: + // trace adjacency 67: + Queue<String> toCheck = new LinkedList<>(); 68: + int target = 0; 69: + Collection<String> containsGold = reverseAdjacency.get( "shiny gold" ); 70: + if ( containsGold == null ) 71: + throw new RuntimeException( here +"gold not contained by anything" ); 72: +// else 73: +// System.out.println( "gold in "+ containsGold.size() ); 74: + Set<String> outermost = new TreeSet<>(); 75: + outermost.addAll( containsGold ); 76: + toCheck.addAll( containsGold ); 77: + while ( ! toCheck.isEmpty() ) 78: + { 79: + String bag = toCheck.poll(); 80: + if ( bag == null ) 81: + continue; 82: + outermost.add( bag ); 83: + Collection<String> containedBy = reverseAdjacency.get( bag ); 84: +// System.out.println( "huh "+ bag +" in "+ containedBy ); 85: + if ( containedBy == null ) 86: + continue; 87: + 88: +/* 89: +System.out.print( bag +" contained by: "+ containedBy.size() +" " ); 90: +for ( String inner : containedBy ) 91: + System.out.print( "_"+ inner ); 92: +System.out.println( "; left-"+ toCheck.size() ); 93: +*/ 94: + 95: + toCheck.addAll( containedBy ); 96: + } 97: + System.out.println( here +"input summed to "+ outermost.size() ); 98: + } 99: + 100: + 101: + /** expecting '\d+ value bag(s), ...' and not given a 'no other' line. */ 102: + private static Collection<String> containedIn( 103: + String list 104: + ) { 105: +// System.out.print( "\trest is -"+ list ); 106: + Collection<String> inside = new LinkedList<>(); 107: + for ( 108: + int ind = 0; 109: + ind < list.length() && ind >= 0; 110: + ind += 1 111: + ) { 112: + // number 113: + ind = list.indexOf( ' ', ind ) +1; 114: + // color 115: + int end = list.indexOf( "bag", ind ); 116: + String color = list.substring( ind, end -1 ); 117: + inside.add( color ); 118: + ind = list.indexOf( ", ", end ) +2; 119: +//System.out.println( "color "+ color +"; pointing at "+ ind +" is_"+ list.charAt( ind ) ); 120: + if ( ind == 1 ) 121: + break; // added 2 above 122: + 123: + } 124: + /* 125: + light red bags contain 1 bright white bag, 2 muted yellow bags. 126: + bright white bags contain 1 shiny gold bag. 127: + muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. 128: + */ 129: + return inside; 130: + } 131: +} 132: + 133: + 134: + 135: + 136: + 137: + 138: + 139: + 140: + 141: + 142: + 143: + 144: + 145: + 146: + 147: + 148: + 149: + 150: + 151: + 152: + 153: + 154: + 155: + 156: + 157: + 158: + 159: diff --git a/src/res/20_07_example.txt b/src/res/y2020/20_07_example.txt 160: similarity index 100% 161: rename from src/res/20_07_example.txt 162: rename to src/res/y2020/20_07_example.txt 163: diff --git a/src/res/20_07_input.txt b/src/res/y2020/20_07_input.txt 164: similarity index 100% 165: rename from src/res/20_07_input.txt 166: rename to src/res/y2020/20_07_input.txt