From fcb8adeaa161900b2d1dff47728e8ae50d038647 Mon Sep 17 00:00:00 2001 From: toharrius Date: Sun, 20 Nov 2022 15:39:34 +0300 Subject: [PATCH 01/18] .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea From f8da3456e8345f2d7ba2d1245142f340e8a26216 Mon Sep 17 00:00:00 2001 From: toharrius Date: Sun, 20 Nov 2022 20:17:08 +0300 Subject: [PATCH 02/18] Create classes & Implement Quiz --- lab-01/by/toharrius/quizer/Main.java | 25 +++++ lab-01/by/toharrius/quizer/Quiz.java | 98 +++++++++++++++++++ lab-01/by/toharrius/quizer/Result.java | 10 ++ lab-01/by/toharrius/quizer/Task.java | 20 ++++ lab-01/by/toharrius/quizer/TaskGenerator.java | 16 +++ 5 files changed, 169 insertions(+) create mode 100644 lab-01/by/toharrius/quizer/Main.java create mode 100644 lab-01/by/toharrius/quizer/Quiz.java create mode 100644 lab-01/by/toharrius/quizer/Result.java create mode 100644 lab-01/by/toharrius/quizer/Task.java create mode 100644 lab-01/by/toharrius/quizer/TaskGenerator.java diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java new file mode 100644 index 0000000..4412a03 --- /dev/null +++ b/lab-01/by/toharrius/quizer/Main.java @@ -0,0 +1,25 @@ +package by.toharrius.quizer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; + +public class Main { + /** + * @return тесты в {@link Map}, где + * ключ - название теста {@link String} + * значение - сам тест {@link by.toharrius.quizer.Quiz} + */ + static Map getQuizMap() { + return null; + } + + public static void main(String[] args) throws IOException { + var br = new BufferedReader(new InputStreamReader(System.in)); + for (;;) { + var str = br.readLine(); + System.out.println(str); + } + } +} diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java new file mode 100644 index 0000000..f5caa64 --- /dev/null +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -0,0 +1,98 @@ +package by.toharrius.quizer; + +import by.toharrius.quizer.Task; + +/** + * Class, который описывает один тест + */ +class Quiz { + private int correctAnswerNumber = 0; + private int wrongAnswerNumber = 0; + private int incorrectInputNumber = 0; + private TaskGenerator taskGenerator; + private int taskCount; + private Task currentTask = null; + private Result lastResult = null; + /** + * @param generator генератор заданий + * @param taskCount количество заданий в тесте + */ + Quiz(TaskGenerator generator, int taskCount) { + this.taskGenerator = generator; + this.taskCount = taskCount; + } + + /** + * @return задание, повторный вызов вернет следующее + * @see Task + */ + Task nextTask() { + if (lastResult == Result.INCORRECT_INPUT) { + currentTask = taskGenerator.generate(); + } + return currentTask; + } + + /** + * Предоставить ответ ученика. Если результат {@link Result#INCORRECT_INPUT}, то счетчик неправильных + * ответов не увеличивается, а {@link #nextTask()} в следующий раз вернет тот же самый объект {@link Task}. + */ + Result provideAnswer(String answer) { + lastResult = currentTask.validate(answer); + switch (lastResult) { + case OK: { + ++correctAnswerNumber; + } + case WRONG: { + ++wrongAnswerNumber; + } + case INCORRECT_INPUT: { + ++incorrectInputNumber; + } + } + return lastResult; + } + + /** + * @return завершен ли тест + */ + boolean isFinished() { + return getCorrectAnswerNumber() + + getWrongAnswerNumber() == taskCount; + } + + /** + * @return количество правильных ответов + */ + int getCorrectAnswerNumber() { + return correctAnswerNumber; + } + + /** + * @return количество неправильных ответов + */ + int getWrongAnswerNumber() { + return wrongAnswerNumber; + } + + /** + * @return количество раз, когда был предоставлен неправильный ввод + */ + int getIncorrectInputNumber() { + return incorrectInputNumber; + } + + int getTotalAnswerNumber() { + return getCorrectAnswerNumber() + + getIncorrectInputNumber() + + getWrongAnswerNumber(); + } + + /** + * @return Оценка, которая является отношением количества правильных ответов к количеству всех вопросов. + * Оценка выставляется только в конце! + */ + double getMark() { + return (double)getCorrectAnswerNumber() / getTotalAnswerNumber(); + } +} diff --git a/lab-01/by/toharrius/quizer/Result.java b/lab-01/by/toharrius/quizer/Result.java new file mode 100644 index 0000000..8f90f0a --- /dev/null +++ b/lab-01/by/toharrius/quizer/Result.java @@ -0,0 +1,10 @@ +package by.toharrius.quizer; + +/** + * Enum, который описывает результат ответа на задание + */ +enum Result { + OK, // Получен правильный ответ + WRONG, // Получен неправильный ответ + INCORRECT_INPUT // Некорректный ввод. Например, текст, когда ожидалось число +} diff --git a/lab-01/by/toharrius/quizer/Task.java b/lab-01/by/toharrius/quizer/Task.java new file mode 100644 index 0000000..e48f890 --- /dev/null +++ b/lab-01/by/toharrius/quizer/Task.java @@ -0,0 +1,20 @@ +package by.toharrius.quizer; + +/** + * Interface, который описывает одно задание + */ +interface Task { + /** + @return текст задания + */ + String getText(); + + /** + * Проверяет ответ на задание и возвращает результат + * + * @param answer ответ на задание + * @return результат ответа + * @see Result + */ + Result validate(String answer); +} diff --git a/lab-01/by/toharrius/quizer/TaskGenerator.java b/lab-01/by/toharrius/quizer/TaskGenerator.java new file mode 100644 index 0000000..80776dd --- /dev/null +++ b/lab-01/by/toharrius/quizer/TaskGenerator.java @@ -0,0 +1,16 @@ +package by.toharrius.quizer; + +import by.toharrius.quizer.Task; + +/** + * Interface, который описывает один генератор заданий + */ +interface TaskGenerator { + /** + * Возвращает задание. При этом новый объект может не создаваться, если класс задания иммутабельный + * + * @return задание + * @see Task + */ + Task generate(); +} From 868012c9b3f6a8e0abf2d4d86d5779389e1e2abb Mon Sep 17 00:00:00 2001 From: toharrius Date: Sun, 20 Nov 2022 20:17:57 +0300 Subject: [PATCH 03/18] .gitignore --- .gitignore | 1 + lab-01/README.md | 68 ++++++++++++++++++++++++++++++------------------ 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 485dee6..553042b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +out/ diff --git a/lab-01/README.md b/lab-01/README.md index ac1aae2..6ed7ecc 100644 --- a/lab-01/README.md +++ b/lab-01/README.md @@ -46,6 +46,8 @@ interface Task { ### TaskGenerator ```java +import by.toharrius.quizer.Task; + /** * Interface, который описывает один генератор заданий */ @@ -61,7 +63,10 @@ interface TaskGenerator { ``` ### Quiz + ```java +import by.toharrius.quizer.Task; + /** * Class, который описывает один тест */ @@ -70,10 +75,10 @@ class Quiz { * @param generator генератор заданий * @param taskCount количество заданий в тесте */ - Quiz(TaskGenerator generator, int taskCount) { + Quiz(TaskGenerator generator, int taskCount) { // ... } - + /** * @return задание, повторный вызов вернет слелующее * @see Task @@ -81,7 +86,7 @@ class Quiz { Task nextTask() { // ... } - + /** * Предоставить ответ ученика. Если результат {@link Result#INCORRECT_INPUT}, то счетчик неправильных * ответов не увеличивается, а {@link #nextTask()} в следующий раз вернет тот же самый объект {@link Task}. @@ -89,35 +94,35 @@ class Quiz { Result provideAnswer(String answer) { // ... } - + /** * @return завершен ли тест */ boolean isFinished() { // ... } - + /** * @return количество правильных ответов */ int getCorrectAnswerNumber() { // ... } - + /** * @return количество неправильных ответов */ int getWrongAnswerNumber() { // ... } - + /** * @return количество раз, когда был предоставлен неправильный ввод */ int getIncorrectInputNumber() { // ... } - + /** * @return оценка, которая является отношением количества правильных ответов к количеству всех вопросов. * Оценка выставляется только в конце! @@ -137,11 +142,11 @@ class Quiz { /** * @return тесты в {@link Map}, где * ключ - название теста {@link String} - * значение - сам тест {@link Quiz} + * значение - сам тест {@link by.toharrius.quizer.Quiz} */ -static Map getQuizMap() { - // ... -} +static Map getQuizMap(){ + // ... + } ``` ### public static void main() @@ -237,6 +242,8 @@ class EquationTaskGenerator implements TaskGenerator { `TaskGenerator`, который позволяет объединить несколько других `TaskGenerator`. ```java +import by.toharrius.quizer.Task; + class GroupTaskGenerator implements TaskGenerator { /** * Конструктор с переменным числом аргументов @@ -271,6 +278,8 @@ class GroupTaskGenerator implements TaskGenerator { `TaskGenerator`, который отдает задания из заранее заготовленного набора. ```java +import by.toharrius.quizer.Task; + class PoolTaskGenerator implements TaskGenerator { /** * Конструктор с переменным числом аргументов @@ -279,8 +288,8 @@ class PoolTaskGenerator implements TaskGenerator { * @param tasks задания, которые в конструктор передаются через запятую */ PoolTaskGenerator( - boolean allowDuplicate, - Task... tasks + boolean allowDuplicate, + Task... tasks ) { // ... } @@ -292,8 +301,8 @@ class PoolTaskGenerator implements TaskGenerator { * @param tasks задания, которые передаются в конструктор в Collection (например, {@link LinkedList}) */ PoolTaskGenerator( - boolean allowDuplicate, - Collection tasks + boolean allowDuplicate, + Collection tasks ) { // ... } @@ -310,6 +319,8 @@ class PoolTaskGenerator implements TaskGenerator { ### TextTask ```java +import by.toharrius.quizer.Task; + /** * Задание с заранее заготовленным текстом. * Можно использовать {@link PoolTaskGenerator}, чтобы задавать задания такого типа. @@ -320,12 +331,12 @@ class TextTask implements Task { * @param answer ответ на задание */ TextTask( - String text, - String answer + String text, + String answer ) { // ... } - + // ... } ``` @@ -367,27 +378,32 @@ default int getDiffNumber(); ```java interface Task { - interface Generator { /* ... */ } + interface Generator { /* ... */ + } // ... } -interface MathTask extends Task { - interface Generator extends Task.Generator { /* ... */ } +interface MathTask extends by.toharrius.quizer.Task { + interface Generator extends by.toharrius.quizer.Task.Generator { /* ... */ + } // ... } -abstract class AbstractMathTask implements Task { - static abstract class Generator implements MathTask.Generator { /* ... */ } +abstract class AbstractMathTask implements by.toharrius.quizer.Task { + static abstract class Generator implements MathTask.Generator { /* ... */ + } // ... } class ExpressionTask extends AbstractMathTask { - static class Generator extends AbstractMathTask.Generator { /* ... */ } + static class Generator extends AbstractMathTask.Generator { /* ... */ + } // ... } class EquationTask extends AbstractMathTask { - static class Generator extends AbstractMathTask.Generator { /* ... */ } + static class Generator extends AbstractMathTask.Generator { /* ... */ + } // ... } ``` From e182df11538b2a23b75479f9678266ea844e765c Mon Sep 17 00:00:00 2001 From: toharrius Date: Sun, 20 Nov 2022 20:28:27 +0300 Subject: [PATCH 04/18] Fix typo --- lab-01/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab-01/README.md b/lab-01/README.md index 6ed7ecc..56242d1 100644 --- a/lab-01/README.md +++ b/lab-01/README.md @@ -409,7 +409,7 @@ class EquationTask extends AbstractMathTask { ``` ## ★ Real ExpressionTask и EquationTask -Сделайте, чтобы `ExpressionTaskGenerator` и `EquationTaskGenerator` работал с double вместо int. Так же нужно изменить сигнатуру в методах `getMinNumber()`, `getMaxNumnber()`, `getDiffNumber` интерфейса `MathTask`, чтобы они возвращали double. +Сделайте, чтобы `ExpressionTaskGenerator` и `EquationTaskGenerator` работал с double вместо int. Также нужно изменить сигнатуру в методах `getMinNumber()`, `getMaxNumnber()`, `getDiffNumber` интерфейса `MathTask`, чтобы они возвращали double. Добавьте в `ExpressionTaskGenerator` и `EquationTaskGenerator` конструктор, который после `maxNumber` принимает еще `int precision` - количество знаков после запятой в генерируемых числах. В других конструкторах считается, что `precision = 0`, т.e. генерируются только целые числа. From e5abc122fc3a59a7f749c328fed75ba1196ea62d Mon Sep 17 00:00:00 2001 From: toharrius Date: Tue, 22 Nov 2022 22:40:41 +0300 Subject: [PATCH 05/18] Implement EquationTask & ExpressionTask --- lab-01/by/toharrius/quizer/MathOperation.java | 35 +++++++++++ lab-01/by/toharrius/quizer/Result.java | 2 +- lab-01/by/toharrius/quizer/Task.java | 2 +- lab-01/by/toharrius/quizer/TaskGenerator.java | 2 +- .../EquationTaskGenerator.java | 58 +++++++++++++++++++ .../ExpressionTaskGenerator.java | 48 +++++++++++++++ .../toharrius/quizer/tasks/EquationTask.java | 15 +++++ .../quizer/tasks/ExpressionTask.java | 37 ++++++++++++ .../by/toharrius/quizer/tasks/TextTask.java | 38 ++++++++++++ 9 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 lab-01/by/toharrius/quizer/MathOperation.java create mode 100644 lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java create mode 100644 lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java create mode 100644 lab-01/by/toharrius/quizer/tasks/EquationTask.java create mode 100644 lab-01/by/toharrius/quizer/tasks/ExpressionTask.java create mode 100644 lab-01/by/toharrius/quizer/tasks/TextTask.java diff --git a/lab-01/by/toharrius/quizer/MathOperation.java b/lab-01/by/toharrius/quizer/MathOperation.java new file mode 100644 index 0000000..42bcb04 --- /dev/null +++ b/lab-01/by/toharrius/quizer/MathOperation.java @@ -0,0 +1,35 @@ +package by.toharrius.quizer; + +public enum MathOperation { + ADD, + SUBTRACT, + DIVIDE, + MULTIPLY; + + public String toString() { + return switch (this) { + case ADD -> "+"; + case SUBTRACT -> "-"; + case DIVIDE -> "/"; + case MULTIPLY -> "*"; + }; + } + + public int eval(int a, int b) { + return switch (this) { + case ADD -> a + b; + case SUBTRACT -> a - b; + case DIVIDE -> a / b; + case MULTIPLY -> a * b; + }; + } + + public double eval(double a, double b) { + return switch (this) { + case ADD -> a + b; + case SUBTRACT -> a - b; + case DIVIDE -> a / b; + case MULTIPLY -> a * b; + }; + } +} diff --git a/lab-01/by/toharrius/quizer/Result.java b/lab-01/by/toharrius/quizer/Result.java index 8f90f0a..570cd28 100644 --- a/lab-01/by/toharrius/quizer/Result.java +++ b/lab-01/by/toharrius/quizer/Result.java @@ -3,7 +3,7 @@ /** * Enum, который описывает результат ответа на задание */ -enum Result { +public enum Result { OK, // Получен правильный ответ WRONG, // Получен неправильный ответ INCORRECT_INPUT // Некорректный ввод. Например, текст, когда ожидалось число diff --git a/lab-01/by/toharrius/quizer/Task.java b/lab-01/by/toharrius/quizer/Task.java index e48f890..bdf7389 100644 --- a/lab-01/by/toharrius/quizer/Task.java +++ b/lab-01/by/toharrius/quizer/Task.java @@ -3,7 +3,7 @@ /** * Interface, который описывает одно задание */ -interface Task { +public interface Task { /** @return текст задания */ diff --git a/lab-01/by/toharrius/quizer/TaskGenerator.java b/lab-01/by/toharrius/quizer/TaskGenerator.java index 80776dd..81aa2c7 100644 --- a/lab-01/by/toharrius/quizer/TaskGenerator.java +++ b/lab-01/by/toharrius/quizer/TaskGenerator.java @@ -5,7 +5,7 @@ /** * Interface, который описывает один генератор заданий */ -interface TaskGenerator { +public interface TaskGenerator { /** * Возвращает задание. При этом новый объект может не создаваться, если класс задания иммутабельный * diff --git a/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java new file mode 100644 index 0000000..0e14171 --- /dev/null +++ b/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java @@ -0,0 +1,58 @@ +package by.toharrius.quizer.task_generators; + +import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; +import by.toharrius.quizer.tasks.EquationTask; +import by.toharrius.quizer.tasks.ExpressionTask; + +import java.util.EnumSet; +import java.util.concurrent.ThreadLocalRandom; + +public class EquationTaskGenerator implements TaskGenerator { + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param generateSum разрешить генерацию с оператором + + * @param generateDifference разрешить генерацию с оператором - + * @param generateMultiplication разрешить генерацию с оператором * + * @param generateDivision разрешить генерацию с оператором / + */ + private final int least; + private final int bound; + private final EnumSet allowed; + + EquationTaskGenerator( + int minNumber, + int maxNumber, + boolean generateSum, + boolean generateDifference, + boolean generateMultiplication, + boolean generateDivision + ) { + least = minNumber; + bound = maxNumber + 1; + allowed = EnumSet.noneOf(MathOperation.class); + if (generateSum) allowed.add(MathOperation.ADD); + if (generateDifference) allowed.add(MathOperation.SUBTRACT); + if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); + if (generateDivision) allowed.add(MathOperation.DIVIDE); + } + + /** + * return задание типа {@link EquationTask} + */ + @Override + public EquationTask generate() { + var r = ThreadLocalRandom.current(); + int a = r.nextInt(least, bound); + int b = r.nextInt(least, bound); + var stream = allowed.stream(); + var index = r.nextLong(stream.count()); + var op = stream.skip(index).findFirst().get(); + var ans = op.eval(a, b); + return r.nextBoolean() + ? new EquationTask(a, op, ans, b) + : new EquationTask(op, a, ans, b); + } +} diff --git a/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java new file mode 100644 index 0000000..fadd930 --- /dev/null +++ b/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java @@ -0,0 +1,48 @@ +package by.toharrius.quizer.task_generators; + +import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.TaskGenerator; +import by.toharrius.quizer.tasks.ExpressionTask; + +import java.util.EnumSet; +import java.util.concurrent.ThreadLocalRandom; + +public class ExpressionTaskGenerator implements TaskGenerator { + private final int least; + private final int bound; + private final EnumSet allowed; + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param generateSum разрешить генерацию с оператором + + * @param generateDifference разрешить генерацию с оператором - + * @param generateMultiplication разрешить генерацию с оператором * + * @param generateDivision разрешить генерацию с оператором / + */ + ExpressionTaskGenerator( + int minNumber, + int maxNumber, + boolean generateSum, + boolean generateDifference, + boolean generateMultiplication, + boolean generateDivision + ) { + least = minNumber; + bound = maxNumber + 1; + allowed = EnumSet.noneOf(MathOperation.class); + if (generateSum) allowed.add(MathOperation.ADD); + if (generateDifference) allowed.add(MathOperation.SUBTRACT); + if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); + if (generateDivision) allowed.add(MathOperation.DIVIDE); + } + @Override + public ExpressionTask generate() { + var r = ThreadLocalRandom.current(); + int a = r.nextInt(least, bound); + int b = r.nextInt(least, bound); + var stream = allowed.stream(); + var index = r.nextLong(stream.count()); + var op = stream.skip(index).findFirst().get(); + return new ExpressionTask(a, op, b); + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/EquationTask.java new file mode 100644 index 0000000..1b153c5 --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/EquationTask.java @@ -0,0 +1,15 @@ +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.Result; +import by.toharrius.quizer.Task; + +public class EquationTask extends TextTask implements Task { + public EquationTask(MathOperation op, int constant, int answer, int x) { + super("x " + op + " " + constant + " = " + answer, String.valueOf(x)); + } + + public EquationTask(int constant, MathOperation op, int answer, int x) { + super(String.valueOf(constant) + op + " x = " + answer, String.valueOf(x)); + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java new file mode 100644 index 0000000..637c551 --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java @@ -0,0 +1,37 @@ +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.Result; +import by.toharrius.quizer.Task; + +public class ExpressionTask implements Task { + private final int a; + private final MathOperation operation; + private final int b; + private final int result; + + public ExpressionTask(int a, MathOperation operation, int b) { + this.a = a; + this.operation = operation; + this.b = b; + this.result = operation.eval(a, b); + } + + @Override + public String getText() { + return String.valueOf(a) + ' ' + operation + ' ' + b + " = "; + } + + @Override + public Result validate(String answer) { + try { + if (Integer.parseInt(answer) == result) { + return Result.OK; + } else { + return Result.WRONG; + } + } catch (NumberFormatException e) { + return Result.INCORRECT_INPUT; + } + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/TextTask.java b/lab-01/by/toharrius/quizer/tasks/TextTask.java new file mode 100644 index 0000000..ba48d51 --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/TextTask.java @@ -0,0 +1,38 @@ +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.Result; +import by.toharrius.quizer.Task; + +/** + * Задание с заранее заготовленным текстом. + * Можно использовать {@link PoolTaskGenerator}, чтобы задавать задания такого типа. + */ +class TextTask implements Task { + private final String text; + private final String answer; + /** + * @param text текст задания + * @param answer ответ на задание + */ + TextTask( + String text, + String answer + ) { + this.text = text; + this.answer = answer; + } + + @Override + public String getText() { + return text; + } + + @Override + public Result validate(String answer) { + return answer.isEmpty() + ? Result.INCORRECT_INPUT + : answer.equals(this.answer) + ? Result.OK + : Result.WRONG; + } +} From e69ab12603dca0708c522460d5a274e99bd0561c Mon Sep 17 00:00:00 2001 From: toharrius Date: Tue, 22 Nov 2022 23:03:51 +0300 Subject: [PATCH 06/18] Implement GroupTaskGenerator --- .../task_generators/GroupTaskGenerator.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java diff --git a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java new file mode 100644 index 0000000..678eaf0 --- /dev/null +++ b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java @@ -0,0 +1,44 @@ +package by.toharrius.quizer.task_generators; + +import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.concurrent.ThreadLocalRandom; + +class GroupTaskGenerator implements TaskGenerator { + ArrayList generators; + /** + * Конструктор с переменным числом аргументов + * + * @param generators генераторы, которые в конструктор передаются через запятую + */ + GroupTaskGenerator(TaskGenerator... generators) { + this.generators = new ArrayList<>(); + Collections.addAll(this.generators, generators); + } + + /** + * Конструктор, который принимает коллекцию генераторов + * + * @param generators генераторы, которые передаются в конструктор в Collection (например, {@link ArrayList}) + */ + GroupTaskGenerator(Iterable generators) { + this.generators = new ArrayList<>(); + for (var gen : generators) { + this.generators.add(gen); + } + } + + /** + * @return результат метода generate() случайного генератора из списка. + * Если этот генератор выбросил исключение в методе generate(), выбирается другой. + * Если все генераторы выбрасывают исключение, то и тут выбрасывается исключение. + */ + public Task generate() { + var r = ThreadLocalRandom.current(); + int index = r.nextInt(generators.size()); + return generators.get(index).generate(); + } +} From b0202d9dc79a5a0170bce4f2f25e868a4394b649 Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Tue, 22 Nov 2022 23:38:00 +0300 Subject: [PATCH 07/18] Implement PoolTaskGenerator --- .../task_generators/PoolTaskGenerator.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java new file mode 100644 index 0000000..6853807 --- /dev/null +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -0,0 +1,60 @@ +package by.toharrius.quizer.task_generators; + +import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +class PoolTaskGenerator implements TaskGenerator { + private final ArrayList pool; + private final boolean allowDuplicate; + /** + * Конструктор с переменным числом аргументов + * + * @param allowDuplicate разрешить повторения + * @param tasks задания, которые в конструктор передаются через запятую + */ + PoolTaskGenerator( + boolean allowDuplicate, + Task... tasks + ) { + this(allowDuplicate, Arrays.stream(tasks).collect(Collectors.toList())); + } + + /** + * Конструктор, который принимает коллекцию заданий + * + * @param allowDuplicate разрешить повторения + * @param tasks задания, которые передаются в конструктор в Collection (например, {@link LinkedList}) + */ + PoolTaskGenerator( + boolean allowDuplicate, + Collection tasks + ) { + this.pool = new ArrayList<>(tasks); + this.allowDuplicate = allowDuplicate; + if (!allowDuplicate) { + Collections.shuffle(pool); + } + } + + /** + * @return случайная задача из списка + */ + public Task generate() { + if (allowDuplicate) { + var r = ThreadLocalRandom.current(); + int index = r.nextInt(pool.size()); + return pool.get(index); + } else { + var task = pool.get(pool.size() - 1); + pool.remove(pool.size() - 1); + return task; + } + } +} From 492a14b72140a7d0bb5cb132c4aaef6be73e002e Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Tue, 22 Nov 2022 23:47:10 +0300 Subject: [PATCH 08/18] Make generators static nested --- lab-01/README.md | 2 +- .../EquationTaskGenerator.java | 58 ------------------- .../ExpressionTaskGenerator.java | 48 --------------- .../task_generators/PoolTaskGenerator.java | 5 +- .../toharrius/quizer/tasks/EquationTask.java | 53 ++++++++++++++++- .../quizer/tasks/ExpressionTask.java | 44 ++++++++++++++ 6 files changed, 98 insertions(+), 112 deletions(-) delete mode 100644 lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java delete mode 100644 lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java diff --git a/lab-01/README.md b/lab-01/README.md index 56242d1..52f0c28 100644 --- a/lab-01/README.md +++ b/lab-01/README.md @@ -374,7 +374,7 @@ default int getDiffNumber(); ## Generator как nested class в Task★ -Сейчас вся иерархия `Task` дублируется и для `Generator` в отдельном пакете, это не очень хорошая практика, т. к. за таким кодом сложно следить. Давайте сделаем все `Generator`'ы внутреннеми классами в соответствующих `Task`. Например, вместо `ExpressionTaskGenerator` будет `ExpressionTask.Generator`. При этом `GroupTaskGenerator` и `PoolTaskGenerator` остануться в отдельном пакете, т.к. они не привязаны к конкретному типу задачи. +Сейчас вся иерархия `Task` дублируется и для `Generator` в отдельном пакете, это не очень хорошая практика, т. к. за таким кодом сложно следить. Давайте сделаем все `Generator`'ы внутреннеми классами в соответствующих `Task`. Например, вместо `ExpressionTaskGenerator` будет `ExpressionTask.Generator`. При этом `GroupTaskGenerator` и `PoolTaskGenerator` останутся в отдельном пакете, т.к. они не привязаны к конкретному типу задачи. ```java interface Task { diff --git a/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java deleted file mode 100644 index 0e14171..0000000 --- a/lab-01/by/toharrius/quizer/task_generators/EquationTaskGenerator.java +++ /dev/null @@ -1,58 +0,0 @@ -package by.toharrius.quizer.task_generators; - -import by.toharrius.quizer.MathOperation; -import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; -import by.toharrius.quizer.tasks.EquationTask; -import by.toharrius.quizer.tasks.ExpressionTask; - -import java.util.EnumSet; -import java.util.concurrent.ThreadLocalRandom; - -public class EquationTaskGenerator implements TaskGenerator { - /** - * @param minNumber минимальное число - * @param maxNumber максимальное число - * @param generateSum разрешить генерацию с оператором + - * @param generateDifference разрешить генерацию с оператором - - * @param generateMultiplication разрешить генерацию с оператором * - * @param generateDivision разрешить генерацию с оператором / - */ - private final int least; - private final int bound; - private final EnumSet allowed; - - EquationTaskGenerator( - int minNumber, - int maxNumber, - boolean generateSum, - boolean generateDifference, - boolean generateMultiplication, - boolean generateDivision - ) { - least = minNumber; - bound = maxNumber + 1; - allowed = EnumSet.noneOf(MathOperation.class); - if (generateSum) allowed.add(MathOperation.ADD); - if (generateDifference) allowed.add(MathOperation.SUBTRACT); - if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); - if (generateDivision) allowed.add(MathOperation.DIVIDE); - } - - /** - * return задание типа {@link EquationTask} - */ - @Override - public EquationTask generate() { - var r = ThreadLocalRandom.current(); - int a = r.nextInt(least, bound); - int b = r.nextInt(least, bound); - var stream = allowed.stream(); - var index = r.nextLong(stream.count()); - var op = stream.skip(index).findFirst().get(); - var ans = op.eval(a, b); - return r.nextBoolean() - ? new EquationTask(a, op, ans, b) - : new EquationTask(op, a, ans, b); - } -} diff --git a/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java deleted file mode 100644 index fadd930..0000000 --- a/lab-01/by/toharrius/quizer/task_generators/ExpressionTaskGenerator.java +++ /dev/null @@ -1,48 +0,0 @@ -package by.toharrius.quizer.task_generators; - -import by.toharrius.quizer.MathOperation; -import by.toharrius.quizer.TaskGenerator; -import by.toharrius.quizer.tasks.ExpressionTask; - -import java.util.EnumSet; -import java.util.concurrent.ThreadLocalRandom; - -public class ExpressionTaskGenerator implements TaskGenerator { - private final int least; - private final int bound; - private final EnumSet allowed; - /** - * @param minNumber минимальное число - * @param maxNumber максимальное число - * @param generateSum разрешить генерацию с оператором + - * @param generateDifference разрешить генерацию с оператором - - * @param generateMultiplication разрешить генерацию с оператором * - * @param generateDivision разрешить генерацию с оператором / - */ - ExpressionTaskGenerator( - int minNumber, - int maxNumber, - boolean generateSum, - boolean generateDifference, - boolean generateMultiplication, - boolean generateDivision - ) { - least = minNumber; - bound = maxNumber + 1; - allowed = EnumSet.noneOf(MathOperation.class); - if (generateSum) allowed.add(MathOperation.ADD); - if (generateDifference) allowed.add(MathOperation.SUBTRACT); - if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); - if (generateDivision) allowed.add(MathOperation.DIVIDE); - } - @Override - public ExpressionTask generate() { - var r = ThreadLocalRandom.current(); - int a = r.nextInt(least, bound); - int b = r.nextInt(least, bound); - var stream = allowed.stream(); - var index = r.nextLong(stream.count()); - var op = stream.skip(index).findFirst().get(); - return new ExpressionTask(a, op, b); - } -} diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java index 6853807..5bc4249 100644 --- a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -3,10 +3,7 @@ import by.toharrius.quizer.Task; import by.toharrius.quizer.TaskGenerator; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; diff --git a/lab-01/by/toharrius/quizer/tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/EquationTask.java index 1b153c5..b2927d7 100644 --- a/lab-01/by/toharrius/quizer/tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/EquationTask.java @@ -1,8 +1,11 @@ package by.toharrius.quizer.tasks; import by.toharrius.quizer.MathOperation; -import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; + +import java.util.EnumSet; +import java.util.concurrent.ThreadLocalRandom; public class EquationTask extends TextTask implements Task { public EquationTask(MathOperation op, int constant, int answer, int x) { @@ -12,4 +15,52 @@ public EquationTask(MathOperation op, int constant, int answer, int x) { public EquationTask(int constant, MathOperation op, int answer, int x) { super(String.valueOf(constant) + op + " x = " + answer, String.valueOf(x)); } + + public static class Generator implements TaskGenerator { + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param generateSum разрешить генерацию с оператором + + * @param generateDifference разрешить генерацию с оператором - + * @param generateMultiplication разрешить генерацию с оператором * + * @param generateDivision разрешить генерацию с оператором / + */ + private final int least; + private final int bound; + private final EnumSet allowed; + + Generator( + int minNumber, + int maxNumber, + boolean generateSum, + boolean generateDifference, + boolean generateMultiplication, + boolean generateDivision + ) { + least = minNumber; + bound = maxNumber + 1; + allowed = EnumSet.noneOf(MathOperation.class); + if (generateSum) allowed.add(MathOperation.ADD); + if (generateDifference) allowed.add(MathOperation.SUBTRACT); + if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); + if (generateDivision) allowed.add(MathOperation.DIVIDE); + } + + /** + * return задание типа {@link EquationTask} + */ + @Override + public EquationTask generate() { + var r = ThreadLocalRandom.current(); + int a = r.nextInt(least, bound); + int b = r.nextInt(least, bound); + var stream = allowed.stream(); + var index = r.nextLong(stream.count()); + var op = stream.skip(index).findFirst().get(); + var ans = op.eval(a, b); + return r.nextBoolean() + ? new EquationTask(a, op, ans, b) + : new EquationTask(op, a, ans, b); + } + } } diff --git a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java index 637c551..b7253c1 100644 --- a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java @@ -3,6 +3,10 @@ import by.toharrius.quizer.MathOperation; import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; + +import java.util.EnumSet; +import java.util.concurrent.ThreadLocalRandom; public class ExpressionTask implements Task { private final int a; @@ -34,4 +38,44 @@ public Result validate(String answer) { return Result.INCORRECT_INPUT; } } + + public static class Generator implements TaskGenerator { + private final int least; + private final int bound; + private final EnumSet allowed; + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param generateSum разрешить генерацию с оператором + + * @param generateDifference разрешить генерацию с оператором - + * @param generateMultiplication разрешить генерацию с оператором * + * @param generateDivision разрешить генерацию с оператором / + */ + Generator( + int minNumber, + int maxNumber, + boolean generateSum, + boolean generateDifference, + boolean generateMultiplication, + boolean generateDivision + ) { + least = minNumber; + bound = maxNumber + 1; + allowed = EnumSet.noneOf(MathOperation.class); + if (generateSum) allowed.add(MathOperation.ADD); + if (generateDifference) allowed.add(MathOperation.SUBTRACT); + if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); + if (generateDivision) allowed.add(MathOperation.DIVIDE); + } + @Override + public ExpressionTask generate() { + var r = ThreadLocalRandom.current(); + int a = r.nextInt(least, bound); + int b = r.nextInt(least, bound); + var stream = allowed.stream(); + var index = r.nextLong(stream.count()); + var op = stream.skip(index).findFirst().get(); + return new ExpressionTask(a, op, b); + } + } } From 10758c78ecd9de34a898f78540a303f4f3182702 Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Wed, 23 Nov 2022 18:54:30 +0300 Subject: [PATCH 09/18] Add some abstractions --- .../quizer/tasks/AbstractMathTask.java | 45 ++++++++++ .../toharrius/quizer/tasks/EquationTask.java | 82 ++++++++----------- .../quizer/tasks/ExpressionTask.java | 64 ++++----------- .../by/toharrius/quizer/tasks/MathTask.java | 32 ++++++++ 4 files changed, 124 insertions(+), 99 deletions(-) create mode 100644 lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java create mode 100644 lab-01/by/toharrius/quizer/tasks/MathTask.java diff --git a/lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java b/lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java new file mode 100644 index 0000000..908d92a --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java @@ -0,0 +1,45 @@ +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.MathOperation; + +import java.util.EnumSet; + +public abstract class AbstractMathTask implements MathTask { + protected final int a; + protected final MathOperation op; + protected final int b; + protected final int c; + public AbstractMathTask(int a, MathOperation op, int b) { + this.a = a; + this.op = op; + this.b = b; + this.c = op.eval(a, b); + } + + protected abstract static class Generator implements MathTask.Generator { + private final int minNumber; + private final int maxNumber; + private final EnumSet allowed; + public Generator(int minNumber, int maxNumber, + EnumSet allowed) { + this.minNumber = minNumber; + this.maxNumber = maxNumber; + this.allowed = allowed; + } + + @Override + public int getMinNumber() { + return minNumber; + } + + @Override + public int getMaxNumber() { + return maxNumber; + } + + @Override + public EnumSet getAllowed() { + return allowed; + } + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/EquationTask.java index b2927d7..ba8aeb8 100644 --- a/lab-01/by/toharrius/quizer/tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/EquationTask.java @@ -1,66 +1,50 @@ package by.toharrius.quizer.tasks; import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; import java.util.EnumSet; import java.util.concurrent.ThreadLocalRandom; -public class EquationTask extends TextTask implements Task { - public EquationTask(MathOperation op, int constant, int answer, int x) { - super("x " + op + " " + constant + " = " + answer, String.valueOf(x)); +public class EquationTask extends AbstractMathTask { + private final boolean variableLeftSide; + public EquationTask(int a, MathOperation op, int b, boolean variableLeftSide) { + super(a, op, b); + this.variableLeftSide = variableLeftSide; } - - public EquationTask(int constant, MathOperation op, int answer, int x) { - super(String.valueOf(constant) + op + " x = " + answer, String.valueOf(x)); + @Override + public String getText() { + return (variableLeftSide + ? "x " + op + " " + b + : a + " " + op + " x" + ) + " = " + c; } - public static class Generator implements TaskGenerator { - /** - * @param minNumber минимальное число - * @param maxNumber максимальное число - * @param generateSum разрешить генерацию с оператором + - * @param generateDifference разрешить генерацию с оператором - - * @param generateMultiplication разрешить генерацию с оператором * - * @param generateDivision разрешить генерацию с оператором / - */ - private final int least; - private final int bound; - private final EnumSet allowed; - - Generator( - int minNumber, - int maxNumber, - boolean generateSum, - boolean generateDifference, - boolean generateMultiplication, - boolean generateDivision - ) { - least = minNumber; - bound = maxNumber + 1; - allowed = EnumSet.noneOf(MathOperation.class); - if (generateSum) allowed.add(MathOperation.ADD); - if (generateDifference) allowed.add(MathOperation.SUBTRACT); - if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); - if (generateDivision) allowed.add(MathOperation.DIVIDE); + @Override + public Result validate(String answer) { + int value; + try { + value = Integer.parseInt(answer); + } catch (NumberFormatException e) { + return Result.INCORRECT_INPUT; } + var correct = variableLeftSide ? a : b; + return value == correct ? Result.OK : Result.WRONG; + } - /** - * return задание типа {@link EquationTask} - */ + public static class Generator extends AbstractMathTask.Generator { + public Generator(int minNumber, int maxNumber, EnumSet allowed) { + super(minNumber, maxNumber, allowed); + } @Override - public EquationTask generate() { - var r = ThreadLocalRandom.current(); - int a = r.nextInt(least, bound); - int b = r.nextInt(least, bound); - var stream = allowed.stream(); - var index = r.nextLong(stream.count()); - var op = stream.skip(index).findFirst().get(); - var ans = op.eval(a, b); - return r.nextBoolean() - ? new EquationTask(a, op, ans, b) - : new EquationTask(op, a, ans, b); + public Task generate() { + return new EquationTask( + generateOperand(), + generateMathOperation(), + generateOperand(), + ThreadLocalRandom.current().nextBoolean() + ); } } } diff --git a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java index b7253c1..8e68691 100644 --- a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java @@ -2,34 +2,23 @@ import by.toharrius.quizer.MathOperation; import by.toharrius.quizer.Result; -import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; import java.util.EnumSet; -import java.util.concurrent.ThreadLocalRandom; -public class ExpressionTask implements Task { - private final int a; - private final MathOperation operation; - private final int b; - private final int result; - - public ExpressionTask(int a, MathOperation operation, int b) { - this.a = a; - this.operation = operation; - this.b = b; - this.result = operation.eval(a, b); +public class ExpressionTask extends AbstractMathTask { + public ExpressionTask(int a, MathOperation op, int b) { + super(a, op, b); } @Override public String getText() { - return String.valueOf(a) + ' ' + operation + ' ' + b + " = "; + return "Решай пример: " + a + ' ' + op + ' ' + b + " = ?"; } @Override public Result validate(String answer) { try { - if (Integer.parseInt(answer) == result) { + if (Integer.parseInt(answer) == c) { return Result.OK; } else { return Result.WRONG; @@ -39,43 +28,18 @@ public Result validate(String answer) { } } - public static class Generator implements TaskGenerator { - private final int least; - private final int bound; - private final EnumSet allowed; - /** - * @param minNumber минимальное число - * @param maxNumber максимальное число - * @param generateSum разрешить генерацию с оператором + - * @param generateDifference разрешить генерацию с оператором - - * @param generateMultiplication разрешить генерацию с оператором * - * @param generateDivision разрешить генерацию с оператором / - */ - Generator( - int minNumber, - int maxNumber, - boolean generateSum, - boolean generateDifference, - boolean generateMultiplication, - boolean generateDivision - ) { - least = minNumber; - bound = maxNumber + 1; - allowed = EnumSet.noneOf(MathOperation.class); - if (generateSum) allowed.add(MathOperation.ADD); - if (generateDifference) allowed.add(MathOperation.SUBTRACT); - if (generateMultiplication) allowed.add(MathOperation.MULTIPLY); - if (generateDivision) allowed.add(MathOperation.DIVIDE); + public static class Generator extends AbstractMathTask.Generator { + public Generator(int minNumber, int maxNumber, EnumSet allowed) { + super(minNumber, maxNumber, allowed); } + @Override public ExpressionTask generate() { - var r = ThreadLocalRandom.current(); - int a = r.nextInt(least, bound); - int b = r.nextInt(least, bound); - var stream = allowed.stream(); - var index = r.nextLong(stream.count()); - var op = stream.skip(index).findFirst().get(); - return new ExpressionTask(a, op, b); + return new ExpressionTask( + generateOperand(), + generateMathOperation(), + generateOperand() + ); } } } diff --git a/lab-01/by/toharrius/quizer/tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/MathTask.java new file mode 100644 index 0000000..3aa76f1 --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/MathTask.java @@ -0,0 +1,32 @@ +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.MathOperation; +import by.toharrius.quizer.Task; +import by.toharrius.quizer.TaskGenerator; + +import java.util.EnumSet; +import java.util.concurrent.ThreadLocalRandom; + +public interface MathTask extends Task { + interface Generator extends TaskGenerator { + int getMinNumber(); + int getMaxNumber(); + EnumSet getAllowed(); + /** + * @return разница между максимальным и минимальным возможным числом + */ + default int getDiffNumber() { + return getMaxNumber() - getMinNumber() + 1; + } + default int generateOperand() { + var r = ThreadLocalRandom.current(); + return getMinNumber() + r.nextInt(getDiffNumber()); + } + default MathOperation generateMathOperation() { + var r = ThreadLocalRandom.current(); + var stream = getAllowed().stream(); + int index = r.nextInt((int)stream.count()); + return stream.skip(index).findFirst().get(); + } + } +} From d352a676a41ea2f4ce173da5b57e6f033b56579f Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Wed, 23 Nov 2022 18:56:53 +0300 Subject: [PATCH 10/18] Improve package structure --- .../quizer/tasks/{ => math_tasks}/AbstractMathTask.java | 4 +--- .../toharrius/quizer/tasks/{ => math_tasks}/EquationTask.java | 3 +-- .../quizer/tasks/{ => math_tasks}/ExpressionTask.java | 3 +-- .../quizer/{ => tasks/math_tasks}/MathOperation.java | 2 +- .../by/toharrius/quizer/tasks/{ => math_tasks}/MathTask.java | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) rename lab-01/by/toharrius/quizer/tasks/{ => math_tasks}/AbstractMathTask.java (93%) rename lab-01/by/toharrius/quizer/tasks/{ => math_tasks}/EquationTask.java (95%) rename lab-01/by/toharrius/quizer/tasks/{ => math_tasks}/ExpressionTask.java (93%) rename lab-01/by/toharrius/quizer/{ => tasks/math_tasks}/MathOperation.java (94%) rename lab-01/by/toharrius/quizer/tasks/{ => math_tasks}/MathTask.java (93%) diff --git a/lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java similarity index 93% rename from lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java rename to lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java index 908d92a..8148961 100644 --- a/lab-01/by/toharrius/quizer/tasks/AbstractMathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java @@ -1,6 +1,4 @@ -package by.toharrius.quizer.tasks; - -import by.toharrius.quizer.MathOperation; +package by.toharrius.quizer.tasks.math_tasks; import java.util.EnumSet; diff --git a/lab-01/by/toharrius/quizer/tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java similarity index 95% rename from lab-01/by/toharrius/quizer/tasks/EquationTask.java rename to lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java index ba8aeb8..0f061ea 100644 --- a/lab-01/by/toharrius/quizer/tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java @@ -1,6 +1,5 @@ -package by.toharrius.quizer.tasks; +package by.toharrius.quizer.tasks.math_tasks; -import by.toharrius.quizer.MathOperation; import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; diff --git a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java similarity index 93% rename from lab-01/by/toharrius/quizer/tasks/ExpressionTask.java rename to lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java index 8e68691..960f753 100644 --- a/lab-01/by/toharrius/quizer/tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java @@ -1,6 +1,5 @@ -package by.toharrius.quizer.tasks; +package by.toharrius.quizer.tasks.math_tasks; -import by.toharrius.quizer.MathOperation; import by.toharrius.quizer.Result; import java.util.EnumSet; diff --git a/lab-01/by/toharrius/quizer/MathOperation.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java similarity index 94% rename from lab-01/by/toharrius/quizer/MathOperation.java rename to lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java index 42bcb04..7f7bd26 100644 --- a/lab-01/by/toharrius/quizer/MathOperation.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java @@ -1,4 +1,4 @@ -package by.toharrius.quizer; +package by.toharrius.quizer.tasks.math_tasks; public enum MathOperation { ADD, diff --git a/lab-01/by/toharrius/quizer/tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java similarity index 93% rename from lab-01/by/toharrius/quizer/tasks/MathTask.java rename to lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index 3aa76f1..f691f37 100644 --- a/lab-01/by/toharrius/quizer/tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -1,6 +1,5 @@ -package by.toharrius.quizer.tasks; +package by.toharrius.quizer.tasks.math_tasks; -import by.toharrius.quizer.MathOperation; import by.toharrius.quizer.Task; import by.toharrius.quizer.TaskGenerator; From 265f355f0fb6ab0889b5a4c33369a5f4b9b1f40c Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Wed, 23 Nov 2022 19:15:44 +0300 Subject: [PATCH 11/18] Make math tasks support double instead of int --- lab-01/by/toharrius/quizer/Quiz.java | 2 -- lab-01/by/toharrius/quizer/TaskGenerator.java | 2 -- .../tasks/math_tasks/AbstractMathTask.java | 18 +++++++++--------- .../quizer/tasks/math_tasks/EquationTask.java | 9 +++++---- .../tasks/math_tasks/ExpressionTask.java | 4 ++-- .../quizer/tasks/math_tasks/MathOperation.java | 9 --------- .../quizer/tasks/math_tasks/MathTask.java | 13 ++++++------- 7 files changed, 22 insertions(+), 35 deletions(-) diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java index f5caa64..d908503 100644 --- a/lab-01/by/toharrius/quizer/Quiz.java +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -1,7 +1,5 @@ package by.toharrius.quizer; -import by.toharrius.quizer.Task; - /** * Class, который описывает один тест */ diff --git a/lab-01/by/toharrius/quizer/TaskGenerator.java b/lab-01/by/toharrius/quizer/TaskGenerator.java index 81aa2c7..f1fd219 100644 --- a/lab-01/by/toharrius/quizer/TaskGenerator.java +++ b/lab-01/by/toharrius/quizer/TaskGenerator.java @@ -1,7 +1,5 @@ package by.toharrius.quizer; -import by.toharrius.quizer.Task; - /** * Interface, который описывает один генератор заданий */ diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java index 8148961..9b2e551 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java @@ -3,11 +3,11 @@ import java.util.EnumSet; public abstract class AbstractMathTask implements MathTask { - protected final int a; + protected final double a; protected final MathOperation op; - protected final int b; - protected final int c; - public AbstractMathTask(int a, MathOperation op, int b) { + protected final double b; + protected final double c; + public AbstractMathTask(double a, MathOperation op, double b) { this.a = a; this.op = op; this.b = b; @@ -15,10 +15,10 @@ public AbstractMathTask(int a, MathOperation op, int b) { } protected abstract static class Generator implements MathTask.Generator { - private final int minNumber; - private final int maxNumber; + private final double minNumber; + private final double maxNumber; private final EnumSet allowed; - public Generator(int minNumber, int maxNumber, + public Generator(double minNumber, double maxNumber, EnumSet allowed) { this.minNumber = minNumber; this.maxNumber = maxNumber; @@ -26,12 +26,12 @@ public Generator(int minNumber, int maxNumber, } @Override - public int getMinNumber() { + public double getMinNumber() { return minNumber; } @Override - public int getMaxNumber() { + public double getMaxNumber() { return maxNumber; } diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java index 0f061ea..531ffbe 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java @@ -8,13 +8,14 @@ public class EquationTask extends AbstractMathTask { private final boolean variableLeftSide; - public EquationTask(int a, MathOperation op, int b, boolean variableLeftSide) { + public EquationTask(double a, MathOperation op, double b, boolean variableLeftSide) { super(a, op, b); this.variableLeftSide = variableLeftSide; } @Override public String getText() { - return (variableLeftSide + return "Решай уравнение: " + + (variableLeftSide ? "x " + op + " " + b : a + " " + op + " x" ) + " = " + c; @@ -22,7 +23,7 @@ public String getText() { @Override public Result validate(String answer) { - int value; + double value; try { value = Integer.parseInt(answer); } catch (NumberFormatException e) { @@ -33,7 +34,7 @@ public Result validate(String answer) { } public static class Generator extends AbstractMathTask.Generator { - public Generator(int minNumber, int maxNumber, EnumSet allowed) { + public Generator(double minNumber, double maxNumber, EnumSet allowed) { super(minNumber, maxNumber, allowed); } @Override diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java index 960f753..589fcf3 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java @@ -5,7 +5,7 @@ import java.util.EnumSet; public class ExpressionTask extends AbstractMathTask { - public ExpressionTask(int a, MathOperation op, int b) { + public ExpressionTask(double a, MathOperation op, double b) { super(a, op, b); } @@ -28,7 +28,7 @@ public Result validate(String answer) { } public static class Generator extends AbstractMathTask.Generator { - public Generator(int minNumber, int maxNumber, EnumSet allowed) { + public Generator(double minNumber, double maxNumber, EnumSet allowed) { super(minNumber, maxNumber, allowed); } diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java index 7f7bd26..3b083ec 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathOperation.java @@ -15,15 +15,6 @@ public String toString() { }; } - public int eval(int a, int b) { - return switch (this) { - case ADD -> a + b; - case SUBTRACT -> a - b; - case DIVIDE -> a / b; - case MULTIPLY -> a * b; - }; - } - public double eval(double a, double b) { return switch (this) { case ADD -> a + b; diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index f691f37..eef1a07 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -8,18 +8,17 @@ public interface MathTask extends Task { interface Generator extends TaskGenerator { - int getMinNumber(); - int getMaxNumber(); + double getMinNumber(); + double getMaxNumber(); EnumSet getAllowed(); /** * @return разница между максимальным и минимальным возможным числом */ - default int getDiffNumber() { - return getMaxNumber() - getMinNumber() + 1; + default double getDiffNumber() { + return getMaxNumber() - getMinNumber(); } - default int generateOperand() { - var r = ThreadLocalRandom.current(); - return getMinNumber() + r.nextInt(getDiffNumber()); + default double generateOperand() { + return getMinNumber() + Math.random() * getDiffNumber(); } default MathOperation generateMathOperation() { var r = ThreadLocalRandom.current(); From a250283b4de6f858fe705e98499b8bf0f498da47 Mon Sep 17 00:00:00 2001 From: shandomruffle Date: Wed, 23 Nov 2022 19:55:33 +0300 Subject: [PATCH 12/18] Basic support of precision --- .../quizer/tasks/math_tasks/AbstractMathTask.java | 10 +++++++++- .../quizer/tasks/math_tasks/EquationTask.java | 7 ++++++- .../quizer/tasks/math_tasks/ExpressionTask.java | 7 ++++++- .../by/toharrius/quizer/tasks/math_tasks/MathTask.java | 6 +++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java index 9b2e551..ed0f1db 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/AbstractMathTask.java @@ -18,11 +18,14 @@ protected abstract static class Generator implements MathTask.Generator { private final double minNumber; private final double maxNumber; private final EnumSet allowed; + private final double roundingCoefficient; public Generator(double minNumber, double maxNumber, - EnumSet allowed) { + EnumSet allowed, + int precision) { this.minNumber = minNumber; this.maxNumber = maxNumber; this.allowed = allowed; + this.roundingCoefficient = Math.pow(10, precision); } @Override @@ -35,6 +38,11 @@ public double getMaxNumber() { return maxNumber; } + @Override + public double getRoundingCoefficient() { + return roundingCoefficient; + } + @Override public EnumSet getAllowed() { return allowed; diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java index 531ffbe..ba1b263 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java @@ -34,8 +34,13 @@ public Result validate(String answer) { } public static class Generator extends AbstractMathTask.Generator { + public Generator(double minNumber, double maxNumber, + EnumSet allowed, + int precision) { + super(minNumber, maxNumber, allowed, precision); + } public Generator(double minNumber, double maxNumber, EnumSet allowed) { - super(minNumber, maxNumber, allowed); + this(minNumber, maxNumber, allowed, 0); } @Override public Task generate() { diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java index 589fcf3..c5cd732 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java @@ -28,8 +28,13 @@ public Result validate(String answer) { } public static class Generator extends AbstractMathTask.Generator { + public Generator(double minNumber, double maxNumber, + EnumSet allowed, + int precision) { + super(minNumber, maxNumber, allowed, precision); + } public Generator(double minNumber, double maxNumber, EnumSet allowed) { - super(minNumber, maxNumber, allowed); + this(minNumber, maxNumber, allowed, 0); } @Override diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index eef1a07..043bdaf 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -10,6 +10,7 @@ public interface MathTask extends Task { interface Generator extends TaskGenerator { double getMinNumber(); double getMaxNumber(); + double getRoundingCoefficient(); EnumSet getAllowed(); /** * @return разница между максимальным и минимальным возможным числом @@ -18,7 +19,10 @@ default double getDiffNumber() { return getMaxNumber() - getMinNumber(); } default double generateOperand() { - return getMinNumber() + Math.random() * getDiffNumber(); + var generated = getMinNumber() + Math.random() * getDiffNumber(); + return Math.round(generated + * getRoundingCoefficient()) + / getRoundingCoefficient(); } default MathOperation generateMathOperation() { var r = ThreadLocalRandom.current(); From 9d0308ae5f27f0cfef32beaf958c8f1117ab97a0 Mon Sep 17 00:00:00 2001 From: toharrius Date: Wed, 30 Nov 2022 20:43:44 +0300 Subject: [PATCH 13/18] Implement interaction --- .gitignore | 3 +- lab-01/by/toharrius/quizer/Main.java | 70 +++++++++++++++++-- lab-01/by/toharrius/quizer/Quiz.java | 31 ++++---- .../task_generators/PoolTaskGenerator.java | 2 +- .../by/toharrius/quizer/tasks/TextTask.java | 1 + 5 files changed, 87 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 553042b..8117b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -.idea +.idea/ out/ +*.iml diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java index 4412a03..c6adedd 100644 --- a/lab-01/by/toharrius/quizer/Main.java +++ b/lab-01/by/toharrius/quizer/Main.java @@ -1,8 +1,11 @@ package by.toharrius.quizer; +import org.jetbrains.annotations.NotNull; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.HashMap; import java.util.Map; public class Main { @@ -11,15 +14,70 @@ public class Main { * ключ - название теста {@link String} * значение - сам тест {@link by.toharrius.quizer.Quiz} */ - static Map getQuizMap() { - return null; + private static @NotNull Map getQuizMap() { + var map = new HashMap(); + return map; + } + + private static String inputLineNormalized() throws IOException { + return consoleReader.readLine().toLowerCase().trim(); + } + + private static void runProblemSet(Quiz quiz) throws IOException { + while (!quiz.isFinished()) { + var task = quiz.nextTask(); + System.out.println("Task " + (quiz.getCurrentTaskIndex() + 1) + + " out of " + quiz.getTaskCount() + + ": " + task.getText()); + var answer = inputLineNormalized(); + System.out.println(switch (quiz.provideAnswer(answer)) { + case OK -> "Nice!"; + case WRONG -> "Nope."; + case INCORRECT_INPUT -> "Bad input format. Please, try again."; + }); + } + System.out.println("Quiz finished! Your statistics:"); + System.out.println("Correct answers: " + quiz.getCorrectAnswerNumber()); + System.out.println("Wrong answers: " + quiz.getWrongAnswerNumber()); + System.out.println("Total tries: " + quiz.getTotalAnswerNumber()); + System.out.println("Final mark: " + quiz.getMark()); } public static void main(String[] args) throws IOException { - var br = new BufferedReader(new InputStreamReader(System.in)); - for (;;) { - var str = br.readLine(); - System.out.println(str); + var map = getQuizMap(); + consoleReader = new BufferedReader(new InputStreamReader(System.in)); + boolean interactionFinished = false; + while (!interactionFinished) { + var query = inputLineNormalized(); + switch (query) { + case "list" -> { + if (map.isEmpty()) { + System.out.println("There are no quizes now, coming soon ):"); + } else { + System.out.println("The total of " + map.size() + " quizes are present"); + map.forEach((name, q) -> System.out.println(name)); + } + continue; + } + case "help" -> { + System.out.println("list : view available quizes\n" + + " : run particular quiz\n" + + "help : view this message\n" + + "exit | quit | stop : terminate session"); + continue; + } + case "exit", "quit", "stop", ":q" -> { + interactionFinished = true; + continue; + } + } + if (map.containsKey(query)) { + System.out.println("Starting quiz \"" + query + "\"!"); + runProblemSet(map.get(query)); + } else { + System.out.println("Sorry, not found. Type \"list\" to see available"); + } } } + private static BufferedReader consoleReader; } diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java index d908503..3062cc7 100644 --- a/lab-01/by/toharrius/quizer/Quiz.java +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -7,24 +7,27 @@ class Quiz { private int correctAnswerNumber = 0; private int wrongAnswerNumber = 0; private int incorrectInputNumber = 0; - private TaskGenerator taskGenerator; - private int taskCount; + private final TaskGenerator taskGenerator; + private final int taskCount; private Task currentTask = null; private Result lastResult = null; /** * @param generator генератор заданий * @param taskCount количество заданий в тесте */ - Quiz(TaskGenerator generator, int taskCount) { + public Quiz(TaskGenerator generator, int taskCount) { this.taskGenerator = generator; this.taskCount = taskCount; } + public int getTaskCount() { + return taskCount; + } /** * @return задание, повторный вызов вернет следующее * @see Task */ - Task nextTask() { + public Task nextTask() { if (lastResult == Result.INCORRECT_INPUT) { currentTask = taskGenerator.generate(); } @@ -35,7 +38,7 @@ Task nextTask() { * Предоставить ответ ученика. Если результат {@link Result#INCORRECT_INPUT}, то счетчик неправильных * ответов не увеличивается, а {@link #nextTask()} в следующий раз вернет тот же самый объект {@link Task}. */ - Result provideAnswer(String answer) { + public Result provideAnswer(String answer) { lastResult = currentTask.validate(answer); switch (lastResult) { case OK: { @@ -54,33 +57,37 @@ Result provideAnswer(String answer) { /** * @return завершен ли тест */ - boolean isFinished() { + public boolean isFinished() { + return getCurrentTaskIndex() == taskCount; + } + + public int getCurrentTaskIndex() { return getCorrectAnswerNumber() + - getWrongAnswerNumber() == taskCount; + getWrongAnswerNumber(); } /** * @return количество правильных ответов */ - int getCorrectAnswerNumber() { + public int getCorrectAnswerNumber() { return correctAnswerNumber; } /** * @return количество неправильных ответов */ - int getWrongAnswerNumber() { + public int getWrongAnswerNumber() { return wrongAnswerNumber; } /** * @return количество раз, когда был предоставлен неправильный ввод */ - int getIncorrectInputNumber() { + public int getIncorrectInputNumber() { return incorrectInputNumber; } - int getTotalAnswerNumber() { + public int getTotalAnswerNumber() { return getCorrectAnswerNumber() + getIncorrectInputNumber() + getWrongAnswerNumber(); @@ -90,7 +97,7 @@ int getTotalAnswerNumber() { * @return Оценка, которая является отношением количества правильных ответов к количеству всех вопросов. * Оценка выставляется только в конце! */ - double getMark() { + public double getMark() { return (double)getCorrectAnswerNumber() / getTotalAnswerNumber(); } } diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java index 5bc4249..29c6486 100644 --- a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -7,7 +7,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; -class PoolTaskGenerator implements TaskGenerator { +public class PoolTaskGenerator implements TaskGenerator { private final ArrayList pool; private final boolean allowDuplicate; /** diff --git a/lab-01/by/toharrius/quizer/tasks/TextTask.java b/lab-01/by/toharrius/quizer/tasks/TextTask.java index ba48d51..335482a 100644 --- a/lab-01/by/toharrius/quizer/tasks/TextTask.java +++ b/lab-01/by/toharrius/quizer/tasks/TextTask.java @@ -2,6 +2,7 @@ import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; +import by.toharrius.quizer.task_generators.PoolTaskGenerator; /** * Задание с заранее заготовленным текстом. From 8d67f1648464de29749aa25f1cce1fb416d04fa6 Mon Sep 17 00:00:00 2001 From: toharrius Date: Wed, 30 Nov 2022 22:13:22 +0300 Subject: [PATCH 14/18] Test PoolGenerator & TextTask, Implement copy constructor for quiz --- lab-01/by/toharrius/quizer/CopyParameter.java | 4 +++ lab-01/by/toharrius/quizer/Main.java | 18 ++++++++++++- lab-01/by/toharrius/quizer/Quiz.java | 25 +++++++++++-------- .../task_generators/GroupTaskGenerator.java | 7 +++++- .../task_generators/PoolTaskGenerator.java | 8 +++++- .../by/toharrius/quizer/tasks/TextTask.java | 4 +-- .../quizer/tasks/math_tasks/EquationTask.java | 4 +++ .../tasks/math_tasks/ExpressionTask.java | 4 +++ 8 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 lab-01/by/toharrius/quizer/CopyParameter.java diff --git a/lab-01/by/toharrius/quizer/CopyParameter.java b/lab-01/by/toharrius/quizer/CopyParameter.java new file mode 100644 index 0000000..2f7f0eb --- /dev/null +++ b/lab-01/by/toharrius/quizer/CopyParameter.java @@ -0,0 +1,4 @@ +package by.toharrius.quizer; +public enum CopyParameter { + FLAG +} diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java index c6adedd..5831ab5 100644 --- a/lab-01/by/toharrius/quizer/Main.java +++ b/lab-01/by/toharrius/quizer/Main.java @@ -1,5 +1,7 @@ package by.toharrius.quizer; +import by.toharrius.quizer.task_generators.PoolTaskGenerator; +import by.toharrius.quizer.tasks.TextTask; import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; @@ -16,6 +18,14 @@ public class Main { */ private static @NotNull Map getQuizMap() { var map = new HashMap(); + { + var gen = new PoolTaskGenerator(false, + new TextTask("Какая (по слухам) подработка у С*****ча?", "сборщик мусора"), + new TextTask("Как называется человек, убегающий от каннибала?", "фастфуд"), + new TextTask("Какой вид порно не могут снять бомжи?", "домашнее"), + new TextTask("Как называется оглушающий удар татара?", "татарстан")); + map.put("stupid-questions", new Quiz(gen, 4)); + } return map; } @@ -73,7 +83,13 @@ public static void main(String[] args) throws IOException { } if (map.containsKey(query)) { System.out.println("Starting quiz \"" + query + "\"!"); - runProblemSet(map.get(query)); + Quiz clone; + try { + clone = new Quiz(map.get(query)); + } catch (Exception e) { + throw new RuntimeException("Unable to clone", e); + } + runProblemSet(clone); } else { System.out.println("Sorry, not found. Type \"list\" to see available"); } diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java index 3062cc7..9d7f657 100644 --- a/lab-01/by/toharrius/quizer/Quiz.java +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -3,7 +3,7 @@ /** * Class, который описывает один тест */ -class Quiz { +public class Quiz implements Cloneable { private int correctAnswerNumber = 0; private int wrongAnswerNumber = 0; private int incorrectInputNumber = 0; @@ -19,6 +19,15 @@ public Quiz(TaskGenerator generator, int taskCount) { this.taskGenerator = generator; this.taskCount = taskCount; } + + /** + * Copy constructor refreshing state + * @param other object to copy + */ + public Quiz(Quiz other) throws Exception { + this(other.taskGenerator.getClass().getConstructor(TaskGenerator.class, CopyParameter.class) + .newInstance(other.taskGenerator, CopyParameter.FLAG), other.taskCount); + } public int getTaskCount() { return taskCount; } @@ -28,7 +37,7 @@ public int getTaskCount() { * @see Task */ public Task nextTask() { - if (lastResult == Result.INCORRECT_INPUT) { + if (lastResult != Result.INCORRECT_INPUT) { currentTask = taskGenerator.generate(); } return currentTask; @@ -41,15 +50,9 @@ public Task nextTask() { public Result provideAnswer(String answer) { lastResult = currentTask.validate(answer); switch (lastResult) { - case OK: { - ++correctAnswerNumber; - } - case WRONG: { - ++wrongAnswerNumber; - } - case INCORRECT_INPUT: { - ++incorrectInputNumber; - } + case OK -> ++correctAnswerNumber; + case WRONG -> ++wrongAnswerNumber; + case INCORRECT_INPUT -> ++incorrectInputNumber; } return lastResult; } diff --git a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java index 678eaf0..2d87d5e 100644 --- a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java @@ -1,5 +1,6 @@ package by.toharrius.quizer.task_generators; +import by.toharrius.quizer.CopyParameter; import by.toharrius.quizer.Task; import by.toharrius.quizer.TaskGenerator; @@ -14,11 +15,15 @@ class GroupTaskGenerator implements TaskGenerator { * * @param generators генераторы, которые в конструктор передаются через запятую */ - GroupTaskGenerator(TaskGenerator... generators) { + public GroupTaskGenerator(TaskGenerator... generators) { this.generators = new ArrayList<>(); Collections.addAll(this.generators, generators); } + public GroupTaskGenerator(TaskGenerator other, CopyParameter f) { + this(((GroupTaskGenerator)other).generators); + } + /** * Конструктор, который принимает коллекцию генераторов * diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java index 29c6486..64c6bed 100644 --- a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -1,5 +1,6 @@ package by.toharrius.quizer.task_generators; +import by.toharrius.quizer.CopyParameter; import by.toharrius.quizer.Task; import by.toharrius.quizer.TaskGenerator; @@ -16,13 +17,18 @@ public class PoolTaskGenerator implements TaskGenerator { * @param allowDuplicate разрешить повторения * @param tasks задания, которые в конструктор передаются через запятую */ - PoolTaskGenerator( + public PoolTaskGenerator( boolean allowDuplicate, Task... tasks ) { this(allowDuplicate, Arrays.stream(tasks).collect(Collectors.toList())); } + public PoolTaskGenerator(TaskGenerator other, CopyParameter f) { + this(((PoolTaskGenerator)other).allowDuplicate, + ((PoolTaskGenerator)other).pool); + } + /** * Конструктор, который принимает коллекцию заданий * diff --git a/lab-01/by/toharrius/quizer/tasks/TextTask.java b/lab-01/by/toharrius/quizer/tasks/TextTask.java index 335482a..20e4cb5 100644 --- a/lab-01/by/toharrius/quizer/tasks/TextTask.java +++ b/lab-01/by/toharrius/quizer/tasks/TextTask.java @@ -8,14 +8,14 @@ * Задание с заранее заготовленным текстом. * Можно использовать {@link PoolTaskGenerator}, чтобы задавать задания такого типа. */ -class TextTask implements Task { +public class TextTask implements Task { private final String text; private final String answer; /** * @param text текст задания * @param answer ответ на задание */ - TextTask( + public TextTask( String text, String answer ) { diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java index ba1b263..03f2d75 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java @@ -1,5 +1,6 @@ package by.toharrius.quizer.tasks.math_tasks; +import by.toharrius.quizer.CopyParameter; import by.toharrius.quizer.Result; import by.toharrius.quizer.Task; @@ -42,6 +43,9 @@ public Generator(double minNumber, double maxNumber, public Generator(double minNumber, double maxNumber, EnumSet allowed) { this(minNumber, maxNumber, allowed, 0); } + public Generator(Generator other, CopyParameter f) { + this(other.getMinNumber(), other.getMaxNumber(), other.getAllowed()); + } @Override public Task generate() { return new EquationTask( diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java index c5cd732..1f15a09 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java @@ -1,5 +1,6 @@ package by.toharrius.quizer.tasks.math_tasks; +import by.toharrius.quizer.CopyParameter; import by.toharrius.quizer.Result; import java.util.EnumSet; @@ -36,6 +37,9 @@ public Generator(double minNumber, double maxNumber, public Generator(double minNumber, double maxNumber, EnumSet allowed) { this(minNumber, maxNumber, allowed, 0); } + public Generator(EquationTask.Generator other, CopyParameter f) { + this(other.getMinNumber(), other.getMaxNumber(), other.getAllowed()); + } @Override public ExpressionTask generate() { From cd22fe69b431750ce5278b79d6fbeddb4bd4aad4 Mon Sep 17 00:00:00 2001 From: toharrius Date: Wed, 30 Nov 2022 22:37:13 +0300 Subject: [PATCH 15/18] Test generators Math & Group --- lab-01/by/toharrius/quizer/Main.java | 44 ++++++++++++++----- .../task_generators/GroupTaskGenerator.java | 2 +- .../quizer/tasks/math_tasks/MathTask.java | 5 +-- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java index 5831ab5..2d6887a 100644 --- a/lab-01/by/toharrius/quizer/Main.java +++ b/lab-01/by/toharrius/quizer/Main.java @@ -1,12 +1,17 @@ package by.toharrius.quizer; +import by.toharrius.quizer.task_generators.GroupTaskGenerator; import by.toharrius.quizer.task_generators.PoolTaskGenerator; import by.toharrius.quizer.tasks.TextTask; +import by.toharrius.quizer.tasks.math_tasks.EquationTask; +import by.toharrius.quizer.tasks.math_tasks.ExpressionTask; +import by.toharrius.quizer.tasks.math_tasks.MathOperation; import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.EnumSet; import java.util.HashMap; import java.util.Map; @@ -26,6 +31,21 @@ public class Main { new TextTask("Как называется оглушающий удар татара?", "татарстан")); map.put("stupid-questions", new Quiz(gen, 4)); } + { + var gen_eq_add = new EquationTask.Generator(2, 55, + EnumSet.of(MathOperation.ADD)); + var gen_eq_42_all = new EquationTask.Generator(42, 42, + EnumSet.allOf(MathOperation.class)); + var gen_ex_div = new ExpressionTask.Generator(17, 42, + EnumSet.of(MathOperation.DIVIDE)); + var gen_ex_all = new ExpressionTask.Generator(41, 42, + EnumSet.allOf(MathOperation.class)); + var gen_eq = new GroupTaskGenerator(gen_eq_42_all, gen_eq_add); + var gen_ex = new GroupTaskGenerator(new ExpressionTask.Generator[]{gen_ex_div, gen_ex_all}); + var gen_group = new GroupTaskGenerator(gen_ex, gen_eq, + new EquationTask.Generator(gen_eq_42_all, CopyParameter.FLAG)); + map.put("tricky-math", new Quiz(gen_group, 5)); + } return map; } @@ -80,18 +100,20 @@ public static void main(String[] args) throws IOException { interactionFinished = true; continue; } - } - if (map.containsKey(query)) { - System.out.println("Starting quiz \"" + query + "\"!"); - Quiz clone; - try { - clone = new Quiz(map.get(query)); - } catch (Exception e) { - throw new RuntimeException("Unable to clone", e); + default -> { + if (map.containsKey(query)) { + System.out.println("Starting quiz \"" + query + "\"!"); + Quiz clone; + try { + clone = new Quiz(map.get(query)); + } catch (Exception e) { + throw new RuntimeException("Unable to clone", e); + } + runProblemSet(clone); + } else { + System.out.println("Sorry, not found. Type \"list\" to see available"); + } } - runProblemSet(clone); - } else { - System.out.println("Sorry, not found. Type \"list\" to see available"); } } } diff --git a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java index 2d87d5e..d2675ac 100644 --- a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java @@ -8,7 +8,7 @@ import java.util.Collections; import java.util.concurrent.ThreadLocalRandom; -class GroupTaskGenerator implements TaskGenerator { +public class GroupTaskGenerator implements TaskGenerator { ArrayList generators; /** * Конструктор с переменным числом аргументов diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index 043bdaf..89f55f0 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -26,9 +26,8 @@ default double generateOperand() { } default MathOperation generateMathOperation() { var r = ThreadLocalRandom.current(); - var stream = getAllowed().stream(); - int index = r.nextInt((int)stream.count()); - return stream.skip(index).findFirst().get(); + int index = r.nextInt((int)getAllowed().stream().count()); + return getAllowed().stream().skip(index).findFirst().get(); } } } From 0193008d93ec1ca4fa4e0aac98d015e03a601d18 Mon Sep 17 00:00:00 2001 From: toharrius Date: Wed, 30 Nov 2022 22:52:26 +0300 Subject: [PATCH 16/18] Add a couple of tasks --- lab-01/by/toharrius/quizer/Main.java | 8 +++++++ .../AbstractImminenceTask.java | 24 +++++++++++++++++++ .../tasks/imminence_tasks/GenerousTask.java | 9 +++++++ .../tasks/imminence_tasks/TrickyTask.java | 9 +++++++ 4 files changed, 50 insertions(+) create mode 100644 lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java create mode 100644 lab-01/by/toharrius/quizer/tasks/imminence_tasks/GenerousTask.java create mode 100644 lab-01/by/toharrius/quizer/tasks/imminence_tasks/TrickyTask.java diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java index 2d6887a..ab83bd6 100644 --- a/lab-01/by/toharrius/quizer/Main.java +++ b/lab-01/by/toharrius/quizer/Main.java @@ -2,7 +2,9 @@ import by.toharrius.quizer.task_generators.GroupTaskGenerator; import by.toharrius.quizer.task_generators.PoolTaskGenerator; +import by.toharrius.quizer.tasks.imminence_tasks.GenerousTask; import by.toharrius.quizer.tasks.TextTask; +import by.toharrius.quizer.tasks.imminence_tasks.TrickyTask; import by.toharrius.quizer.tasks.math_tasks.EquationTask; import by.toharrius.quizer.tasks.math_tasks.ExpressionTask; import by.toharrius.quizer.tasks.math_tasks.MathOperation; @@ -31,6 +33,12 @@ public class Main { new TextTask("Как называется оглушающий удар татара?", "татарстан")); map.put("stupid-questions", new Quiz(gen, 4)); } + { + var gen = new PoolTaskGenerator(true, + new GenerousTask("Каков правильный ответ?"), + new TrickyTask("Это утверждение ложно.")); + map.put("know-your-luck", new Quiz(gen, 7)); + } { var gen_eq_add = new EquationTask.Generator(2, 55, EnumSet.of(MathOperation.ADD)); diff --git a/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java new file mode 100644 index 0000000..5318f4d --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java @@ -0,0 +1,24 @@ +package by.toharrius.quizer.tasks.imminence_tasks; + +import by.toharrius.quizer.Result; +import by.toharrius.quizer.Task; + +public class AbstractImminenceTask implements Task { + private final String text; + private final Result result; + + protected AbstractImminenceTask(String text, Result result) { + this.text = text; + this.result = result; + } + + @Override + public String getText() { + return text; + } + + @Override + public Result validate(String answer) { + return result; + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/imminence_tasks/GenerousTask.java b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/GenerousTask.java new file mode 100644 index 0000000..96cbdcf --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/GenerousTask.java @@ -0,0 +1,9 @@ +package by.toharrius.quizer.tasks.imminence_tasks; + +import by.toharrius.quizer.Result; + +public class GenerousTask extends AbstractImminenceTask { + public GenerousTask(String text) { + super(text, Result.OK); + } +} diff --git a/lab-01/by/toharrius/quizer/tasks/imminence_tasks/TrickyTask.java b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/TrickyTask.java new file mode 100644 index 0000000..013bd69 --- /dev/null +++ b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/TrickyTask.java @@ -0,0 +1,9 @@ +package by.toharrius.quizer.tasks.imminence_tasks; + +import by.toharrius.quizer.Result; + +public class TrickyTask extends AbstractImminenceTask { + public TrickyTask(String text) { + super(text, Result.WRONG); + } +} From e9c14db2e7b29e2a984702b08ab2fcb64f43e7c4 Mon Sep 17 00:00:00 2001 From: toharrius Date: Wed, 30 Nov 2022 22:57:42 +0300 Subject: [PATCH 17/18] Move Task & TaskGenerator into appropriate packages --- lab-01/README.md | 16 ++++++++-------- lab-01/by/toharrius/quizer/Quiz.java | 3 +++ .../task_generators/GroupTaskGenerator.java | 3 +-- .../task_generators/PoolTaskGenerator.java | 3 +-- .../{ => task_generators}/TaskGenerator.java | 4 +++- lab-01/by/toharrius/quizer/{ => tasks}/Task.java | 4 +++- lab-01/by/toharrius/quizer/tasks/TextTask.java | 1 - .../imminence_tasks/AbstractImminenceTask.java | 2 +- .../quizer/tasks/math_tasks/EquationTask.java | 4 ++-- .../quizer/tasks/math_tasks/ExpressionTask.java | 2 +- .../quizer/tasks/math_tasks/MathTask.java | 4 ++-- 11 files changed, 25 insertions(+), 21 deletions(-) rename lab-01/by/toharrius/quizer/{ => task_generators}/TaskGenerator.java (83%) rename lab-01/by/toharrius/quizer/{ => tasks}/Task.java (87%) diff --git a/lab-01/README.md b/lab-01/README.md index 52f0c28..6d1ca84 100644 --- a/lab-01/README.md +++ b/lab-01/README.md @@ -46,7 +46,7 @@ interface Task { ### TaskGenerator ```java -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; /** * Interface, который описывает один генератор заданий @@ -65,7 +65,7 @@ interface TaskGenerator { ### Quiz ```java -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; /** * Class, который описывает один тест @@ -242,7 +242,7 @@ class EquationTaskGenerator implements TaskGenerator { `TaskGenerator`, который позволяет объединить несколько других `TaskGenerator`. ```java -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; class GroupTaskGenerator implements TaskGenerator { /** @@ -278,7 +278,7 @@ class GroupTaskGenerator implements TaskGenerator { `TaskGenerator`, который отдает задания из заранее заготовленного набора. ```java -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; class PoolTaskGenerator implements TaskGenerator { /** @@ -319,7 +319,7 @@ class PoolTaskGenerator implements TaskGenerator { ### TextTask ```java -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; /** * Задание с заранее заготовленным текстом. @@ -383,13 +383,13 @@ interface Task { // ... } -interface MathTask extends by.toharrius.quizer.Task { - interface Generator extends by.toharrius.quizer.Task.Generator { /* ... */ +interface MathTask extends by.toharrius.quizer.tasks.Task { + interface Generator extends by.toharrius.quizer.tasks.Task.Generator { /* ... */ } // ... } -abstract class AbstractMathTask implements by.toharrius.quizer.Task { +abstract class AbstractMathTask implements by.toharrius.quizer.tasks.Task { static abstract class Generator implements MathTask.Generator { /* ... */ } // ... diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java index 9d7f657..724b10b 100644 --- a/lab-01/by/toharrius/quizer/Quiz.java +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -1,5 +1,8 @@ package by.toharrius.quizer; +import by.toharrius.quizer.task_generators.TaskGenerator; +import by.toharrius.quizer.tasks.Task; + /** * Class, который описывает один тест */ diff --git a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java index d2675ac..5e458f0 100644 --- a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java @@ -1,8 +1,7 @@ package by.toharrius.quizer.task_generators; import by.toharrius.quizer.CopyParameter; -import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; +import by.toharrius.quizer.tasks.Task; import java.util.ArrayList; import java.util.Collections; diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java index 64c6bed..2a8e8a8 100644 --- a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -1,8 +1,7 @@ package by.toharrius.quizer.task_generators; import by.toharrius.quizer.CopyParameter; -import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; +import by.toharrius.quizer.tasks.Task; import java.util.*; import java.util.concurrent.ThreadLocalRandom; diff --git a/lab-01/by/toharrius/quizer/TaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/TaskGenerator.java similarity index 83% rename from lab-01/by/toharrius/quizer/TaskGenerator.java rename to lab-01/by/toharrius/quizer/task_generators/TaskGenerator.java index f1fd219..db7eb85 100644 --- a/lab-01/by/toharrius/quizer/TaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/TaskGenerator.java @@ -1,4 +1,6 @@ -package by.toharrius.quizer; +package by.toharrius.quizer.task_generators; + +import by.toharrius.quizer.tasks.Task; /** * Interface, который описывает один генератор заданий diff --git a/lab-01/by/toharrius/quizer/Task.java b/lab-01/by/toharrius/quizer/tasks/Task.java similarity index 87% rename from lab-01/by/toharrius/quizer/Task.java rename to lab-01/by/toharrius/quizer/tasks/Task.java index bdf7389..25120ae 100644 --- a/lab-01/by/toharrius/quizer/Task.java +++ b/lab-01/by/toharrius/quizer/tasks/Task.java @@ -1,4 +1,6 @@ -package by.toharrius.quizer; +package by.toharrius.quizer.tasks; + +import by.toharrius.quizer.Result; /** * Interface, который описывает одно задание diff --git a/lab-01/by/toharrius/quizer/tasks/TextTask.java b/lab-01/by/toharrius/quizer/tasks/TextTask.java index 20e4cb5..b1d6c3e 100644 --- a/lab-01/by/toharrius/quizer/tasks/TextTask.java +++ b/lab-01/by/toharrius/quizer/tasks/TextTask.java @@ -1,7 +1,6 @@ package by.toharrius.quizer.tasks; import by.toharrius.quizer.Result; -import by.toharrius.quizer.Task; import by.toharrius.quizer.task_generators.PoolTaskGenerator; /** diff --git a/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java index 5318f4d..34dd265 100644 --- a/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java +++ b/lab-01/by/toharrius/quizer/tasks/imminence_tasks/AbstractImminenceTask.java @@ -1,7 +1,7 @@ package by.toharrius.quizer.tasks.imminence_tasks; import by.toharrius.quizer.Result; -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; public class AbstractImminenceTask implements Task { private final String text; diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java index 03f2d75..b8ce46f 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/EquationTask.java @@ -2,7 +2,7 @@ import by.toharrius.quizer.CopyParameter; import by.toharrius.quizer.Result; -import by.toharrius.quizer.Task; +import by.toharrius.quizer.tasks.Task; import java.util.EnumSet; import java.util.concurrent.ThreadLocalRandom; @@ -26,7 +26,7 @@ public String getText() { public Result validate(String answer) { double value; try { - value = Integer.parseInt(answer); + value = Double.parseDouble(answer); } catch (NumberFormatException e) { return Result.INCORRECT_INPUT; } diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java index 1f15a09..37bda88 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/ExpressionTask.java @@ -18,7 +18,7 @@ public String getText() { @Override public Result validate(String answer) { try { - if (Integer.parseInt(answer) == c) { + if (Double.parseDouble(answer) == c) { return Result.OK; } else { return Result.WRONG; diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index 89f55f0..8140939 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -1,7 +1,7 @@ package by.toharrius.quizer.tasks.math_tasks; -import by.toharrius.quizer.Task; -import by.toharrius.quizer.TaskGenerator; +import by.toharrius.quizer.tasks.Task; +import by.toharrius.quizer.task_generators.TaskGenerator; import java.util.EnumSet; import java.util.concurrent.ThreadLocalRandom; From a3cbc4edea31b3e85dca9bb600a30699c1ae5fa4 Mon Sep 17 00:00:00 2001 From: toharrius Date: Sat, 10 Dec 2022 11:49:40 +0300 Subject: [PATCH 18/18] Fixes from PR --- lab-01/by/toharrius/quizer/Main.java | 62 ++++++++++--------- lab-01/by/toharrius/quizer/Quiz.java | 2 +- .../task_generators/GroupTaskGenerator.java | 4 +- .../task_generators/PoolTaskGenerator.java | 3 + .../quizer/tasks/math_tasks/MathTask.java | 2 +- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/lab-01/by/toharrius/quizer/Main.java b/lab-01/by/toharrius/quizer/Main.java index ab83bd6..616da2a 100644 --- a/lab-01/by/toharrius/quizer/Main.java +++ b/lab-01/by/toharrius/quizer/Main.java @@ -18,26 +18,31 @@ import java.util.Map; public class Main { + private static final String helpMessage = "list : view available quizes\n" + + " : run particular quiz\n" + + "help : view this message\n" + + "exit | quit | stop : terminate session"; + private static Map quizes; /** * @return тесты в {@link Map}, где * ключ - название теста {@link String} * значение - сам тест {@link by.toharrius.quizer.Quiz} */ private static @NotNull Map getQuizMap() { - var map = new HashMap(); + var quizes = new HashMap(); { var gen = new PoolTaskGenerator(false, new TextTask("Какая (по слухам) подработка у С*****ча?", "сборщик мусора"), new TextTask("Как называется человек, убегающий от каннибала?", "фастфуд"), new TextTask("Какой вид порно не могут снять бомжи?", "домашнее"), new TextTask("Как называется оглушающий удар татара?", "татарстан")); - map.put("stupid-questions", new Quiz(gen, 4)); + quizes.put("stupid-questions", new Quiz(gen, 4)); } { var gen = new PoolTaskGenerator(true, new GenerousTask("Каков правильный ответ?"), new TrickyTask("Это утверждение ложно.")); - map.put("know-your-luck", new Quiz(gen, 7)); + quizes.put("know-your-luck", new Quiz(gen, 7)); } { var gen_eq_add = new EquationTask.Generator(2, 55, @@ -52,15 +57,30 @@ public class Main { var gen_ex = new GroupTaskGenerator(new ExpressionTask.Generator[]{gen_ex_div, gen_ex_all}); var gen_group = new GroupTaskGenerator(gen_ex, gen_eq, new EquationTask.Generator(gen_eq_42_all, CopyParameter.FLAG)); - map.put("tricky-math", new Quiz(gen_group, 5)); + quizes.put("tricky-math", new Quiz(gen_group, 5)); } - return map; + return quizes; } private static String inputLineNormalized() throws IOException { return consoleReader.readLine().toLowerCase().trim(); } + private static void tryLaunchQuiz(String query) throws IOException { + if (quizes.containsKey(query)) { + System.out.println("Starting quiz \"" + query + "\"!"); + Quiz clone; + try { + clone = new Quiz(quizes.get(query)); + } catch (Exception e) { + throw new RuntimeException("Unable to clone", e); + } + runProblemSet(clone); + } else { + System.out.println("Sorry, not found. Type \"list\" to see available"); + } + } + private static void runProblemSet(Quiz quiz) throws IOException { while (!quiz.isFinished()) { var task = quiz.nextTask(); @@ -82,46 +102,28 @@ private static void runProblemSet(Quiz quiz) throws IOException { } public static void main(String[] args) throws IOException { - var map = getQuizMap(); + System.out.println(helpMessage); + quizes = getQuizMap(); consoleReader = new BufferedReader(new InputStreamReader(System.in)); boolean interactionFinished = false; while (!interactionFinished) { var query = inputLineNormalized(); switch (query) { case "list" -> { - if (map.isEmpty()) { + if (quizes.isEmpty()) { System.out.println("There are no quizes now, coming soon ):"); } else { - System.out.println("The total of " + map.size() + " quizes are present"); - map.forEach((name, q) -> System.out.println(name)); + System.out.println("The total of " + quizes.size() + " quizes are present"); + quizes.forEach((name, q) -> System.out.println(name)); } - continue; } case "help" -> { - System.out.println("list : view available quizes\n" + - " : run particular quiz\n" + - "help : view this message\n" + - "exit | quit | stop : terminate session"); - continue; + System.out.println(helpMessage); } case "exit", "quit", "stop", ":q" -> { interactionFinished = true; - continue; - } - default -> { - if (map.containsKey(query)) { - System.out.println("Starting quiz \"" + query + "\"!"); - Quiz clone; - try { - clone = new Quiz(map.get(query)); - } catch (Exception e) { - throw new RuntimeException("Unable to clone", e); - } - runProblemSet(clone); - } else { - System.out.println("Sorry, not found. Type \"list\" to see available"); - } } + default -> tryLaunchQuiz(query); } } } diff --git a/lab-01/by/toharrius/quizer/Quiz.java b/lab-01/by/toharrius/quizer/Quiz.java index 724b10b..05be97e 100644 --- a/lab-01/by/toharrius/quizer/Quiz.java +++ b/lab-01/by/toharrius/quizer/Quiz.java @@ -104,6 +104,6 @@ public int getTotalAnswerNumber() { * Оценка выставляется только в конце! */ public double getMark() { - return (double)getCorrectAnswerNumber() / getTotalAnswerNumber(); + return (double)getCorrectAnswerNumber() / getTaskCount(); } } diff --git a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java index 5e458f0..2f7aacd 100644 --- a/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/GroupTaskGenerator.java @@ -30,9 +30,7 @@ public GroupTaskGenerator(TaskGenerator other, CopyParameter f) { */ GroupTaskGenerator(Iterable generators) { this.generators = new ArrayList<>(); - for (var gen : generators) { - this.generators.add(gen); - } + generators.forEach(this.generators::add); } /** diff --git a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java index 2a8e8a8..6f36dd1 100644 --- a/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/by/toharrius/quizer/task_generators/PoolTaskGenerator.java @@ -41,6 +41,9 @@ public PoolTaskGenerator(TaskGenerator other, CopyParameter f) { this.pool = new ArrayList<>(tasks); this.allowDuplicate = allowDuplicate; if (!allowDuplicate) { + if (pool.stream().distinct().count() != pool.size()) { + throw new IllegalArgumentException("Duplicates found"); + } Collections.shuffle(pool); } } diff --git a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java index 8140939..7658618 100644 --- a/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/by/toharrius/quizer/tasks/math_tasks/MathTask.java @@ -26,7 +26,7 @@ default double generateOperand() { } default MathOperation generateMathOperation() { var r = ThreadLocalRandom.current(); - int index = r.nextInt((int)getAllowed().stream().count()); + int index = r.nextInt(getAllowed().size()); return getAllowed().stream().skip(index).findFirst().get(); } }