Created
December 4, 2023 21:33
-
-
Save nickforce/fcbaf252eb9b67849486d85fe5aab2f6 to your computer and use it in GitHub Desktop.
day04
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public with sharing class day04 { | |
public static Integer part2(List<String> puzzleInputLines) { | |
Map<Integer,Integer> cardNumberToCopies = new Map<Integer,Integer>(); | |
Map<Integer,Integer> cardNumberToWinners = new Map<Integer,Integer>(); | |
// iterate each card | |
for(Integer i = 0; i < puzzleInputLines.size(); i++) { | |
String card = puzzleInputLines[i]; | |
Integer cardNumber = Integer.valueOf(card.substring(card.indexOf(' ') + 1, card.indexOf(':')).trim()); | |
Integer totalCardWinners = processTotalCardWinners(puzzleInputLines[i]); | |
cardNumberToCopies.put(cardNumber, 1); | |
cardNumberToWinners.put(cardNumber, totalCardWinners); | |
} | |
for(Integer i = 0; i < puzzleInputLines.size(); i++) { | |
String card = puzzleInputLines[i]; | |
Integer cardNumber = Integer.valueOf(card.substring(card.indexOf(' ') + 1, card.indexOf(':')).trim()); | |
for(Integer y = 1; y <= cardNumberToWinners.get(cardNumber); y++) { | |
Integer nextCardNumber = cardNumber + y; | |
// Your copy of card 2 also wins one copy each of cards 3 and 4. | |
Integer currentCopies = cardNumberToCopies.get(nextCardNumber) + 1; | |
cardNumberToCopies.put(nextCardNumber, currentCopies); | |
} | |
} | |
Integer totalCards = 0; | |
for(Integer copy : cardNumberToCopies.values()) { | |
totalCards += copy; | |
} | |
return totalCards; | |
} | |
public static Integer part1(List<String> puzzleInputLines) { | |
Integer cardPoints = 0; | |
// iterate each card | |
for(Integer i = 0; i < puzzleInputLines.size(); i++) { | |
Integer totalCardWinners = processTotalCardWinners(puzzleInputLines[i]); | |
cardPoints += calculatePoints(totalCardWinners); | |
} | |
return cardPoints; | |
} | |
public static Integer processTotalCardWinners(String card) { | |
String winningNumbers = card.substring(card.indexOf(':') + 1, card.indexOf('|')); | |
String myNumbers = card.substring(card.indexOf('|') + 1, card.length()); | |
List<Integer> resultWinning = new List<Integer>(convertToListOfIntegers(winningNumbers)); | |
List<Integer> resultMyNumbers = convertToListOfIntegers(myNumbers); | |
// card map | |
Map<Set<Integer>,List<Integer>> cardMap = new Map<Set<Integer>,List<Integer>>(); | |
cardMap.put( | |
new Set<Integer>(convertToListOfIntegers(winningNumbers)), | |
convertToListOfIntegers(myNumbers) | |
); | |
return calculateCardWinners(cardMap); | |
} | |
public static Integer calculateCardWinners(Map<Set<Integer>,List<Integer>> cardMap) { | |
Integer cardTotalWinners = 0; | |
for(Set<Integer> winners : cardMap.keySet()) { | |
for(Integer myNumber : cardMap.get(winners)) { | |
if(winners.contains(myNumber)) { | |
cardTotalWinners++; | |
} | |
} | |
} | |
return cardTotalWinners; | |
} | |
public static Integer calculatePoints(Integer cardTotalWinners) { | |
if(cardTotalWinners < 1) { | |
return 0; | |
} | |
// first winner is 1 point | |
Integer points = 1; | |
// double the score for each point after 1 | |
for(Integer i = 2; i <= cardTotalWinners; i++) { | |
points *= 2; | |
} | |
return points; | |
} | |
public static List<Integer> convertToListOfIntegers(String inputString) { | |
List<Integer> integerList = new List<Integer>(); | |
// Split the string into an array of substrings | |
List<String> stringArray = inputString.trim().split(' '); | |
// Convert each substring to an integer and add to the list | |
for(String str : stringArray) { | |
if(String.isNotBlank(str)) { | |
integerList.add(Integer.valueOf(str.trim())); | |
} | |
} | |
return integerList; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment