// Learn more about F# at http://f...content-available-to-author-only...p.net
let GetNumber3 akk h =
10.0*akk + float h - 48.0
let rec GetNumber2 (akk:float) arr (coof:float) isFloat =
match (arr, isFloat) with
|(h::t,false) when h >= '0'&& h<='9' -> GetNumber2 (GetNumber3 akk h) t coof isFloat;
|(h::t, true) when h >= '0'&& h<='9' -> GetNumber2 (GetNumber3 akk h) t (coof*10.0) isFloat;
|('.'::t, false) -> GetNumber2 akk t coof true;
|(t,_) -> (akk/coof, t)
let GetNumber arr = GetNumber2 0.0 arr 1.0 false
type Token =
| Add | Sub | Un | Mul | Div
let Convolution tokens action =
match (action, tokens) with
| (Add,v1::v2::t2) -> (v2+v1)::t2
| (Sub,v1::v2::t2) -> (v2-v1)::t2
| (Un,v::t2) -> -v::t2
| (Mul,v1::v2::t2) -> (v2*v1)::t2
| (Div,v1::v2::t2) -> (v2/v1)::t2
| _ -> tokens
let rec Pushing tokens actions priority=
match (actions, priority) with
| ((Un|Mul|Div)::t,2)-> Pushing (Convolution tokens (List.head actions)) t 2
| (h::t,1) -> Pushing (Convolution tokens (List.head actions)) t 1
| _ -> (tokens, actions)
let rec Parse arr tokens actions =
let pushingFunc = Pushing tokens actions
match arr with
| '*'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Mul:: acs)
| '/'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Div:: acs)
| '~'::t-> let (ts, acs) = pushingFunc 2 in Parse t ts (Un:: acs)
| '+'::t-> let (ts, acs) = pushingFunc 1 in Parse t ts (Add:: acs)
| '-'::t-> let (ts, acs) = pushingFunc 1 in Parse t ts (Sub:: acs)
| '('::t-> let (ts,newArr) = Parse t [] [] in (let ts2 = (List.head ts) :: tokens in Parse newArr ts2 actions)
| ')'::t-> let (ts,_) = pushingFunc 1 in (ts,t)
| h::t when (h >= '0'&& h<='9')||h='.' -> let (num,newArr) = (GetNumber arr) in Parse newArr (num::tokens) actions
| _::t -> Parse t tokens actions
| _ -> let (ts,_) = pushingFunc 1 in (ts,[])
let rec ArrToList2 arr (str:string) i =
match i with
|index when index > 0 -> ArrToList2 ((str.[index-1])::arr) (str) (index-1)
|_ -> arr
let ArrToList str = ArrToList2 [] str (String.length str)
let calculator (input:string) =
match Parse (ArrToList input) [] [] with
| (v::_,_) -> string v
| _ -> "Error"
open System
let rec InputFunc() =
match Console.ReadLine() with
| "exit" -> Console.WriteLine ""
| input -> Console.WriteLine ((calculator input)); InputFunc()
[<EntryPoint>]
let main argv =
InputFunc ()
0 // return an integer exit code
Ly8gTGVhcm4gbW9yZSBhYm91dCBGIyBhdCBodHRwOi8vZi4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucC5uZXQKbGV0ICBHZXROdW1iZXIzIGFrayBoID0KICAgMTAuMCpha2sgKyBmbG9hdCBoIC0gNDguMAoKbGV0IHJlYyBHZXROdW1iZXIyIChha2s6ZmxvYXQpIGFyciAoY29vZjpmbG9hdCkgaXNGbG9hdCA9CiAgIG1hdGNoIChhcnIsIGlzRmxvYXQpIHdpdGgKICAgfChoOjp0LGZhbHNlKSB3aGVuIGggPj0gJzAnJiYgaDw9JzknIC0+IEdldE51bWJlcjIgKEdldE51bWJlcjMgYWtrIGgpIHQgY29vZiBpc0Zsb2F0OyAKICAgfChoOjp0LCB0cnVlKSB3aGVuIGggPj0gJzAnJiYgaDw9JzknIC0+IEdldE51bWJlcjIgKEdldE51bWJlcjMgYWtrIGgpIHQgKGNvb2YqMTAuMCkgaXNGbG9hdDsgCiAgIHwoJy4nOjp0LCBmYWxzZSkgIC0+IEdldE51bWJlcjIgYWtrIHQgY29vZiB0cnVlOyAKICAgfCh0LF8pIC0+IChha2svY29vZiwgdCkKCmxldCBHZXROdW1iZXIgYXJyID0gR2V0TnVtYmVyMiAwLjAgYXJyIDEuMCBmYWxzZQoKdHlwZSBUb2tlbiA9IAogICB8IEFkZCB8IFN1YiAgfCBVbiB8IE11bCB8IERpdiAKICAgCmxldCBDb252b2x1dGlvbiB0b2tlbnMgYWN0aW9uID0KICAgbWF0Y2ggKGFjdGlvbiwgdG9rZW5zKSB3aXRoCiAgIHwgKEFkZCx2MTo6djI6OnQyKSAtPiAodjIrdjEpOjp0MgogICB8IChTdWIsdjE6OnYyOjp0MikgLT4gKHYyLXYxKTo6dDIKICAgfCAoVW4sdjo6dDIpIC0+IC12Ojp0MgogICB8IChNdWwsdjE6OnYyOjp0MikgLT4gKHYyKnYxKTo6dDIKICAgfCAoRGl2LHYxOjp2Mjo6dDIpIC0+ICh2Mi92MSk6OnQyCiAgIHwgXyAtPiB0b2tlbnMKCmxldCByZWMgUHVzaGluZyB0b2tlbnMgYWN0aW9ucyBwcmlvcml0eT0KICAgbWF0Y2ggKGFjdGlvbnMsIHByaW9yaXR5KSB3aXRoCiAgIHwgKChVbnxNdWx8RGl2KTo6dCwyKS0+ICBQdXNoaW5nIChDb252b2x1dGlvbiB0b2tlbnMgKExpc3QuaGVhZCBhY3Rpb25zKSkgdCAyCiAgIHwgKGg6OnQsMSkgLT4gUHVzaGluZyAoQ29udm9sdXRpb24gdG9rZW5zIChMaXN0LmhlYWQgYWN0aW9ucykpIHQgMQogICB8IF8gLT4gKHRva2VucywgYWN0aW9ucykKCmxldCByZWMgUGFyc2UgYXJyIHRva2VucyBhY3Rpb25zID0KICAgbGV0IHB1c2hpbmdGdW5jID0gUHVzaGluZyB0b2tlbnMgYWN0aW9ucwogICBtYXRjaCBhcnIgd2l0aAogICB8ICcqJzo6dC0+IGxldCAodHMsIGFjcykgPSBwdXNoaW5nRnVuYyAyIGluIFBhcnNlIHQgdHMgKE11bDo6IGFjcykKICAgfCAnLyc6OnQtPiBsZXQgKHRzLCBhY3MpID0gcHVzaGluZ0Z1bmMgMiBpbiBQYXJzZSB0IHRzIChEaXY6OiBhY3MpCiAgIHwgJ34nOjp0LT4gbGV0ICh0cywgYWNzKSA9IHB1c2hpbmdGdW5jIDIgaW4gUGFyc2UgdCB0cyAoVW46OiBhY3MpCiAgIHwgJysnOjp0LT4gbGV0ICh0cywgYWNzKSA9IHB1c2hpbmdGdW5jIDEgaW4gUGFyc2UgdCB0cyAoQWRkOjogYWNzKQogICB8ICctJzo6dC0+IGxldCAodHMsIGFjcykgPSBwdXNoaW5nRnVuYyAxIGluIFBhcnNlIHQgdHMgKFN1Yjo6IGFjcykKICAgfCAnKCc6OnQtPiBsZXQgKHRzLG5ld0FycikgPSBQYXJzZSB0IFtdIFtdIGluIChsZXQgdHMyID0gKExpc3QuaGVhZCB0cykgOjogdG9rZW5zIGluIFBhcnNlIG5ld0FyciB0czIgYWN0aW9ucykKICAgfCAnKSc6OnQtPiBsZXQgKHRzLF8pID0gcHVzaGluZ0Z1bmMgMSBpbiAodHMsdCkgCiAgIHwgaDo6dCB3aGVuIChoID49ICcwJyYmIGg8PSc5Jyl8fGg9Jy4nIC0+IGxldCAobnVtLG5ld0FycikgPSAoR2V0TnVtYmVyIGFycikgaW4gUGFyc2UgbmV3QXJyIChudW06OnRva2VucykgYWN0aW9ucwogICB8IF86OnQgLT4gUGFyc2UgdCB0b2tlbnMgYWN0aW9ucwogICB8IF8gLT4gbGV0ICh0cyxfKSA9IHB1c2hpbmdGdW5jIDEgaW4gKHRzLFtdKSAKCmxldCByZWMgQXJyVG9MaXN0MiBhcnIgKHN0cjpzdHJpbmcpIGkgPQogIG1hdGNoIGkgd2l0aCAKICB8aW5kZXggIHdoZW4gaW5kZXggPiAwIC0+IEFyclRvTGlzdDIgKChzdHIuW2luZGV4LTFdKTo6YXJyKSAoc3RyKSAoaW5kZXgtMSkKICB8XyAtPiBhcnIKCmxldCBBcnJUb0xpc3Qgc3RyID0gQXJyVG9MaXN0MiBbXSBzdHIgKFN0cmluZy5sZW5ndGggc3RyKQoKbGV0IGNhbGN1bGF0b3IgKGlucHV0OnN0cmluZykgID0gCiAgIG1hdGNoIFBhcnNlIChBcnJUb0xpc3QgaW5wdXQpIFtdIFtdIHdpdGgKICAgfCAodjo6XyxfKSAtPiBzdHJpbmcgdgogICB8IF8gLT4gIkVycm9yIgoKb3BlbiBTeXN0ZW0KCmxldCByZWMgSW5wdXRGdW5jKCkgPSAKICAgbWF0Y2ggQ29uc29sZS5SZWFkTGluZSgpIHdpdGgKICAgfCAiZXhpdCIgLT4gQ29uc29sZS5Xcml0ZUxpbmUgIiIKICAgfCBpbnB1dCAtPiBDb25zb2xlLldyaXRlTGluZSAoKGNhbGN1bGF0b3IgaW5wdXQpKTsgSW5wdXRGdW5jKCkKCls8RW50cnlQb2ludD5dCmxldCBtYWluIGFyZ3YgPSAKICAgSW5wdXRGdW5jICgpCiAgIDAgLy8gcmV0dXJuIGFuIGludGVnZXIgZXhpdCBjb2Rl