Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions lab-01/by/KseniyaGnezdilova/quizer/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package by.KseniyaGnezdilova.quizer;

import by.KseniyaGnezdilova.quizer.generators.GroupTaskGenerator;
import by.KseniyaGnezdilova.quizer.generators.PoolTaskGenerator;
import by.KseniyaGnezdilova.quizer.tasks.Task;
import by.KseniyaGnezdilova.quizer.tasks.TextTask;
import by.KseniyaGnezdilova.quizer.tasks.math_tasks.EquationTask;
import by.KseniyaGnezdilova.quizer.tasks.math_tasks.ExpressionTask;
import by.KseniyaGnezdilova.quizer.tasks.math_tasks.Operations;

import java.util.*;

public class Main {

static Map<String, Quiz> getQuizMap(){
Map <String, Quiz> quizzes = new HashMap<>();

Task.Generator equation = new EquationTask.Generator(0, -20, 20,
EnumSet.of(Operations.SUM, Operations.DIV, Operations.MUL, Operations.DIFF));
Quiz quiz_equation = new Quiz(equation, 10);
quizzes.put("Equation", quiz_equation);

Task.Generator expression = new ExpressionTask.Generator(1, -20, 20,
EnumSet.of(Operations.SUM, Operations.DIV, Operations.MUL, Operations.DIFF));
Quiz quiz_expression = new Quiz(expression, 10);
quizzes.put("Expression", quiz_expression);

quizzes.put("Notations", new Quiz(new GroupTaskGenerator(equation, expression), 10));

Vector <Task> textTasks = new Vector<>(List.of(
new TextTask("Galya has 5 apples, Petya has 12 apples. How many apples does Vanya have, " +
"if it is known that he has 2 times more apples than Galya and Petya combined?", "34"),
new TextTask("What is the median of a right triangle if its hypotenuse is C?", "C / 2"),
new TextTask("sin^2(a) + cos^2(a) = ?", "1"),
new TextTask("The programmer's first word?", "Hello, World!"))
);

quizzes.put("Text", new Quiz(new PoolTaskGenerator(false, textTasks), textTasks.size()));

return quizzes;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Map <String, Quiz> quizzes = getQuizMap();
System.out.println("Available quizzes: ");
for (Map.Entry<String, Quiz> item: quizzes.entrySet()){
System.out.println(item.getKey());
}

System.out.println("Choose a quiz: ");
String quizName = scanner.nextLine();
Quiz quiz = quizzes.get(quizName);
while (!quiz.isFinished()){
System.out.println(quiz.nextTask().getText());
String ans = scanner.nextLine();
quiz.provideAnswer(ans);
}
System.out.println("Result ");
System.out.println(quiz.getMark());
}
}
69 changes: 69 additions & 0 deletions lab-01/by/KseniyaGnezdilova/quizer/Quiz.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package by.KseniyaGnezdilova.quizer;

import by.KseniyaGnezdilova.quizer.tasks.Task;

class Quiz {

private Task currentTask;
private int taskCount;

private Task.Generator generator;
private boolean status;
private int correctAnswerNumber;
private int wrongAnswerNumber;

private int incorrectInputNumber;

Quiz(Task.Generator generator, int taskCount) {
this.currentTask = null;
this.taskCount = taskCount;
this.generator = generator;
this.status = true;
this.correctAnswerNumber = 0;
this.wrongAnswerNumber = 0;
this.incorrectInputNumber = 0;
}

Task repeatTask(){
return currentTask;
}
Task nextTask() {
currentTask = generator.generate();
return currentTask;
}

Result provideAnswer(String answer) {
Result result = currentTask.validate(answer);
switch (result){
case OK -> this.correctAnswerNumber++;
case WRONG -> this.wrongAnswerNumber++;
case INCORRECT_INPUT -> {
this.incorrectInputNumber++;
repeatTask();
}
}
return result;
}

boolean isFinished() {
this.status = (this.correctAnswerNumber + this.wrongAnswerNumber == taskCount);
return this.status;
}

int getTaskCount(){ return taskCount; }
int getCorrectAnswerNumber() {
return correctAnswerNumber;
}

int getWrongAnswerNumber() {
return wrongAnswerNumber;
}

int getIncorrectInputNumber() {
return incorrectInputNumber;
}

double getMark() {
return (double)getCorrectAnswerNumber() / (double)getTaskCount() * 100;
}
}
7 changes: 7 additions & 0 deletions lab-01/by/KseniyaGnezdilova/quizer/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package by.KseniyaGnezdilova.quizer;

public enum Result {
OK,
WRONG,
INCORRECT_INPUT
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package by.KseniyaGnezdilova.quizer.generators;

import by.KseniyaGnezdilova.quizer.tasks.Task;

import java.util.Collection;
import java.util.Collections;
import java.util.Random;
import java.util.Vector;

public class GroupTaskGenerator implements Task.Generator {
Vector<Task.Generator> generators = new Vector<>();
public GroupTaskGenerator(Task.Generator... generators) {
Collections.addAll(this.generators, generators);
}

public GroupTaskGenerator(Collection<Task.Generator> generators) {
this.generators.addAll(generators);
}

public Task generate() {
Random random = new Random();
while (!generators.isEmpty()){
int pos = random.nextInt(this.generators.size());
try {
return generators.get(pos).generate();
} catch (Exception e) {
generators.remove(pos);
}
}
throw new IndexOutOfBoundsException("No generators");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package by.KseniyaGnezdilova.quizer.generators;

import by.KseniyaGnezdilova.quizer.tasks.Task;

import java.util.Collection;
import java.util.Collections;
import java.util.Random;
import java.util.Vector;

public class PoolTaskGenerator implements Task.Generator {

private Vector <Task> tasks = new Vector<>();
private boolean allowDuplicate;

public PoolTaskGenerator(
boolean allowDuplicate,
Task... tasks
) {
this.allowDuplicate = allowDuplicate;
Collections.addAll(this.tasks, tasks);
}

public PoolTaskGenerator(
boolean allowDuplicate,
Collection<Task> tasks
) {
this.allowDuplicate = allowDuplicate;
this.tasks.addAll(tasks);
}

public Task generate() {
if (this.tasks.isEmpty()){
throw new IndexOutOfBoundsException("No more tasks");
}
Random random = new Random();
int rnd = random.nextInt(tasks.size());
Task task = tasks.get(rnd);
if (!allowDuplicate) this.tasks.remove(rnd);
return task;
}
}
13 changes: 13 additions & 0 deletions lab-01/by/KseniyaGnezdilova/quizer/tasks/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package by.KseniyaGnezdilova.quizer.tasks;

import by.KseniyaGnezdilova.quizer.Result;

public interface Task {
String getText();

Result validate(String answer);

interface Generator {
Task generate();
}
}
32 changes: 32 additions & 0 deletions lab-01/by/KseniyaGnezdilova/quizer/tasks/TextTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package by.KseniyaGnezdilova.quizer.tasks;

import by.KseniyaGnezdilova.quizer.Result;

import java.util.Objects;

public class TextTask implements Task {
private String text;
private String answer;
public TextTask(
String text,
String answer
) {
this.text = text;
this.answer = answer;
}


@Override
public String getText() {
return text;
}

@Override
public Result validate(String answer) {
if (Objects.equals(this.answer, answer)){
return Result.OK;
} else {
return Result.WRONG;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package by.KseniyaGnezdilova.quizer.tasks.math_tasks;

import java.util.EnumSet;

public abstract class AbstractMathTask implements MathTask {
static abstract class Generator implements MathTask.Generator{
protected int precision;
protected double minNumber;
protected double maxNumber;
protected EnumSet<Operations> operations;

public Generator(
int precision,
double minNumber,
double maxNumber,
EnumSet<Operations> operations
) {
this.precision = precision;
this.maxNumber = maxNumber;
this.minNumber = minNumber;
this.operations = operations;
}

public double getMaxNumber(){
return maxNumber;
}

public double getMinNumber(){
return minNumber;
}
}
}
Loading