Full kode finner du her.
Main metode
For alle oppgavene i 2024 bruker jeg Java, og dette vil være metoden jeg bruker for å hente input for de ulike oppgavene. Input blir lagret i en txt fil og hentes via denne metoden.
public static void main(String[] args){
ArrayList<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new FileReader("2024/inputs/Day3.txt"))){
String line = reader.readLine();
while(line != null){
lines.add(line);
line = reader.readLine();
}
} catch (IOException e){
e.printStackTrace();
}
}
Oppgave 1
Oppgave 1 på dag 3, nøkkelord: regex. Jeg har personlig ikke så mye erfaring med regex annet enn veldig simpelt bruk, så dette var en dag for læring. Jeg startet ved å lese dokumentasjon for regex for å finne ut hvordan jeg kunne konstruere en regex som matcher mul(X,Y). Det oppsto også et problem ved at den “ene strengen” er flere strenger, så en StringBuilder måtte til for å sette sammen strengene, og kjøre matching.
Metoden for å finne riktig mønster og summere opp tallene etter multiplikasjon. Vi returnerer totalsummen.
private static int multiply(StringBuilder input){
Pattern pattern = Pattern.compile("mul\\(\\d+,\\d+\\)");
Matcher matcher = pattern.matcher(input.toString());
int total = 0;
while (matcher.find()) {
String match = matcher.group();
match = match.substring(4, match.length()-1);
String[] numbers = match.split(",");
total += parseInt(numbers[0]) * parseInt(numbers[1]);
}
return total;
}
I main metoden trenger vi kun å legge til print statement for resultatet.
System.out.println(multiply(lines));
Oppgave 2
For oppgave 2 skal vi kun multiplisere dersom det er instruert ved do(), og ikke dersom det er instruert ved don’t(). For å løse denne oppgaven la jeg inn en boolean variabel for multiplisering. Fra start er den satt til true, og dersom matchen er don’t() settes den til false, mens do() setter den til true. Dersom den er true multipliseres tallene. Dette gjorde at vi også måtte ha en ny pattern for å matche don’t() og do().
private static int multiplyDo(StringBuilder input){
Pattern pattern = Pattern.compile("mul\\(\\d+,\\d+\\)|do\\(\\)|don't\\(\\)");
Matcher matcher = pattern.matcher(input.toString());
int totalDo = 0;
boolean multiply = true;
while(matcher.find()){
String match = matcher.group();
if(match.equals("do()")) multiply = true;
if(match.equals("don't()")) multiply = false;
if(multiply && !match.equals("do()")){
match = match.substring(4, match.length()-1);
String[] numbers = match.split(",");
totalDo += parseInt(numbers[0]) * parseInt(numbers[1]);
}
}
return totalDo;
}
I main metoden her også trenger vi kun å legge til print statement.
System.out.println(multiplyDo(lines));