Problem Statement
<FORMULA> :== D(<FORMULA>) | I(<FORMULA>) | T(<NUM>,<FORMULA>) | 'f' <NUM> :== a positive integer between 1 and 100 inclusive with no leading zerosThe following congruences allow us to change a formula into an equivalent one (here F denotes some <FORMULA>):
D(I(F)) == F I(D(F)) == F D(T(i,F)) == T(i-1,D(F)) I(T(i,F)) == T(i+1,I(F))Return a
Definition
- Class:
- TaylorAlgebra
- Method:
- getCanonical
- Parameters:
- String
- Returns:
- String
- Method signature:
- String getCanonical(String formula)
- (be sure your method is public)
Constraints
- formula will contain between 1 and 50 characters, inclusive.
- formula will adhere to the grammar in the statement.
Examples
"T(100,f)"
Returns: "T(100,f)"
None of the congruences are appropriate.
"D(T(50,f))"
Returns: "T(49,D(f))"
The 'D' can be nested more deeply.
"D(T(1,f))"
Returns: "D(T(1,f))"
We want to push the 'D' inward, but that would drop the number lower than 1.
"I(T(100,f))"
Returns: "I(T(100,f))"
Pushing the 'I' inward would force the number above 100.
"D(T(40,I(f)))"
Returns: "T(39,f)"
"I(T(40,D(f)))"
Returns: "T(41,f)"
"D(D(D(D(I(I(I(D(D(D(I(f)))))))))))"
Returns: "D(D(D(f)))"
"D(I(T(1,f)))"
Returns: "T(1,f)"
"I(D(T(1,f)))"
Returns: "T(1,f)"
"I(D(D(T(1,f))))"
Returns: "D(T(1,f))"
"D(D(D(D(D(D(D(D(D(D(D(D(D(D(T(10,f)))))))))))))))"
Returns: "D(D(D(D(D(T(1,D(D(D(D(D(D(D(D(D(f)))))))))))))))"
"I(I(I(I(I(I(I(I(I(I(I(I(I(I(T(90,f)))))))))))))))"
Returns: "I(I(I(I(T(100,I(I(I(I(I(I(I(I(I(I(f)))))))))))))))"
"D(D(D(D(D(D(D(T(97,D(D(T(98,f)))))))))))"
Returns: "T(90,T(89,D(D(D(D(D(D(D(D(D(f)))))))))))"
"D(D(D(D(D(D(D(T(4,D(D(T(3,f)))))))))))"
Returns: "D(D(D(D(T(1,D(D(D(T(1,D(D(f)))))))))))"
"T(10,T(10,T(10,T(10,T(10,T(10,T(10,f)))))))"
Returns: "T(10,T(10,T(10,T(10,T(10,T(10,T(10,f)))))))"
"D(T(10,T(10,T(10,T(10,T(10,T(10,T(10,f))))))))"
Returns: "T(9,T(9,T(9,T(9,T(9,T(9,T(9,D(f))))))))"
"D(T(10,T(10,T(10,T(10,T(1,T(10,T(10,f))))))))"
Returns: "T(9,T(9,T(9,T(9,D(T(1,T(10,T(10,f))))))))"
"I(T(10,T(10,T(10,T(10,T(10,T(10,T(10,f))))))))"
Returns: "T(11,T(11,T(11,T(11,T(11,T(11,T(11,I(f))))))))"
"I(T(10,T(10,T(10,T(100,T(10,T(10,T(10,f))))))))"
Returns: "T(11,T(11,T(11,I(T(100,T(10,T(10,T(10,f))))))))"
"f"
Returns: "f"
"D(f)"
Returns: "D(f)"
"D(D(D(D(D(D(D(D(D(I(I(I(I(I(I(I(f))))))))))))))))"
Returns: "D(D(f))"
"f"
Returns: "f"
"D(f)"
Returns: "D(f)"
"I(f)"
Returns: "I(f)"
"D(T(1,I(T(100,D(T(1,I(T(100,D(T(1,f))))))))))"
Returns: "D(T(1,I(T(100,D(T(1,I(T(100,D(T(1,f))))))))))"
"D(D(T(2,D(T(2,D(T(2,D(T(2,I(f))))))))))"
Returns: "D(T(1,D(T(1,D(T(1,D(T(1,f))))))))"
"D(D(D(D(D(D(D(D(D(I(I(I(I(I(I(I(f))))))))))))))))"
Returns: "D(D(f))"
"f"
Returns: "f"
"D(f)"
Returns: "D(f)"
"I(f)"
Returns: "I(f)"
"D(T(1,I(T(100,D(T(1,I(T(100,D(T(1,f))))))))))"
Returns: "D(T(1,I(T(100,D(T(1,I(T(100,D(T(1,f))))))))))"
"D(D(T(2,D(T(2,D(T(2,D(T(2,I(f))))))))))"
Returns: "D(T(1,D(T(1,D(T(1,D(T(1,f))))))))"
"D(D(D(D(D(D(D(D(D(D(D(D(T(12,f)))))))))))))"
Returns: "D(T(1,D(D(D(D(D(D(D(D(D(D(D(f)))))))))))))"
"D(T(2,f))"
Returns: "T(1,D(f))"