runnable H07
This commit is contained in:
parent
369ba3d231
commit
88d43259a4
22 changed files with 16 additions and 494 deletions
13
.idea/workspace.xml
generated
Normal file
13
.idea/workspace.xml
generated
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"project.structure.last.edited": "Project",
|
||||
"project.structure.proportion": "0.0",
|
||||
"project.structure.side.proportion": "0.0"
|
||||
}
|
||||
}</component>
|
||||
</project>
|
|
@ -34,13 +34,4 @@ jagr {
|
|||
rubricProviderName.set("h07.H07_RubricProvider")
|
||||
}
|
||||
}
|
||||
graders {
|
||||
val graderPrivate by creating {
|
||||
graderName.set("H07-Private")
|
||||
rubricProviderName.set("h07.H07_RubricProvider")
|
||||
configureDependencies {
|
||||
implementation(libs.algoutils.tutor)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
[plugins]
|
||||
algomate = { id = "org.tudalgo.algomate", version = "0.7.1" }
|
||||
algomate = { id = "org.tudalgo.algomate", version = "0.7.0" }
|
||||
style = { id = "org.sourcegrade.style", version = "3.0.0" }
|
||||
|
|
1
solution/H07/src/main
Symbolic link
1
solution/H07/src/main
Symbolic link
|
@ -0,0 +1 @@
|
|||
/home/osh/Desktop/FOP-2425-Marathon/H07/src/main
|
|
@ -1,18 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents an arithmetic operation on numbers.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface ArithmeticExpression {
|
||||
/**
|
||||
* Applies the arithmetic operation to the two numbers.
|
||||
*
|
||||
* @param num1 the first number
|
||||
* @param num2 the second number
|
||||
* @return the result of the operation
|
||||
*/
|
||||
NumberExpression evaluate(NumberExpression num1, NumberExpression num2);
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import h07.peano.PeanoNumberExpression;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Converts a number expression to a Peano number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface ConvertNumberToPeanoExpression {
|
||||
/**
|
||||
* Converts a number expression to a Peano number expression.
|
||||
*
|
||||
* @param numberExpression the number expression to convert
|
||||
* @return the Peano number expression
|
||||
*/
|
||||
PeanoNumberExpression convert(NumberExpression numberExpression);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import h07.peano.PeanoNumberExpression;
|
||||
import h07.peano.Zero;
|
||||
import h07.peano.Successor;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Converts a number expression to a Peano number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public class ConvertNumberToPeanoExpressionImpl implements ConvertNumberToPeanoExpression {
|
||||
@Override
|
||||
public PeanoNumberExpression convert(NumberExpression numberExpression) {
|
||||
int value = numberExpression.evaluate();
|
||||
|
||||
if (value == 0) {
|
||||
return Zero::new;
|
||||
} else {
|
||||
return () -> new Successor(new ConvertNumberToPeanoExpressionImpl().convert(() -> value - 1).evaluate());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import h07.peano.PeanoNumberExpression;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Converts a Peano number expression to a number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface ConvertPeanoToNumberExpression {
|
||||
/**
|
||||
* Converts a Peano number expression to a number expression.
|
||||
*
|
||||
* @param peanoNumberExpression the Peano number expression to convert
|
||||
* @return the number expression
|
||||
*/
|
||||
NumberExpression convert(PeanoNumberExpression peanoNumberExpression);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import h07.peano.NaturalNumber;
|
||||
import h07.peano.PeanoNumberExpression;
|
||||
import h07.peano.Successor;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Converts a Peano number expression to a number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public class ConvertPeanoToNumberExpressionImpl implements ConvertPeanoToNumberExpression {
|
||||
@Override
|
||||
public NumberExpression convert(PeanoNumberExpression peanoNumberExpression) {
|
||||
NaturalNumber naturalNumber = peanoNumberExpression.evaluate();
|
||||
|
||||
if (naturalNumber instanceof Successor successor) {
|
||||
return () -> new ConvertPeanoToNumberExpressionImpl().convert(() -> successor.predecessor).evaluate() + 1;
|
||||
} else {
|
||||
return () -> 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import h07.peano.*;
|
||||
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentImplementationRequired;
|
||||
|
||||
/**
|
||||
* Main entry point in executing the program.
|
||||
*/
|
||||
public class Main {
|
||||
/**
|
||||
* Main entry point in executing the program.
|
||||
*
|
||||
* @param args program arguments, currently ignored
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
testHeader("Multiplication Table");
|
||||
numberExpressionMultiplicationTableTests();
|
||||
|
||||
testHeader("Peano Number Expressions");
|
||||
peanoNumberExpressionTests();
|
||||
|
||||
testHeader("Filter, Fold, Map");
|
||||
filterFoldMapTests();
|
||||
}
|
||||
|
||||
@DoNotTouch
|
||||
private static void testHeader(String testName) {
|
||||
System.out.println("-----------------------------------");
|
||||
System.out.println("Running test: " + testName);
|
||||
System.out.println("-----------------------------------");
|
||||
}
|
||||
|
||||
@DoNotTouch
|
||||
private static void numberExpressionMultiplicationTableTests() {
|
||||
int lowerBound = 1;
|
||||
int upperBound = 10;
|
||||
NumberExpression[] multiplicationTable = NumberExpressionFactory.multiplicationTable(lowerBound, upperBound);
|
||||
|
||||
for (int i = lowerBound; i <= upperBound; i++) {
|
||||
for (int j = lowerBound; j <= upperBound; j++) {
|
||||
System.out.printf("| %4s ", multiplicationTable[(i - lowerBound) * (upperBound - lowerBound + 1) + (j - lowerBound)].evaluate());
|
||||
}
|
||||
System.out.println("|");
|
||||
}
|
||||
}
|
||||
|
||||
private static final NaturalNumber THREE = new Successor(new Successor(new Successor(new Zero())));
|
||||
private static final NaturalNumber SEVEN = new Successor(new Successor(new Successor(new Successor(new Successor(new Successor(new Successor(new Zero())))))));
|
||||
|
||||
@StudentImplementationRequired
|
||||
private static void peanoNumberExpressionTests() {
|
||||
PeanoNumberExpression three = () -> THREE;
|
||||
PeanoNumberExpression seven = () -> SEVEN;
|
||||
|
||||
PeanoNumberExpression sum = new PeanoAddExpression().evaluate(three, seven);
|
||||
PeanoNumberExpression product = new PeanoMultiplyExpression().evaluate(three, seven);
|
||||
|
||||
System.out.println(sum.evaluate());
|
||||
System.out.println(product.evaluate());
|
||||
|
||||
// Not required but can be used to convert Peano numbers to integers
|
||||
System.out.println(new ConvertPeanoToNumberExpressionImpl().convert(sum).evaluate());
|
||||
System.out.println(new ConvertPeanoToNumberExpressionImpl().convert(product).evaluate());
|
||||
}
|
||||
|
||||
@StudentImplementationRequired
|
||||
private static void filterFoldMapTests() {
|
||||
NumberExpression[] numbers = NumberExpressionFactory.multiplicationTable(1, 10);
|
||||
NumberExpression[] filteredNumbers = NumberExpressionFactory.filter(numbers, n -> n % 3 == 0);
|
||||
PeanoNumberExpression[] filteredPeanoNumbers = PeanoNumberExpressionFactory
|
||||
.fromNumberExpressions(filteredNumbers);
|
||||
PeanoNumberExpression foldedPeanoNumbers = PeanoNumberExpressionFactory.fold(filteredPeanoNumbers, Zero::new,
|
||||
new PeanoAddExpression());
|
||||
int foldedNumber = new ConvertPeanoToNumberExpressionImpl().convert(foldedPeanoNumbers).evaluate();
|
||||
System.out.println(foldedNumber);
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents a number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface NumberExpression {
|
||||
/**
|
||||
* Evaluates the expression represented by this node.
|
||||
*
|
||||
* @return the result of the evaluation
|
||||
*/
|
||||
int evaluate();
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import java.util.function.IntPredicate;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentImplementationRequired;
|
||||
|
||||
/**
|
||||
* A factory class for creating number expressions.
|
||||
*/
|
||||
public class NumberExpressionFactory {
|
||||
/**
|
||||
* Calculates the product of all possible pairs of numbers in the given array.
|
||||
*
|
||||
* @param numbers the array of number expressions to calculate the multiplication table
|
||||
* @return An array of number expressions representing the result of the
|
||||
* multiplication table of the given numbers.
|
||||
*/
|
||||
@StudentImplementationRequired
|
||||
public static NumberExpression[] multiplicationTable(NumberExpression[] numbers) {
|
||||
NumberExpression[] multiplicationTable = new NumberExpression[numbers.length * numbers.length];
|
||||
|
||||
ArithmeticExpression multiplication = (num1, num2) -> {
|
||||
return () -> num1.evaluate() * num2.evaluate();
|
||||
};
|
||||
|
||||
for (int i = 0; i < numbers.length; i++) {
|
||||
for (int j = 0; j < numbers.length; j++) {
|
||||
multiplicationTable[i * numbers.length + j] = multiplication.evaluate(numbers[i], numbers[j]);
|
||||
}
|
||||
}
|
||||
|
||||
return multiplicationTable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the product of all possible pairs of numbers in the given range.
|
||||
*
|
||||
* @param lowerBound the lower bound of the multiplication table, inclusive
|
||||
* @param upperBound the upper bound of the multiplication table, inclusive
|
||||
* @return An array of number expressions representing the result of the
|
||||
* multiplication table of the numbers from lowerBound to upperBound.
|
||||
*/
|
||||
@DoNotTouch
|
||||
public static NumberExpression[] multiplicationTable(int lowerBound, int upperBound) {
|
||||
int numberOfNumbers = upperBound - lowerBound + 1;
|
||||
NumberExpression[] baseNumbers = new NumberExpression[numberOfNumbers];
|
||||
|
||||
for (int i = lowerBound; i <= upperBound; i++) {
|
||||
// Copy to local variable to make it effectively final, so it can be used in
|
||||
// lambda
|
||||
int finalI = i;
|
||||
baseNumbers[i - lowerBound] = () -> finalI;
|
||||
}
|
||||
|
||||
return multiplicationTable(baseNumbers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the given array of number expressions based on the given predicate.
|
||||
* The returned array should contain only the number expressions that satisfy
|
||||
* the predicate in the same order as they appear in the input array.
|
||||
* This means there should be no null values in the returned array.
|
||||
*
|
||||
* @param numbers the array of number expressions to filter
|
||||
* @param predicate the predicate to filter the number expressions
|
||||
* @return An array of number expressions that satisfy the predicate.
|
||||
*/
|
||||
@StudentImplementationRequired
|
||||
public static NumberExpression[] filter(NumberExpression[] numbers, IntPredicate predicate) {
|
||||
int count = 0;
|
||||
for (NumberExpression number : numbers) {
|
||||
if (predicate.test(number.evaluate())) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
NumberExpression[] result = new NumberExpression[count];
|
||||
|
||||
int nextIndex = 0;
|
||||
for (NumberExpression number : numbers) {
|
||||
if (predicate.test(number.evaluate())) {
|
||||
result[nextIndex++] = number;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
|
||||
|
||||
/**
|
||||
* Represents a natural number.
|
||||
*/
|
||||
@DoNotTouch
|
||||
public abstract class NaturalNumber {
|
||||
/**
|
||||
* Returns the string representation of the natural number.
|
||||
*
|
||||
* @return the string representation of the natural number
|
||||
*/
|
||||
@Override
|
||||
public abstract String toString();
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents an addition operation in Peano arithmetic.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public class PeanoAddExpression implements PeanoArithmeticExpression {
|
||||
@Override
|
||||
public PeanoNumberExpression evaluate(PeanoNumberExpression num1, PeanoNumberExpression num2) {
|
||||
NaturalNumber naturalNumber1 = num1.evaluate();
|
||||
|
||||
if (naturalNumber1 instanceof Successor naturalNumber1Peano) {
|
||||
return () -> {
|
||||
return new Successor(
|
||||
new PeanoAddExpression().evaluate(
|
||||
() -> { return naturalNumber1Peano.predecessor; },
|
||||
num2
|
||||
).evaluate()
|
||||
);
|
||||
};
|
||||
} else {
|
||||
return num2;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents an arithmetic operation in Peano arithmetic.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface PeanoArithmeticExpression {
|
||||
/**
|
||||
* Evaluates the expression represented by this node.
|
||||
*
|
||||
* @param num1 the first number to evaluate
|
||||
* @param num2 the second number to evaluate
|
||||
* @return the result of the evaluation
|
||||
*/
|
||||
PeanoNumberExpression evaluate(PeanoNumberExpression num1, PeanoNumberExpression num2);
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents a multiplication operation in Peano arithmetic.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public class PeanoMultiplyExpression implements PeanoArithmeticExpression {
|
||||
@Override
|
||||
public PeanoNumberExpression evaluate(PeanoNumberExpression num1, PeanoNumberExpression num2) {
|
||||
NaturalNumber naturalNumber2 = num2.evaluate();
|
||||
|
||||
if (naturalNumber2 instanceof Successor naturalNumber2Peano) {
|
||||
if (naturalNumber2Peano.predecessor instanceof Zero) {
|
||||
return num1;
|
||||
} else {
|
||||
return () -> new PeanoAddExpression().evaluate(
|
||||
num1,
|
||||
new PeanoMultiplyExpression().evaluate(
|
||||
num1,
|
||||
() -> naturalNumber2Peano.predecessor))
|
||||
.evaluate();
|
||||
}
|
||||
} else {
|
||||
return Zero::new;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.StudentCreationRequired;
|
||||
|
||||
/**
|
||||
* Represents a Peano number expression.
|
||||
*/
|
||||
@StudentCreationRequired
|
||||
public interface PeanoNumberExpression {
|
||||
/**
|
||||
* Evaluates the expression represented by this node.
|
||||
*
|
||||
* @return the result of the evaluation
|
||||
*/
|
||||
NaturalNumber evaluate();
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import h07.ConvertNumberToPeanoExpressionImpl;
|
||||
import h07.NumberExpression;
|
||||
import org.tudalgo.algoutils.student.annotation.StudentImplementationRequired;
|
||||
|
||||
/**
|
||||
* Represents a factory for Peano number expressions.
|
||||
*/
|
||||
public class PeanoNumberExpressionFactory {
|
||||
/**
|
||||
* Converts an array of number expressions to an array of Peano number expressions.
|
||||
*
|
||||
* @param numberExpressions the number expressions to convert
|
||||
* @return the converted Peano number expressions
|
||||
*/
|
||||
@StudentImplementationRequired
|
||||
public static PeanoNumberExpression[] fromNumberExpressions(NumberExpression[] numberExpressions) {
|
||||
PeanoNumberExpression[] peanoNumberExpressions = new PeanoNumberExpression[numberExpressions.length];
|
||||
|
||||
for (int i = 0; i < numberExpressions.length; i++) {
|
||||
peanoNumberExpressions[i] = new ConvertNumberToPeanoExpressionImpl().convert(numberExpressions[i]);
|
||||
}
|
||||
|
||||
return peanoNumberExpressions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Folds an array of Peano number expressions into a single Peano number expression.
|
||||
*
|
||||
* @param peanoNumberExpressions the Peano number expressions to fold
|
||||
* @param initial the initial Peano number expression
|
||||
* @param operation the operation to apply
|
||||
* @return the folded Peano number expression
|
||||
*/
|
||||
@StudentImplementationRequired
|
||||
public static PeanoNumberExpression fold(PeanoNumberExpression[] peanoNumberExpressions, PeanoNumberExpression initial, PeanoArithmeticExpression operation) {
|
||||
PeanoNumberExpression result = initial;
|
||||
for (PeanoNumberExpression peanoNumberExpression : peanoNumberExpressions) {
|
||||
result = operation.evaluate(result, peanoNumberExpression);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
|
||||
|
||||
/**
|
||||
* Represents a successor of a natural number in Peano arithmetic.
|
||||
*/
|
||||
@DoNotTouch
|
||||
public class Successor extends NaturalNumber {
|
||||
public final NaturalNumber predecessor;
|
||||
|
||||
public Successor(NaturalNumber predecessor) {
|
||||
this.predecessor = predecessor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "S(" + predecessor.toString() + ")";
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
package h07.peano;
|
||||
|
||||
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
|
||||
|
||||
/**
|
||||
* Represents the number zero in Peano arithmetic.
|
||||
*/
|
||||
@DoNotTouch
|
||||
public class Zero extends NaturalNumber {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Z";
|
||||
}
|
||||
}
|
1
solution/H07/src/test
Symbolic link
1
solution/H07/src/test
Symbolic link
|
@ -0,0 +1 @@
|
|||
/home/osh/Desktop/FOP-2425-Marathon/H07/src/test
|
|
@ -1,16 +0,0 @@
|
|||
package h07;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* An example JUnit test class.
|
||||
*/
|
||||
public class ExampleJUnitTest {
|
||||
|
||||
@Test
|
||||
public void testAddition() {
|
||||
assertEquals(2, 1 + 1);
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue