runnable H07

This commit is contained in:
Oshgnacknak 2025-03-16 16:40:13 +01:00
parent 369ba3d231
commit 88d43259a4
Signed by: Oshgnacknak
GPG key ID: 8CB7375654585956
22 changed files with 16 additions and 494 deletions

13
.idea/workspace.xml generated Normal file
View 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">{
&quot;keyToString&quot;: {
&quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.0&quot;
}
}</component>
</project>

View file

@ -34,13 +34,4 @@ jagr {
rubricProviderName.set("h07.H07_RubricProvider") rubricProviderName.set("h07.H07_RubricProvider")
} }
} }
graders {
val graderPrivate by creating {
graderName.set("H07-Private")
rubricProviderName.set("h07.H07_RubricProvider")
configureDependencies {
implementation(libs.algoutils.tutor)
}
}
}
} }

View file

@ -1,3 +1,3 @@
[plugins] [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" } style = { id = "org.sourcegrade.style", version = "3.0.0" }

1
solution/H07/src/main Symbolic link
View file

@ -0,0 +1 @@
/home/osh/Desktop/FOP-2425-Marathon/H07/src/main

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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());
}
}
}

View file

@ -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);
}

View file

@ -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;
}
}
}

View file

@ -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);
}
}

View file

@ -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();
}

View file

@ -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;
}
}

View file

@ -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();
}

View file

@ -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;
}
}
}

View file

@ -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);
}

View file

@ -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;
}
}
}

View file

@ -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();
}

View file

@ -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;
}
}

View file

@ -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() + ")";
}
}

View file

@ -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
View file

@ -0,0 +1 @@
/home/osh/Desktop/FOP-2425-Marathon/H07/src/test

View file

@ -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);
}
}