92 lines
3.9 KiB
Markdown
92 lines
3.9 KiB
Markdown
|
# Dog and Gopher
|
|||
|
|
|||
|
A large field has a dog and a gopher.
|
|||
|
|
|||
|
The dog wants to eat the gopher, while the gopher wants to run to safety through one of several gopher holes dug in the surface ofthe field.
|
|||
|
|
|||
|
Neither the dog nor the gopher is a math major; however, neither is entirely stupid.
|
|||
|
|
|||
|
The gopher decides on a particular gopher hole and heads for that hole in a straight line at a fixed speed. The dog, which is very good at reading body language, anticipates which hole the gopher has chosen.
|
|||
|
|
|||
|
The dog heads at double the speed of the gopher to the hole. If the dog reaches the hole first, the gopher gets gobbled up; otherwise, the gopher escapes.
|
|||
|
|
|||
|
## Objective
|
|||
|
You have been retained by the gopher to **select a hole through which it can escape**, if such a hole exists, by **reading a file with a variable set of scenarios**.
|
|||
|
|
|||
|
Some sample files are already provided to help the tests:
|
|||
|
```text
|
|||
|
assets/day-35_sample_1_valid.txt
|
|||
|
assets/day-35_sample_2_valid.txt
|
|||
|
assets/day-35_sample_3_invalid.txt
|
|||
|
assets/day-35_sample_4_invalid.txt
|
|||
|
assets/day-35_sample_5_invalid.txt
|
|||
|
assets/day-35_sample_6_invalid.txt
|
|||
|
```
|
|||
|
|
|||
|
Write a **gopherEscapePlan** function which returns a list/array of strings, with one entry per result of each set of scenarios.
|
|||
|
|
|||
|
The function has one input parameter:
|
|||
|
- **filename**: a string representing the path to the file
|
|||
|
|
|||
|
The function returns:
|
|||
|
- List/array of strings, with one entry per result of each set of scenarios or a BAD FILE! message if the file is invalid or inaccessible. See section **Output** below for more details.
|
|||
|
|
|||
|
## Input file format
|
|||
|
|
|||
|
The input file contains several sets of input. The first line of each set contains **one integer** and **four floating point numbers**.
|
|||
|
|
|||
|
The integer **n** denotes how many holes are in the set.
|
|||
|
The **four floating point numbers** denote the **(x, y) coordinates of the gopher** followed by the **(x, y) coordinates of the dog**.
|
|||
|
|
|||
|
The subsequent **n** lines of input each contain **two floating point numbers**: the **(x, y) coordinates of a gopher hole**. All distances are in meters to the nearest millimeter.
|
|||
|
|
|||
|
The input is **terminated by end of file** and **there is a blank line between two consecutive sets**.
|
|||
|
|
|||
|
The input file is still considered **valid** if there is more than one **blank line between two consecutive sets** or if there are **blank lines at the beginning of the file** as well.
|
|||
|
|
|||
|
## Output
|
|||
|
Return a single line for *each set* of input.
|
|||
|
|
|||
|
If the gopher can escape, the output line should read, _“The gopher can escape through the hole at (x, y).”_ while identifying the appropriate hole to the nearest millimeter.
|
|||
|
|
|||
|
Otherwise, the output line should read, _“The gopher cannot escape.”_
|
|||
|
|
|||
|
If the gopher can escape through more than one hole, report the one that appears **first in the input**.
|
|||
|
|
|||
|
if the file is **inaccessible or invalid** (for example, **number of holes** found don't match **n** or there are more or less fields found on a line in the file), return just an **["BAD FILE!"]**.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## Constraints
|
|||
|
There are at most 1,000 gopher holes in a set of input and all coordinates range between –10,000 and +10,000.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
### Example of input file
|
|||
|
```text
|
|||
|
1.000 1.000 2.000 2.000
|
|||
|
1.500 1.500
|
|||
|
|
|||
|
2 2.000 2.000 1.000 1.000
|
|||
|
1.500 1.500
|
|||
|
2.500 2.500
|
|||
|
```
|
|||
|
|
|||
|
### Expected return
|
|||
|
```text
|
|||
|
["The gopher cannot escape.", "The gopher can escape through the hole at (2.500,2.500)."]
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
### Examples with the provided sample files avaliable at 'assets' folder
|
|||
|
```text
|
|||
|
gopherEscapePlan("...assets/day-35_sample_1_valid.txt") ➞ ["The gopher cannot escape.", "The gopher can escape through the hole at (2.500000,2.500000)."]
|
|||
|
|
|||
|
gopherEscapePlan("...assets/day-35_sample_2_valid.txt") ➞ ["The gopher cannot escape.", "The gopher can escape through the hole at (2.500000,2.500000)."]
|
|||
|
|
|||
|
gopherEscapePlan("...assets/day-35_sample_3_invalid.txt") ➞ ["BAD FILE!"]
|
|||
|
|
|||
|
gopherEscapePlan("...assets/day-35_sample_4_invalid.txt") ➞ ["BAD FILE!"]
|
|||
|
|
|||
|
gopherEscapePlan("...assets/day-35_sample_5_invalid.txt") ➞ ["BAD FILE!"]
|
|||
|
```
|