package io.rudefox.burrow; import java.util.Scanner; import java.util.regex.Pattern; public class InteractiveDice8EntropyGenerator extends InteractiveEntropyGenerator { public InteractiveDice8EntropyGenerator(int targetBitsOfEntropy, Scanner inputScanner, boolean ansiColorOutput) { super(inputScanner, ansiColorOutput, targetBitsOfEntropy, 3); } @Override protected String readNextEventSetString() { StringBuilder eventSetBuffer = new StringBuilder(); int remainingEvents = eventsPerEventSet; Pattern eventSetPattern = Pattern.compile("[1-8]+"); while (remainingEvents > 0) { System.out.printf("Input %d x 8-sided dice rolls [1-8]: ", remainingEvents); String nextInput = inputScanner.next(); if (!eventSetPattern.matcher(nextInput).matches()) { System.out.printf( "Invalid input! Enter %d-digit sequence of digits from 1 to 8 (for example, 8765375812)" + System.lineSeparator(), remainingEvents); continue; } eventSetBuffer.append(nextInput); remainingEvents -= nextInput.length(); } if (remainingEvents < 0) System.out.printf("NOTE: Discarding the %d extra dice roll(s) entered" + System.lineSeparator(), -remainingEvents); return eventSetBuffer.substring(0, eventsPerEventSet); } @Override protected String getEventValueFormatString(int eventIndexWithinSet) { return eventIndexWithinSet == bitsPerEvent || eventIndexWithinSet == 7 ? " %d |" : " %d |"; } @Override protected int toZeroBasedInteger(int eventDecimalValue) { return eventDecimalValue - 1; } @Override protected void outputEventValuesLine(StringBuilder eventValuesLine) { System.out.println(eventValuesLine); } @Override protected StringBuilder getInitialBitsLine() { return new StringBuilder("|"); } @Override protected void padBitsLine(StringBuilder eventSetBitsLine, int bitIndexWithinEventSet, int bitIndexWithinEntropy) { if (bitIndexWithinEventSet == BITS_PER_EVENT_SET - 1) eventSetBitsLine.append("|"); else if (bitIndexWithinEventSet % bitsPerEvent == bitsPerEvent - 1) eventSetBitsLine.append(styleBit(" ", bitIndexWithinEntropy, bitIndexWithinEventSet)); else if (bitIndexWithinEventSet % BITS_PER_WORD == BITS_PER_WORD - 1) eventSetBitsLine.append(" | "); } @Override protected String getSeedWordLineFormatString() { return "|%-15s|%-17s|%-15s|"; } }