Advertisement
Guest User

Untitled

a guest
Nov 8th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.90 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.net
  2. // See the 'F# Tutorial' project for more help.
  3. open System
  4. open System.Text.RegularExpressions
  5.  
  6. let rec nwd (l:int, m:int) =
  7.     printfn "%d %d" l m
  8.     match l,m with
  9.     | (0, m) -> m
  10.     | (l, m) -> nwd(l%m ,m)
  11.  
  12. let StringToList(s: String) =
  13.     let array = s.ToCharArray() |> List.ofArray
  14.     array
  15.  
  16. let rec createMianownikExec(cz_ok: List<char>, cz_nok: List<char>, r: String) =
  17.     match cz_ok, cz_nok with
  18.     | [],[] -> String.Concat(r,"")
  19.     | [],h::t -> createMianownikExec(cz_ok, t, String.Concat(r,"0"))
  20.     | h::t,_ -> createMianownikExec(t, cz_nok, String.Concat(r,"9"))
  21.  
  22. let createMianownik(cz_ok: String, cz_nok: String) =
  23.     createMianownikExec(StringToList(cz_ok), StringToList(cz_nok),"")
  24.  
  25. let regExp(input, pattern) =
  26.     let r = new Regex(pattern)
  27.     r.Matches(input)
  28.  
  29. let readGroups(input, pattern) =
  30.     ((new Regex(pattern)).Match(input)).Groups
  31.  
  32. let if_null(input : String, default_value) =
  33.     match input with
  34.     | "" -> default_value
  35.     | _ -> int(input)
  36.  
  37. let fract(n: System.String) =
  38.     let pattern = "0[,|.]([0-9]+)?(\(([0-9]+)\))"
  39.     //printfn "%A" (readGroups(n, pattern))
  40.     if (regExp(n, pattern)).Count > 0 then
  41.         let groups = (readGroups(n, pattern))
  42.         let cz_ok = groups.Item(3).ToString()
  43.         let cz_nok = groups.Item(1).ToString()
  44.         let cz_wsp = String.Concat(cz_nok, cz_ok)
  45.         let l1 = int(cz_wsp)
  46.         let l2 = if_null(cz_nok, 0)
  47.         if (l1 = 0 && l2 = 0) then
  48.             "ERR"
  49.         else
  50.             let licz = l1 - l2
  51.             let mian = int(createMianownik(cz_ok, cz_nok))
  52.             let d = nwd(licz, mian)
  53.             printfn "%d/%d" (licz/d) (mian/d)
  54.             n
  55.     else
  56.         "ERR"
  57.  
  58. [<EntryPoint>]
  59. let main argv =
  60.     //let num = System.Console.ReadLine()
  61.     printfn "%A" (fract("0.78(5)"))
  62.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement