first version of class that tracks target liquid intake over time
This commit is contained in:
		
							
								
								
									
										70
									
								
								DrinkingBar.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								DrinkingBar.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.math.MathContext;
 | 
			
		||||
import java.math.RoundingMode;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.text.DecimalFormat;
 | 
			
		||||
import java.time.LocalTime;
 | 
			
		||||
import java.time.format.DateTimeFormatter;
 | 
			
		||||
import java.time.temporal.ChronoUnit;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
public class DrinkingBar {
 | 
			
		||||
 | 
			
		||||
   private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
 | 
			
		||||
   private static final int MINS_PER_HOUR = 60;
 | 
			
		||||
   private static final int MINS_PER_HALF_HOUR = MINS_PER_HOUR / 2;
 | 
			
		||||
   private static final int MINUTES_BEFORE_PAUSE = 4 * MINS_PER_HOUR + MINS_PER_HALF_HOUR;
 | 
			
		||||
   private static final int MINUTES_WITH_PAUSE = 6 * MINS_PER_HOUR;
 | 
			
		||||
   private static final DecimalFormat LITER_FORMAT = new DecimalFormat("0.00");
 | 
			
		||||
   private static final BigDecimal MINS_PER_HOUR_BD = BigDecimal.valueOf(MINS_PER_HOUR);
 | 
			
		||||
   private static final MathContext MC_INTEGER = new MathContext(1, RoundingMode.HALF_EVEN);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   public static void main(String[] args) throws IOException {
 | 
			
		||||
      var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
 | 
			
		||||
      System.out.print("Ankunftszeit: ");
 | 
			
		||||
      var startTime = LocalTime.parse(br.readLine(), TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      long totalMinutes = 8 * MINS_PER_HOUR + MINS_PER_HALF_HOUR;
 | 
			
		||||
      long passedMinutes = startTime.until(LocalTime.now().truncatedTo(ChronoUnit.MINUTES), ChronoUnit.MINUTES);
 | 
			
		||||
      // long passedMinutes = 0; // DEBUG
 | 
			
		||||
      boolean firstPrint = true;
 | 
			
		||||
      double prevPrintedLitres = 0.0;
 | 
			
		||||
      while (passedMinutes < totalMinutes) {
 | 
			
		||||
         if (passedMinutes <= MINUTES_BEFORE_PAUSE || passedMinutes > MINUTES_WITH_PAUSE) {
 | 
			
		||||
            double currentLitres = 2.0 / totalMinutes * passedMinutes;
 | 
			
		||||
            double printedLitres = currentLitres - (currentLitres % 0.25) + 0.25;
 | 
			
		||||
            String cursorReset = firstPrint ? "" : "\r";
 | 
			
		||||
            if (firstPrint || printedLitres - prevPrintedLitres == 0.25) {
 | 
			
		||||
               System.out.print(cursorReset + "Aktuelles Volumen: " + LITER_FORMAT.format(printedLitres) + "L");
 | 
			
		||||
            }
 | 
			
		||||
            prevPrintedLitres = printedLitres;
 | 
			
		||||
            if (firstPrint) {
 | 
			
		||||
               firstPrint = false;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         try {
 | 
			
		||||
            var now = LocalTime.now();
 | 
			
		||||
            var oneMinuteLater = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
 | 
			
		||||
            // +1 second to adjust for ignored milliseconds as it is better to switch between 00 and 01 as between 59 and 00
 | 
			
		||||
            TimeUnit.SECONDS.sleep(now.until(oneMinuteLater, ChronoUnit.SECONDS) + 1);
 | 
			
		||||
            // TimeUnit.MILLISECONDS.sleep(100L); // DEBUG
 | 
			
		||||
         } catch (InterruptedException ie) {
 | 
			
		||||
            throw new RuntimeException(ie);
 | 
			
		||||
         }
 | 
			
		||||
         passedMinutes++;
 | 
			
		||||
      }
 | 
			
		||||
      System.out.println("");
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   private static String minutesToTimeString(long minutes) { // DEBUG
 | 
			
		||||
      var minutesBD = BigDecimal.valueOf(minutes);
 | 
			
		||||
      BigDecimal[] hoursAndMinutes = minutesBD.divideAndRemainder(MINS_PER_HOUR_BD, MC_INTEGER);
 | 
			
		||||
      return LocalTime.of(hoursAndMinutes[0].intValue(), hoursAndMinutes[1].intValue()).format(TIME_FORMATTER);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user