Advent of Code 2019

Advent of Code 2019
PU
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
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:

Kopiuj
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);
    }

}
enedil
dla tempFuelMass == 5, tempFuelMass > 0, ale w środku tego obrotu pętli dodajesz do sumy -1.
PU
Faktycznie, zaraz coś pokombinuję z tym warunkiem. Dzięki za podpowiedź.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4923
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.


edytowany 1x, ostatnio: lion137
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
Kopiuj
                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ąć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PU
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
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.

PU
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
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).

Kopiuj
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)));

    }


}
Skoq
Strasznie pogmatwany kod, rozbij sobie może na jakieś mniejsze metody. Ja to zrobiłem w 3 niewielkich metodkach: 1 - wczytanie liczb z pliku do listy, zwracana ofc lista; 2 - metoda, która dla DANEGO (pojedynczego) modułu liczy Ci sumę paliwa (walnij prostego while'a), zwracana liczba i 3 metoda, która streamem leci po liście, w funkcji mapującej referencja do poprzedniej metody, redukcja i gotowe ;p Staraj się tworzyć proste, niewielkie metody, będzie Ci o wiele łatwiej ;p
PU
W wolnej chwili , dla ćwiczenia, uporządkuję to tak jak sugerujesz. Ostatnio za bardzo się rozpraszam od mojego toku nauki javy. Kończę przerabiać kurs Javy EE, do tego kolekcje obiektów z książki Eckela, w drodze zamówiona ksiązka do Javy 8 i do tego dłubię jakiś zadania znalezione w sieci. A czas nie jest z gumy... Trzeba się sprężyć bo chciałbym niedługo zacząć rozsyłać CV.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4923
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:

Kopiuj
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

Shalom
A robie rekurencje ogonową ukradli w tym full_fuel jak już się tak chcesz czepiać? :P
lion137
Dokladnie tak, ukradli mi TCO w Pythonie:), ale przecież TCO to nic innego jak pętla while:)
Shalom
Ale jak bardziej funkcyjnie by wyglądało! :P
lion137
Wyglądało by funkcyjnie, fakt, dostałbym +10 do bycia "cool kid":) a ja tu stare, toporne, while:)
Maciej Cąderek
Maciej Cąderek
To zadanko to akurat i bez TCO pójdzie
Shalom
Ale będzie mało eleganckie... :P
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)