package de.szimnau; import de.szimnau.tools.CommonTools; import de.szimnau.tools.FormatTools; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.time.LocalTime; import java.time.temporal.ChronoUnit; import static de.szimnau.tools.CommonTools.print; public class DrinkingBar extends AbstractLoadingBar { private static final int MINS_PER_HALF_HOUR = CommonTools.MINS_PER_HOUR / 2; private static final int MINUTES_BEFORE_PAUSE = 4 * CommonTools.MINS_PER_HOUR + MINS_PER_HALF_HOUR; private static final int MINUTES_WITH_PAUSE = 6 * CommonTools.MINS_PER_HOUR; private static final int DEFAULT_TOTAL_TIME = 8 * MINS_PER_HOUR + MINS_PER_HALF_HOUR; private static final DecimalFormat LITER_FORMAT = new DecimalFormat("0.00"); protected DrinkingBar(LocalTime startTime) { super(startTime, DEFAULT_TOTAL_TIME); } public static void main(String[] args) throws IOException { var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); print("Ankunftszeit: "); var startTime = LocalTime.parse(br.readLine(), FormatTools.TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES); var db = new DrinkingBar(startTime); db.showLoadingBar(); } @Override protected String fillLoadingBar(long passedMinutes, boolean progressive) { long effectivePassedMinutes = passedMinutes; if (passedMinutes > MINUTES_BEFORE_PAUSE && passedMinutes <= MINUTES_WITH_PAUSE) { effectivePassedMinutes = MINUTES_BEFORE_PAUSE; } double currentLitres = 2.0 / getTotalMinutes() * effectivePassedMinutes + 0.25; double printedLitres = currentLitres - (currentLitres % 0.25); // double currentProgressToNextStep = 100 / 0.25 * (currentLitres - printedLitres); BigDecimal minutesToNextStep = getMinutesToNextStep(currentLitres); String progressivePart = progressive ? "\r" : ""; return progressivePart + "Aktuelles Volumen: " + LITER_FORMAT.format(printedLitres) + "L - " // + FormatTools.PERCENTAGE_FORMAT.format(currentProgressToNextStep) + "% - " + FormatTools.minutesToTimeString(minutesToNextStep); } private BigDecimal getMinutesToNextStep(double currentLitres) { // berechne Liter benötigt bis zum nächsten 0.25er Schritt double litresToNextStep = 0.25 - (currentLitres % 0.25); // berechne Minuten benötigt für 1 Liter double minutesPerLitre = getTotalMinutes() / 2.0; // berechne Minuten benötigt bis zum nächsten 0.25er Schritt return BigDecimal.valueOf((minutesPerLitre * litresToNextStep) + 1); } }