Upload files to "java/expression"
This commit is contained in:
47
java/expression/Pow2.java
Normal file
47
java/expression/Pow2.java
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package expression;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Doschennikov Nikita (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public class Pow2 extends AbstractExpression {
|
||||||
|
private final AbstractExpression operand;
|
||||||
|
|
||||||
|
public Pow2(AbstractExpression operand) {
|
||||||
|
this.operand = operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int pow2(int n) {
|
||||||
|
if (n < 0) throw new ArithmeticException("pow₂ of negative number: " + n);
|
||||||
|
if (n >= 31) throw new OverflowException("pow₂");
|
||||||
|
return 1 << n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public int evaluate(int x) { return pow2(operand.evaluate(x)); }
|
||||||
|
@Override public int evaluate(int x, int y, int z) { return pow2(operand.evaluate(x,y,z)); }
|
||||||
|
@Override public int evaluate(List<Integer> vars) { return pow2(operand.evaluate(vars)); }
|
||||||
|
@Override public BigInteger evaluateBi(List<BigInteger> vars) { throw new UnsupportedOperationException(); }
|
||||||
|
@Override public BigDecimal evaluateBd(List<BigDecimal> vars) { throw new UnsupportedOperationException(); }
|
||||||
|
|
||||||
|
@Override public String toString() { return "pow₂(" + operand + ")"; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toMiniString() {
|
||||||
|
if (operand instanceof AbstractBinaryOperation) {
|
||||||
|
return "pow₂(" + operand.toMiniString() + ")";
|
||||||
|
}
|
||||||
|
return "pow₂ " + operand.toMiniString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (!(obj instanceof Pow2)) return false;
|
||||||
|
return operand.equals(((Pow2) obj).operand);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public int hashCode() { return operand.hashCode() ^ 0x504F5732; }
|
||||||
|
}
|
||||||
46
java/expression/Power.java
Normal file
46
java/expression/Power.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package expression;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Doschennikov Nikita (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public class Power extends AbstractBinaryOperation {
|
||||||
|
public Power(AbstractExpression l, AbstractExpression r) { super(l, r); }
|
||||||
|
|
||||||
|
@Override protected String getOperator() { return "**"; }
|
||||||
|
@Override protected int getPriority() { return 3; }
|
||||||
|
@Override protected boolean isRightAssoc() { return true; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int applyInt(int base, int exp) {
|
||||||
|
if (exp < 0) throw new ArithmeticException("negative exponent");
|
||||||
|
if (base == 0 && exp == 0) throw new ArithmeticException("zero to the power of zero");
|
||||||
|
if (exp == 0) return 1;
|
||||||
|
if (base == 0) return 0;
|
||||||
|
int result = 1;
|
||||||
|
int b = base;
|
||||||
|
int e = exp;
|
||||||
|
while (e > 0) {
|
||||||
|
if ((e & 1) == 1) {
|
||||||
|
result = checkedMul(result, b);
|
||||||
|
}
|
||||||
|
if (e > 1) b = checkedMul(b, b);
|
||||||
|
e >>= 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int checkedMul(int a, int b) {
|
||||||
|
if (a == 0 || b == 0) return 0;
|
||||||
|
if (a == Integer.MIN_VALUE && b == -1) throw new OverflowException("power");
|
||||||
|
if (b == Integer.MIN_VALUE && a == -1) throw new OverflowException("power");
|
||||||
|
int result = a * b;
|
||||||
|
if (result / a != b) throw new OverflowException("power");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected BigInteger applyBi(BigInteger a, BigInteger b) { return a.pow(b.intValueExact()); }
|
||||||
|
@Override protected BigDecimal applyBd(BigDecimal a, BigDecimal b) { return a.pow(b.intValueExact()); }
|
||||||
|
}
|
||||||
84
java/expression/Reverse.java
Normal file
84
java/expression/Reverse.java
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package expression;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Doschennikov Nikita (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public class Reverse extends AbstractExpression {
|
||||||
|
|
||||||
|
private final AbstractExpression operand;
|
||||||
|
|
||||||
|
public Reverse(AbstractExpression operand) {
|
||||||
|
this.operand = operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int reverseInt(int n) {
|
||||||
|
boolean negative = n < 0;
|
||||||
|
long abs = Math.abs((long) n);
|
||||||
|
long reversed = 0;
|
||||||
|
while (abs > 0) {
|
||||||
|
reversed = reversed * 10 + (abs % 10);
|
||||||
|
abs /= 10;
|
||||||
|
}
|
||||||
|
long result = negative ? -reversed : reversed;
|
||||||
|
return (int) result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int evaluate(int x) {
|
||||||
|
return reverseInt(operand.evaluate(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int evaluate(int x, int y, int z) {
|
||||||
|
return reverseInt(operand.evaluate(x, y, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int evaluate(List<Integer> vars) {
|
||||||
|
return reverseInt(operand.evaluate(vars));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BigInteger evaluateBi(List<BigInteger> vars) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"reverse not supported for BigInteger"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BigDecimal evaluateBd(List<BigDecimal> vars) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"reverse not supported for BigDecimal"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "reverse(" + operand + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toMiniString() {
|
||||||
|
if (operand instanceof AbstractBinaryOperation) {
|
||||||
|
return "reverse(" + operand.toMiniString() + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "reverse " + operand.toMiniString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (!(obj instanceof Reverse)) return false;
|
||||||
|
return operand.equals(((Reverse) obj).operand);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return operand.hashCode() ^ 0x52455645;
|
||||||
|
}
|
||||||
|
}
|
||||||
46
java/expression/SetBit.java
Normal file
46
java/expression/SetBit.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package expression;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Doschennikov Nikita (me@fymio.us)
|
||||||
|
*/
|
||||||
|
public class SetBit extends AbstractBinaryOperation {
|
||||||
|
|
||||||
|
public SetBit(AbstractExpression l, AbstractExpression r) {
|
||||||
|
super(l, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getOperator() {
|
||||||
|
return "set";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getPriority() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isRightAssoc() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int applyInt(int a, int b) {
|
||||||
|
return a | (1 << b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BigInteger applyBi(BigInteger a, BigInteger b) {
|
||||||
|
return a.setBit(b.intValueExact());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BigDecimal applyBd(BigDecimal a, BigDecimal b) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"set not supported for BigDecimal"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
7
java/expression/package-info.java
Normal file
7
java/expression/package-info.java
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* Tests for <a href="https://www.kgeorgiy.info/courses/prog-intro/homeworks.html#expressions">Expressions</a> homework
|
||||||
|
* of <a href="https://www.kgeorgiy.info/courses/prog-intro/">Introduction to Programming</a> course.
|
||||||
|
*
|
||||||
|
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
|
||||||
|
*/
|
||||||
|
package expression;
|
||||||
Reference in New Issue
Block a user