Skip to content

Commit e799ac5

Browse files
committed
Встречайте степень(^) и корень(#)
1 parent 99f8af5 commit e799ac5

1 file changed

Lines changed: 30 additions & 13 deletions

File tree

app/src/main/java/com/apochromat/codeblockmobile/logic/Arithmetics.kt

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.apochromat.codeblockmobile.logic
22

33
import java.util.*
4-
import kotlin.math.exp
4+
import kotlin.math.*
55

66
fun arithmetics(heap: Heap, expression: String): Pair<String, Int> {
77
val exp = expression.replace("\\s".toRegex(), "")
@@ -21,6 +21,7 @@ fun arithmetics(heap: Heap, expression: String): Pair<String, Int> {
2121

2222
fun getPriority(token: Char): Int {
2323
return when (token) {
24+
'#','^' -> 4
2425
'*', '/', '%' -> 3
2526
'+', '-' -> 2
2627
'(' -> 1
@@ -38,7 +39,7 @@ fun expressionToRPN(expression: String): String {
3839
when (priority) {
3940
0 -> current += expression[i]
4041
1 -> stack.push(expression[i])
41-
2, 3 -> {
42+
2, 3,4 -> {
4243
current += " "
4344
while (!stack.empty()) {
4445
if ((getPriority(stack.peek()) >= priority)) current += stack.pop()
@@ -87,6 +88,25 @@ fun rpnToAnswer(rpn: String): Pair<String, Int> {
8788
val a: Int = stack.pop()
8889
val b: Int = stack.pop()
8990
when (rpn[i]) {
91+
'^' ->{
92+
val result = b.toDouble().pow(a).toLong()
93+
if(result>=2147483647){
94+
return Pair("Memory limit", 0)
95+
}
96+
stack.push(result.toInt())
97+
}
98+
'#' ->{
99+
val step =1/a.toDouble()
100+
val result = b.toDouble().pow(step).toLong()
101+
102+
if (b<0){
103+
return Pair("Root of a negative number",0)
104+
}
105+
if(result>=2147483647){
106+
return Pair("Memory limit", 0)
107+
}
108+
stack.push(result.toInt())
109+
}
90110
'+' -> stack.push(b + a)
91111
'-' -> stack.push(b - a)
92112
'*' -> stack.push(b * a)
@@ -118,16 +138,15 @@ fun rpnToAnswer(rpn: String): Pair<String, Int> {
118138
}
119139

120140
fun lineCheck(string: String): Pair<String, Int> {
121-
var str = string.replace("[A-Za-z-+*/0-9()%_\\[\\]]".toRegex(), "")
141+
var str = string.replace("[A-Za-z-+*/0-9()%_^#\\[\\]]".toRegex(), "")
122142
if (str.isNotEmpty()) {
123143
return Pair("Unexpected Symbol", 0)
124144
}
125-
val reg = "([-+%* ]+[0-9_]+[A_Za-z_]+[0-9]*[-+%* ]*)|(\\b[\\^0-9_]+[A-Za-z_]+[0-9]*)|(\\b[\\^_][0-9]+)".toRegex()
126-
//println(reg.find(string)?.value)
145+
val reg = "([-+%#^ ]+[0-9_]+[A_Za-z_]+[0-9]*[-+%*#^ ]*)|(\\b[0-9_]+[A-Za-z_]+[0-9]*)|(\\b[_][0-9]+)".toRegex()
127146
if(reg.find(string)!=null){
128147
return Pair("Incorrect Expression",0)
129148
}
130-
str=string.replace("[A-Za-z-+*/0-9%_\\[\\]]".toRegex(), "")
149+
str=string.replace("[A-Za-z-+*/0-9%^#_\\[\\]]".toRegex(), "")
131150
val scob1=str.replace("\\(".toRegex(), "")
132151
val scob2 =str.replace("\\)".toRegex(), "")
133152
if (scob1.length!=scob2.length) {
@@ -139,7 +158,7 @@ fun lineCheck(string: String): Pair<String, Int> {
139158
fun preparingExpression(heap: Heap, expression: String): Pair<String, Int> {
140159
var exp = expression
141160
var preparedExpression = String()
142-
val regArr="([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +%*/_-]*]".toRegex();
161+
val regArr="([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +%*/_#^-]*]".toRegex();
143162
var array = regArr.find(exp);
144163
while (array!=null) {
145164
val (arrName, arrIndex) = indexCount(heap, array.value)
@@ -186,11 +205,10 @@ fun preparingExpression(heap: Heap, expression: String): Pair<String, Int> {
186205
return Pair(preparedExpression, 1)
187206
}
188207
fun defineInput(heap:Heap, expression: String):Triple<String,String, Int>{
189-
val arr="[A-Za-z]+[\\[(\\d+_*)\\]]".toRegex();
208+
val arr="[A-Za-z]+[\\[(\\d+_*^#)\\]]".toRegex();
190209
val varieble = "[A-Za-z]+[A-Za-z0-9_]*".toRegex();
191210

192211
if(arr.find(expression)!=null){
193-
// println(expression)
194212
val(name, index)= indexCount(heap,expression);
195213
if (index==-1){
196214
return Triple(name, "NaN", 0);
@@ -200,7 +218,6 @@ fun defineInput(heap:Heap, expression: String):Triple<String,String, Int>{
200218
}
201219
}
202220
if(varieble.find(expression)!=null){
203-
// var value = heap.getVariableValue(expression);
204221
if(heap.isVariableExist(expression)) {
205222
return Triple("Variable", expression, 0);
206223
}
@@ -211,9 +228,9 @@ fun indexCount(heap:Heap, arr:String):Pair<String,Int>{
211228
var array:String=arr;
212229
var index=-1;
213230
var arrname="";
214-
val reg="([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +*/%_-]*]".toRegex();
231+
val reg="([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +*/%_^#-]*]".toRegex();
215232
while (reg.find(array)!=null){
216-
val arg="\\[[A-Za-z0-9 +*/_%-]*]".toRegex().find(array);
233+
val arg="\\[[A-Za-z0-9 +*/_%^#-]*]".toRegex().find(array);
217234
arrname="[A-Za-z]+[A-Za-z0-9_]*".toRegex().find(reg.find(array)!!.value)!!.value;
218235
if(arg!=null) {
219236
var arm=arg.value.replace("[","");
@@ -232,7 +249,7 @@ fun indexCount(heap:Heap, arr:String):Pair<String,Int>{
232249
if(status!="OK"){
233250
return Pair(status,-1)
234251
}
235-
var arrayValue=heap.getArrayValue(arrname,rez);
252+
val arrayValue=heap.getArrayValue(arrname,rez);
236253
array=array.replace(reg.find(array)!!.value, arrayValue.toString());
237254

238255
}

0 commit comments

Comments
 (0)