11package com.apochromat.codeblockmobile.logic
22
33import java.util.*
4- import kotlin.math.exp
4+ import kotlin.math.*
55
66fun 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
2222fun 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
120140fun 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> {
139158fun 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}
188207fun 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