summaryrefslogtreecommitdiff
path: root/c3/QuizTree.java
diff options
context:
space:
mode:
authorpants <niklasjo2004@gmail.com>2026-09-21 14:16:34 -0700
committerpants <niklasjo2004@gmail.com>2026-09-21 14:16:34 -0700
commit81ba9eb66f8284d8760012973f84cdbe617ceb94 (patch)
tree466432644e9e3fd66ee183ec53a1f10abb1b7faa /c3/QuizTree.java
Diffstat (limited to 'c3/QuizTree.java')
-rw-r--r--c3/QuizTree.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/c3/QuizTree.java b/c3/QuizTree.java
new file mode 100644
index 0000000..e8c16d2
--- /dev/null
+++ b/c3/QuizTree.java
@@ -0,0 +1,170 @@
+import java.util.*;
+import java.io.*;
+
+public class QuizTree {
+
+ private QuizTreeNode head;
+
+ // PROVIDED
+ // Returns the given percent rounded to two decimal places.
+ private double roundTwoPlaces(double percent) {
+ return (double) Math.round(percent * 100) / 100;
+ }
+
+ public int size() {
+ return size(head);
+ }
+
+ private int size(QuizTreeNode root) {
+ if (root == null) {
+ return 0;
+ }
+ return 1 + size(root.left) + size(root.right);
+ }
+
+ public QuizTree(Scanner inputFile) {
+ this.head = null;
+ this.head = populateTree(inputFile, head);
+ }
+
+ private void printTree(QuizTreeNode root) {
+ if (root != null) {
+ System.out.println(root.data);
+ printTree(root.left);
+ printTree(root.right);
+ }
+ }
+
+ private QuizTreeNode populateTree(Scanner inputFile, QuizTreeNode root) {
+ if (inputFile.hasNextLine()) {
+ String next = inputFile.nextLine();
+ String data;
+ int score;
+
+ // we've reached a result, make a node but dont recurse
+ if (next.startsWith("END:")) {
+ data = next.substring(4, next.lastIndexOf("-"));
+ score = Integer.parseInt(next.substring(next.lastIndexOf("-") + 1));
+ return new QuizTreeNode(data, score);
+ }
+
+ // otherwise, we're not at the end yet, make a node and keep going
+ else {
+ data = next.substring(0, next.lastIndexOf("-"));
+ score = Integer.parseInt(next.substring(next.lastIndexOf("-") + 1));
+ root = new QuizTreeNode(data, score);
+ root.left = populateTree(inputFile, root.left);
+ root.right = populateTree(inputFile, root.right);
+ }
+ }
+ return root;
+ }
+
+ public void takeQuiz(Scanner console) {
+ takeQuiz(console, head);
+ }
+
+ private void takeQuiz(Scanner console, QuizTreeNode root) {
+ if (root.left != null && root.right != null) {
+ String left = root.data.substring(0, root.data.lastIndexOf("/"));
+ String right = root.data.substring(root.data.lastIndexOf("/")+1, root.data.length());
+ System.out.print("Do you prefer " + left + " or " + right + "? ");
+ String input = console.nextLine();
+
+ while (!input.equalsIgnoreCase(left) || !input.equalsIgnoreCase(right)) {
+ System.out.println(" Invalid response; try again.");
+ System.out.print("Do you prefer " + left + " or " + right + "? ");
+ input = console.nextLine();
+ }
+
+ takeQuiz(console, input.equalsIgnoreCase(left) ? root.left : root.right);
+ }
+
+ else {
+ System.out.println("Your result is: " + root.data);
+ System.out.println("Your score is: " + root.score);
+ }
+ }
+
+ public void export(PrintStream outputFile) {
+ export(outputFile, this.head);
+ }
+
+ private void export(PrintStream outputFile, QuizTreeNode root) {
+ if (root.left == null && root.right == null) {
+ outputFile.println("END:" + root.data + "-" + root.score);
+ } else {
+ outputFile.println(root.data + "-" + root.score);
+ }
+
+ if (root.left != null) {
+ export(outputFile, root.left);
+ }
+ if (root.right != null) {
+ export(outputFile, root.right);
+ }
+ }
+
+ //public void addQuestion(String toReplace, String choices, String leftResult, String rightResult) {
+ //}
+
+ public void addQuestion(String toReplace, String choices, String leftResult, String rightResult) {
+ head = addQuestion(head, toReplace.toLowerCase(), choices, leftResult, rightResult);
+ }
+
+ private QuizTreeNode addQuestion(QuizTreeNode root, String toReplace, String choices, String leftResult, String rightResult) {
+ if (root == null) {
+ return null;
+ }
+
+ if (root.left == null && root.right == null && root.data.equalsIgnoreCase(toReplace)) {
+ // Parse choices to get left choice, right choice, and score
+ String choiceText = choices.substring(0, choices.lastIndexOf("-"));
+ int choiceScore = Integer.parseInt(choices.substring(choices.lastIndexOf("-") + 1));
+
+ // Create the new choice node
+ QuizTreeNode choiceNode = new QuizTreeNode(choiceText, choiceScore);
+
+ // Parse leftResult to get left result data and score
+ String leftData = leftResult.substring(0, leftResult.lastIndexOf("-"));
+ int leftScore = Integer.parseInt(leftResult.substring(leftResult.lastIndexOf("-") + 1));
+ QuizTreeNode leftNode = new QuizTreeNode(leftData, leftScore);
+
+ // Parse rightResult to get right result data and score
+ String rightData = rightResult.substring(0, rightResult.lastIndexOf("-"));
+ int rightScore = Integer.parseInt(rightResult.substring(rightResult.lastIndexOf("-") + 1));
+ QuizTreeNode rightNode = new QuizTreeNode(rightData, rightScore);
+
+ // Set the left and right children of the new choice node
+ choiceNode.left = leftNode;
+ choiceNode.right = rightNode;
+
+ return choiceNode;
+ } else {
+ root.left = addQuestion(root.left, toReplace, choices, leftResult, rightResult);
+ root.right = addQuestion(root.right, toReplace, choices, leftResult, rightResult);
+ return root;
+ }
+ }
+
+
+
+ public static class QuizTreeNode {
+
+ public final String data;
+ public final int score;
+ public QuizTreeNode left;
+ public QuizTreeNode right;
+
+ public QuizTreeNode(String data, int score) {
+ this(data, score, null, null);
+ }
+
+ public QuizTreeNode(String data, int score, QuizTreeNode left, QuizTreeNode right) {
+ this.data = data;
+ this.score = score;
+ this.left = left;
+ this.right = right;
+ }
+ }
+}