Last active
October 30, 2015 17:41
-
-
Save vbedegi/8d2e2ec03a513f6168b4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
open System.IO | |
let gravity = 9.81 | |
let angleOfReach speed distance = 0.5 * Math.Asin((gravity * distance) / Math.Pow(speed, 2.0)) | |
let distanceTravelled speed angle = Math.Pow(speed, 2.0) * Math.Sin(2.0 * angle) / gravity | |
let angle x y = Math.Atan(y / x) | |
type Entity = | |
{ X : float | |
Y : float | |
Speed : float | |
Distance : float | |
Name : string } | |
type Result = | |
{ DistanceTravelled : double | |
Hits : bool | |
ActualAngle : double | |
RequiredAngle : double } | |
let calcResult entity = | |
let actualAngle = angle entity.X entity.Y | |
let actualDistance = distanceTravelled entity.Speed actualAngle | |
let requiredAngle = angleOfReach entity.Speed entity.Distance | |
{ DistanceTravelled = actualDistance | |
Hits = actualDistance = entity.Distance | |
ActualAngle = actualAngle | |
RequiredAngle = requiredAngle } | |
let GetFile = | |
Console.Write("Enter the full path to the name of the input file: ") | |
Console.ReadLine() | |
[<EntryPoint>] | |
let main argv = | |
try | |
use input = | |
new StreamReader(match argv.Length with | |
| 0 -> GetFile | |
| _ -> argv.[0]) | |
let entities = | |
[ while not input.EndOfStream do | |
let raw = input.ReadLine() | |
let values = raw.Split(',') | |
yield { X = float values.[0] | |
Y = float values.[1] | |
Speed = float values.[2] | |
Distance = float values.[3] | |
Name = values.[4] } ] | |
let tuples = | |
seq { | |
for entity in entities -> | |
(entity, calcResult(entity)) | |
} | |
Console.WriteLine("The results are: ") | |
for (entity, result) in tuples do | |
match result with | |
| {Hits = true} -> Console.WriteLine("{0} hits", entity.Name) | |
| _ -> Console.WriteLine("{0} misses, actual angle: {1}, required angle: {2}", entity.Name, result.ActualAngle, result.RequiredAngle) | |
Console.ReadKey() | |
0 | |
with | |
| :? System.IO.FileNotFoundException -> | |
Console.Write("File Not Found. Press a key to exit") | |
Console.ReadKey() | |
-1 | |
| _ -> | |
Console.Write("Something else happened") | |
Console.ReadKey() | |
-1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment