Advertisement
ElfikCo

Programowanie funkcjonalne 2

Oct 24th, 2022
2,612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.52 KB | None | 0 0
  1. // Learn more about F# at http://docs.microsoft.com/dotnet/fsharp
  2.  
  3. open System
  4.  
  5. type LD = byte list
  6.  
  7. let str2LD (s:string) : LD  =
  8.     let zn = List.ofArray <| s.ToCharArray()
  9.     List.map (fun x -> byte (x) - 0x30uy) zn
  10.  
  11. let LD2str (L: LD) : string =
  12.     let zn = List.map (fun x -> char (x + 0x30uy)) L
  13.     new System.String (List.toArray zn)
  14.  
  15. let rec LDAddExe (L1: LD, L2: LD) =
  16.     match L1, L2 with
  17.     | _, [] ->  L1
  18.     | [], _ -> L2
  19.     | L1H::L1T, L2H::L2T -> (L1H + L2H)::LDAddExe(L1T, L2T)
  20.  
  21. let rec LDNorm (L: LD, carry: byte) =
  22.     match L with
  23.     | [] -> if carry = 0uy then [] else (carry % 10uy)::LDNorm ([], (carry / 10uy))
  24.     | lh::lt -> ((carry + lh) % 10uy)::LDNorm (lt, ((carry + lh) / 10uy))
  25.  
  26. let LDadd (L1: LD, L2: LD) =
  27.     let L1Rev = List.rev L1
  28.     let L2Rev = List.rev L2
  29.     let result1 = LDAddExe (L1Rev, L2Rev)
  30.     let result2 = LDNorm (result1, 0uy)
  31.     List.rev result2
  32.  
  33. let rec LDEqual (L1: LD, L2: LD) =
  34.     match L1, L2 with
  35.     | [], [] -> true
  36.     | _, [] -> false
  37.     | [], _ -> false
  38.     | L1H::L1T, L2H::L2T -> if L1H = L2H then LDEqual (L1T, L2T) else false
  39.  
  40. let LDLess (L1: LD, L2Smaller: LD) =
  41.     let rec LDLessHelper (L1: LD, L2Smaller: LD, result: bool) =
  42.         match L1, L2Smaller with
  43.         | [], [] -> result
  44.         | _, [] -> true
  45.         | [], _ -> false
  46.         | L1H::L1T, L2H::L2T -> LDLessHelper (L1T, L2T, L1H > L2H)
  47.     let L1Rev = List.rev L1
  48.     let L2Rev = List.rev L2Smaller
  49.     LDLessHelper (L1Rev, L2Rev, false)
  50.  
  51. let LDLessOrEqual (L1: LD, L2Smaller: LD) =
  52.     LDEqual(L1, L2Smaller) || LDLess (L1, L2Smaller)
  53.  
  54. let enq (queue: LD, element: byte) =
  55.     queue @ [element]
  56.  
  57. let deq (queue: LD) =
  58.     match queue with
  59.     | [] -> failwith "No elements in queue"
  60.     | h::t -> t
  61.  
  62. let rec mnozSkalar (L: LD) (w: byte) =
  63.     match L with
  64.     | [] -> []
  65.     | h::t -> (w * h)::mnozSkalar t w
  66.  
  67. let rec mnozExe (a: LD) (b:LD) (w: LD) (carry: LD) =
  68.     match a with
  69.     | [] -> w
  70.     | h::t ->
  71.         let p = mnozSkalar b h
  72.         let dp = carry @ (LDNorm (p, 0uy))
  73.         let we = LDAddExe (w, dp)
  74.         let wp = LDNorm (we, 0uy)
  75.         mnozExe t b wp (0uy::carry)
  76.  
  77. let mnoz (a: LD) (b: LD) =
  78.     let ar = List.rev a
  79.     let br = List.rev b
  80.     let cr = mnozExe ar br [] []
  81.     List.rev cr
  82.  
  83. type PrioQ = (int * int) list
  84.  
  85. let enqPrio (queue: PrioQ, element: int) =
  86.     queue @ [element]
  87.  
  88. let rec deqPrio (queue: PrioQ, found: int, prio: int) =
  89.     match queue with
  90.     | [] -> found
  91.     | (h1, h2)::t -> if h2 > prio then deqPrio (t, h1, h2)
  92.                      else deqPrio(t, found, prio)
  93.  
  94. [<EntryPoint>]
  95. let main argv =
  96.     printfn "%A" <| str2LD "123"
  97.     printfn "%A" <| LD2str [3uy; 2uy; 1uy]
  98.     printfn "%A" <| LDadd ([7uy; 2uy; 1uy], [3uy; 5uy; 3uy; 9uy])
  99.     printfn "%A" <| LDEqual ([2uy; 3uy; 4uy], [2uy; 3uy; 4uy])
  100.     printfn "%A" <| LDEqual ([2uy; 3uy; 4uy], [2uy; 3uy; 5uy])
  101.     printfn "%A" <| LDLess ([2uy; 3uy; 4uy], [2uy; 3uy; 4uy])
  102.     printfn "%A" <| LDLess ([3uy; 1uy; 1uy], [2uy; 3uy; 4uy])
  103.     printfn "%A" <| LDLess ([1uy; 1uy; 1uy; 1uy], [2uy; 3uy; 4uy])
  104.     printfn "%A" <| LDLessOrEqual ([2uy; 3uy; 4uy], [2uy; 3uy; 4uy])
  105.     printfn "%A" <| LDLessOrEqual ([3uy; 1uy; 1uy], [2uy; 3uy; 4uy])
  106.     printfn "%A" <| LDLessOrEqual ([1uy; 1uy; 1uy; 1uy], [2uy; 3uy; 4uy])
  107.     printfn "%A" <| LDLessOrEqual ([2uy; 1uy; 1uy], [2uy; 3uy; 4uy])
  108.     printfn "%A" <| deq (enq (enq (enq ([], 1uy), 2uy), 3uy))
  109.     printfn "%A" <| mnoz [3uy; 2uy] [4uy; 5uy]
  110.     printfn "%A" <|
  111.     0 // return an integer exit code
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement