Advent of Code 2019

0

Bawi się ktoś w Advent of Code? --> https://adventofcode.com/
Jako, że dopiero uczę się programowania i jestem leszczem, to wyłożyłem się już na drugim zadaniu dnia pierwszego. Ale od początku.
W pierwszym zadaniu chodzi o to by policzyć ilość paliwa dla modułów statku kosmicznego. Każdy moduł ma masę, na podstawie której liczy się ilość paliwa:
masa paliwa = masa modułu / 3 (zaokąglona w dół ) - 2.
Masy modułów (jest ich kilkadziesiąt) podane są jako wartości całkowitoliczbowe w jednej kolumnie.
Skopiowałem je więc do pliku txt. Użyełm klasy RandomAccessFile i w pętli while zczytałem, policzyłem i zsumowałem ilość paliwa dla całego statku. Poszło gładko, wynik się zgadzał.

W części drugiej zadania należało uwzględnić także masę paliwa, czyli masę paliwa obliczonego za pierwszym razem, potem paliwo dla paliwa z drugiego obliczenia itd. aż wartość wyjdzie rózwna zero lub ujemna. Ilość paliwa dla paliwa obliczamy tak samo jak wcześniej: masa paliwa = masa paliwa bieżącego / 3(zaokąglona w dół ) - 2.
tu już poszło gorzej. Zagnieździałem kolejną pętlę while i kombinowalem na różne sposoby. Niestety wynik nie jest prawidłowy.
Ktoś to rozwiązał lub ma pomysł?
Poniżej mój upośledzony kod:

import java.io.*;
public class Fuel {
    public static void main(String[] args) {
        if(args.length<1){
            System.out.println("Wywołanie programu");
            return;
        }

        File file = new File(args[0]);

        if(!file.exists()){
            System.out.println("Plik nie istnieje");
            return;
        }
        RandomAccessFile raf = null;
        try{
            raf = new RandomAccessFile(file, "r");
        }catch (FileNotFoundException e){
            System.out.println("Nie znalezono pliku" + e);
        }
        String line = " ";
        int moduleMass = 0;
        double fuelSum = 0.0;

        double finalFuelMass = 0;
        double tempFuelMass;

        try{
            while((line = raf.readLine()) != null){
                moduleMass = Integer.parseInt(line);
                double initFuelMass = moduleMass/3 - 2;
                tempFuelMass = initFuelMass;
                while (tempFuelMass > 0){
                    tempFuelMass = tempFuelMass/3 - 2;
                    finalFuelMass = finalFuelMass + tempFuelMass;
                }
                fuelSum = fuelSum + initFuelMass +finalFuelMass;
            }
            raf.close();
        }catch (IOException e){
            System.out.println("Błąd wejścia/wyjścia");
        }
        System.out.println("Paliwo dla modułów: " + (int)fuelSum);
    }

}
0

Jakie wyniki Ci wychodza dla danych testowych? Nie wnikając w kod, nie powinno być czasem: while (tempFuelMass > 6){? Wtedy ujemne paliwo nie wejdzie do sumy.

0
                while (tempFuelMass > 0){
                    tempFuelMass = tempFuelMass/3 - 2;
                    finalFuelMass = finalFuelMass + tempFuelMass;
                }

Tu masz błąd. Zauważ ze policzyłes nowe tempFuelMass które może być ujemne(!) i tego nie sprawdziłeś, stąd też możesz od final mass coś przypadkiem odjąć.

0

Faktycznie powinno byc (tempFuelMass > 6).
Mam jeszcze jakiś problem z sumowaniem wartości.
W drugiej wersji kodu(nie wklejałem go tu), gdzie liczenie paliwa dla modułów i liczenie paliwa dla paliwa rozbiłem na dwie metody, a później dodałem dwie wartości do siebie, zmiana warunku na tempFuelMass > 6 dała poprawny wynik i zadanie zostało zaliczone.
Niestety w kodzie, który wkleiłem powyżej coś mi źle liczy sumę całkowitą paliwa.

0

Poniżej kod w wersji z dwiema metodami. Policzył prawidłowo. (Wiem, że można było uniknąć powtarzalności kodu ale na szybko kodziłem).

import java.io.*;

public class Fuel {

    static double fuelForFuel(String[] args){
        if(args.length<1){
            System.out.println("Wywołanie programu");

        }

        File file = new File(args[0]);

        if(!file.exists()){
            System.out.println("Plik nie istnieje");

        }
        RandomAccessFile raf = null;
        try{
            raf = new RandomAccessFile(file, "r");
        }catch (FileNotFoundException e){
            System.out.println("Nie znalezono pliku" + e);

        }
        String line = " ";
        int moduleMass;
        double fuelSum = 0.0;
        double finalFuelMass = 0;
        double tempFuelMass;

        try{
            while((line = raf.readLine()) != null){
                moduleMass = Integer.parseInt(line);
                double initFuelMass = moduleMass/3 - 2;
                tempFuelMass = initFuelMass;
                while (tempFuelMass > 6){
                    tempFuelMass = (int)tempFuelMass/3 - 2;
                    finalFuelMass = finalFuelMass + tempFuelMass;
                }

                fuelSum =+ finalFuelMass;
            }
            raf.close();
        }catch (IOException e){
            System.out.println("Błąd wejścia/wyjścia");
        }

        return fuelSum;
    }
    static double fuelForModules(String[] args){
        if(args.length<1){
            System.out.println("Wywołanie programu");
        }

        File file = new File(args[0]);

        if(!file.exists()){
            System.out.println("Plik nie istnieje");
        }
        RandomAccessFile raf = null;
        try{
            raf = new RandomAccessFile(file, "r");
        }catch (FileNotFoundException e){
            System.out.println("Nie znalezono pliku" + e);
        }
        String line = " ";
        int moduleMass = 0;
        double sum = 0.0;

        try{
            while((line = raf.readLine()) != null){
                moduleMass = Integer.parseInt(line);
                double initFuelMass = moduleMass/3 - 2;
                sum = sum + initFuelMass;
            }
            raf.close();
        }catch (IOException e){
            System.out.println("Błąd wejścia/wyjścia");
        }

        return sum;
    }

    public static void main(String[] args) {
        System.out.println("Fuel for modules: " +fuelForModules(args));
        System.out.println("Fuel for fuel: " +fuelForFuel(args));

        System.out.println("Suma: " + (fuelForModules(args) + fuelForFuel(args)));

    }


}
0

Nie Macie w tej Javie, map, reduce, streamów, etc.:)? Wczytaj plik i Zmapuj full_fuel na wejście + reduce = suma. Tak to wygląda w Pythonie:

def full_fuel(num):
	a_sum = 0
	while True:
		if num < 6:
			return a_sum
		t = num // 3 - 2 # // - dzielenie w integerach
		a_sum += t
		num = t
	

def solution(f_name):
	with open(f_name) as f:
		s = sum(full_fuel(int(line)) for line in f) # list comprehension, to samo co map full_fuel na f
		return s

1 użytkowników online, w tym zalogowanych: 0, gości: 1