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/Day5.txt"))){
String line = reader.readLine();
while(line != null){
lines.add(line);
line = reader.readLine();
}
} catch (IOException e){
e.printStackTrace();
}
}
Oppgave 1
Oppgave 1 i luke 5 byr på spesifikk rekkefølge for printing for alvene. Vi blir tildelt en rekke tallpar som indikerer at tall nummer 2 kommer etter tall nummer 1. Dersom tall nummer 2 printes før tall nummer 1, vil det bli feil. Vi skal altså gå gjennom alle printer og sjekke hvilke som er i riktig rekkefølge. Løsningen min for dette ble å lage et HashMap for hvert tall hvor jeg da lagrer alle tallene som kommer etter knyttet opp mot tallet. Det gjør at vi enkelt kan gjør HashMap.get(tall) å få alle tallene som kommer etter. Ved hjelp av dette kjører jeg gjennom og sjekker om neste tall i printingen har noen tall tidligere i printingen som skulle kommer etter seg. Til slutt skal vi da sjekke midterste tall av de riktige print linjene og summere.
Metode for å summere midterste tall i korrekte print linjer:
private static int correctOrder(ArrayList<String> lines){
HashMap<String, String> order = new HashMap<>();
int printingIndex = lines.indexOf("");
int total = 0;
for (int i = 0; i < lines.size(); i++) {
if(i < printingIndex){
String[] numbers = lines.get(i).split("\\|");
String after = order.getOrDefault(numbers[0], "");
after = after + ',' + numbers[1];
order.put(numbers[0], after);
}
if(i > printingIndex){
boolean correct = true;
ArrayList<String> numbers = new ArrayList<>(Arrays.asList(lines.get(i).split(",")));
for(int j = 0; j < numbers.size(); j++){
String after = order.getOrDefault(numbers.get(j), "");
for(int k = 0; k < j; k++){
if(after.contains(numbers.get(k))){
correct = false;
break;
}
}
if(!correct) break;
}
if(correct){
int middle = parseInt(numbers.get(numbers.size() / 2));
total += middle;
}
}
}
return total;
}
I main metoden trenger vi kun å legge til print statement for resultatet.
System.out.println(correctOrder(lines));
Oppgave 2
For oppgave 2 er oppgaven snudd litt på hodet. Istedenfor å telle riktige skal vi nå sortere de som står feil og så summere midterste tall av kun de feilsorterte, etter de er blitt sortert. Vi må gjøre noen endringer fra oppgave 1, og jeg valgte på grunn av dette å heller lage en ny metode for å ha litt greiere oversikt. Vi kunne brukt samme metode i teorien, men det føltes for meg at det ble litt uoversiktelig. Det er også viktig at vi hopper over allerede korrekte lijer. Alternativt kunne vi ha tatt å summert alle for så å kjøre alle minus de korrekte.
Metode for å summere midterste tall i feilsorterte print linjer:
private static int fixNotCorrect(ArrayList<String> lines){
HashMap<String, String> order = new HashMap<>();
int printingIndex = lines.indexOf("");
int total = 0;
for (int i = 0; i < lines.size(); i++) {
if(i < printingIndex){
String[] numbers = lines.get(i).split("\\|");
String after = order.getOrDefault(numbers[0], "");
after = after + ',' + numbers[1];
order.put(numbers[0], after);
}
if(i > printingIndex){
boolean correct = false;
boolean initiallyCorrect = true;
ArrayList<String> numbers = new ArrayList<>(Arrays.asList(lines.get(i).split(",")));
while(!correct) {
int changes = 0;
for (int j = 0; j < numbers.size(); j++) {
String after = order.getOrDefault(numbers.get(j), "");
for (int k = 0; k < j; k++) {
if (after.contains(numbers.get(k))) {
String number = numbers.get(k);
numbers.remove(number);
numbers.add(j, number);
changes++;
}
}
}
if(changes == 0) correct = true;
else if(initiallyCorrect) initiallyCorrect = false;
}
if(!initiallyCorrect) {
int middle = parseInt(numbers.get(numbers.size() / 2));
total += middle;
}
}
}
return total;
}
I main metoden her også trenger vi kun å legge til print statement.
System.out.println(fixNotCorrect(lines));