Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.03 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2.  
  3. open System
  4.  
  5. type Order =
  6. | North
  7. | South
  8. | East
  9. | West
  10. | Start
  11. | CutEngine
  12.  
  13. type MineFieldTerrain =
  14. | Wall
  15. | Field
  16. | Mine
  17. | Robot
  18.  
  19. type minefield = MineFieldTerrain List List
  20.  
  21. type position = int*int
  22.  
  23. let CharToOptionMineFieldTerrain = function
  24. | '+' -> Some Wall
  25. | '0' -> Some Field
  26. | '*' -> Some Mine
  27. | 'M' -> Some Robot
  28. | _ -> None
  29.  
  30. let charToOptionOrder = function
  31. | 'N' -> Some North
  32. | 'S' -> Some South
  33. | 'E' -> Some East
  34. | 'O' -> Some West
  35. | 'I' -> Some Start
  36. | '-' -> Some CutEngine
  37. | _ -> None
  38.  
  39. let mineFieldToChar = function
  40. | Wall -> '+'
  41. | Field -> '0'
  42. | Mine -> '*'
  43. | Robot -> 'M'
  44.  
  45. let addTuple a b =
  46. ((fst a + fst b),(snd a + snd b))
  47.  
  48. let replaceListValue i value lis =
  49. lis |> List.mapi(fun j x -> if i = j then value else x)
  50.  
  51. let printGrid (mfield:minefield) =
  52. let grid = mfield |> List.fold( (fun acc x -> acc + (x |> List.fold(fun acc2 y -> acc2 + (mineFieldToChar y |> Char.ToString) ) "") + Environment.NewLine )) ""
  53. printfn "%s" grid
  54.  
  55. let redrawField (mField:minefield) (currentPosition:position) (nextPosition:position) =
  56. let newField = mField |> List.mapi(fun i x -> match i with
  57. | v when v = (fst currentPosition) -> replaceListValue (snd currentPosition) Field x
  58. | _ -> x
  59. ) |> List.mapi(fun i x -> match i with
  60. | v when v = (fst nextPosition) -> replaceListValue (snd nextPosition) Robot x
  61. | _ -> x )
  62.  
  63. printGrid newField
  64.  
  65. let rec proccessMove (mField:minefield) (moves:position list) (currentPosition:position) =
  66. match (moves |> List.tryHead) with
  67. | None -> printfn "finished"
  68. | Some v -> let nextPosition = addTuple currentPosition v
  69. let nextPositionTerrain = mField |> List.item (fst nextPosition) |> List.item (snd nextPosition)
  70. match nextPositionTerrain with
  71. | Wall -> proccessMove mField (moves |> List.tail) v
  72. | Field -> redrawField mField currentPosition nextPosition
  73. proccessMove mField (moves |> List.tail) nextPosition
  74. | Mine -> printfn "RIP bot"
  75. | _ ->proccessMove mField (moves |> List.tail) v
  76.  
  77. let findStartPoistion (mfield:minefield) =
  78. let first = mfield |> List.findIndex(fun x -> x |> List.exists(fun y-> y = Robot))
  79. let second = mfield |> List.item first |> List.findIndex(fun y-> y = Robot)
  80. (first,second)
  81.  
  82. let clearMineField (mField:minefield) =
  83. mField |> List.map(fun x -> x |> List.map(fun y -> if y = Robot then Field else y))
  84.  
  85. let executeMoves (mfield:minefield) (moves:position list) =
  86. let startposition = mfield |> findStartPoistion
  87. let newField = mfield |> clearMineField
  88. proccessMove (newField:minefield) (moves:position list) startposition
  89.  
  90. let rec translateOrders (orders:Order list) (moves:position list) engine =
  91. match orders |> List.tryHead with
  92. | None -> moves |> List.rev
  93. | Some currentOrder ->
  94. match currentOrder with
  95. | North when engine -> translateOrders (orders |> List.tail) ((-1,0)::moves) engine
  96. | South when engine -> translateOrders (orders |> List.tail) ((1,0)::moves) engine
  97. | East when engine -> translateOrders (orders |> List.tail) ((0,1)::moves) engine
  98. | West when engine -> translateOrders (orders |> List.tail) ((0,-1)::moves) engine
  99. | Start when not engine -> translateOrders (orders |> List.tail) moves true
  100. | CutEngine when engine -> translateOrders (orders |> List.tail) moves false
  101. | _ -> translateOrders (orders |> List.tail) moves engine
  102.  
  103. let createMoves (orders:Order list) =
  104. translateOrders orders [] false
  105.  
  106.  
  107. ///Reads all the valid orders
  108.  
  109. let readOrders s =
  110. s |> Seq.choose( fun x -> charToOptionOrder x) |> Seq.toList
  111.  
  112. let rec readeMineField (reader:unit ->string) (field:minefield) =
  113. match reader() with
  114. | null -> field |> List.rev // Since the recusrion makes the list appear out of order
  115. | nchar -> readeMineField reader ((nchar |> Seq.choose(fun x-> (CharToOptionMineFieldTerrain x)) |> Seq.toList) :: field)
  116.  
  117. let createMinefield () =
  118. readeMineField Console.ReadLine []
  119.  
  120.  
  121. [<EntryPoint>]
  122. let main argv =
  123. printfn "Enter your minefield"
  124. let mine = (createMinefield())
  125. printGrid mine
  126. printfn "Enter your Orders"
  127. let orders = (readOrders (Console.ReadLine()))
  128. printfn "%A"orders
  129. let moves = (createMoves orders)
  130. printfn "moves %A" moves
  131. executeMoves mine moves
  132. 0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement