I tried something and found your mistake…your distances are due to the fact you inverted longitude and latitude.
Hello,
Here are my impressions. When I started the puzzle, I was quite concerned about the rounding problems, and I thought that this puzzle would require a lot of precision, and debugging would probably be tideous. Then the small uncertainty about the formula (because you did not give it yourself) was frustrating, also because Wikipedia does not explain the N/S and W/E thing. It was really interesting to learn about longitude and latitude, but to my opinion the puzzle should be about coding first.
In the end, I found the errors in my code thanks to your debug output with the coordinates of Epidaurus etc. I was dividing by 360 instead of 3600… I am not sure I would have had enough patience to find it on my own, so I think this example should be part of the puzzle presentation.
Anyway, thank you for this puzzle!
Hi
I just finished this puzzle.
I took way more time to solve it that I’d like, but mainly because I’m a bad reader.
Everything is said on the description of the puzzle, all the mistakes I made were my own.
- Quick reading of the longitude & latitude format
- Bad rouding that I solved the lazy way
- And, most of all, I inverted latitude & longitude in the arcos formula, only because the input from the puzzle is not on the same order than the wiki page.
All those mistakes would have been avoided if I had correctly read the puzzle description.
So… Nice job on this one, TBali
hi!
I have a problem with test 2 and 6, I think it is due to the number of bits because I only have 13 to 16 digits after the decimal point.
Or I was wrong in the calculations.
Can we increase the number of bits on php?
Thanks
Hi,
PHP on CG is by default 64bit with integers, and double with floats. So I think it might be a bug in the calculation.
thanks for your quick reply, i will look at my calculations
excuse me I post my calculation because I did find the errors.
function calculDistance(array $travel, array $capital){
return acos( sin($travel[‘lat’]) * sin($capital[‘lat’]) + cos($travel[‘lat’]) * cos($capital[‘lat’]) * cos( abs($capital[‘long’]-$travel[‘long’]) ) ) * $r;
}
if you can help me!
I also use PHP. Your formula seems to be correct (assuming $travel and $capital has the lat and long already in radian! I use deg2rad(...)
here.
After or before return you also need to round the result to integer kilometers. I use
return intval(round(..))
for this.
Also, when filling $travel and capital, make sure you convert DMS coordinates to degrees correctly, including signs for the N/S and W/E hemispheres.
I understood my error, I understood that there was a good answer by coordinates and not several suddenly I must resume my function of sorting the distances and display.
Thanks
Successful puzzle!
thank you very much i had fun and learned to manipulate coordinates.
Just finished the puzzle
- used python 3.
- I used the arccos algorithm
- run into the "E and W coordinates have a three-digit degree instead of two problem
Two things to note for future people that try it with python 3:
- rounding (everything equal or above x.5 goes up) worked somewhat, but not for test cases 02 “Border…” and some other test case due to rounding problems
- on that note DON’T trust the standard round() method of python (just execute “round(0.5)” and “round(1.5)” and look what python gives you)
- Ultimately I abandoned rounding of my distances and added a coarse value for the near check e.g. if two distances have a difference smaller or equal to the coarse value then they’re the same
- For my code a coarse value of 2 km passed all test cases but failed Validator 5
- good enough for me!
- For my code a coarse value of 2 km passed all test cases but failed Validator 5
Hope that helps other people
EDIT: A coarse value of 1.5 km passed all validators.
Yes, unfortunately the default behaviour of Python round(x)
is “rounding half to even” which is quite different from what is needed in this puzzle:
round(0.5) = 0
round(1.5) = 2
round(2.5) = 2
round(3.5) = 4
With the decimal module you can use another rounding strategy.
https://docs.python.org/3/library/decimal.html#rounding-modes
The first answer in this thread shows an example how to use it properly:
There seems to be a problem with the input in test case 4, which is probably the cause of
much of the confusion:
Epidaurus N373800 E0230800
The longitude is given with 7 digits, not in accordance with the problem description.
Many programs will interpret it as 2° instead of 23°
And one of the latitudes in test case 6 is given as:
W1753000
(also 7 digits, now with a trailing zero)
It is in accordance with the description.
Latitude has the format “Nddmmss” with 6 digits, and longitude has the format “Edddmmss” with 7 digits.
Just finished the problem myself so I can confirm it works as intended.
Oh dear, i feel really stupid now
thanks for clearing that up.
could somebody please show me the correct formula of the distance?
because I totally don’t understand why I just cannot calculate the real distance out
for example, in test case’s data below:
Travel point #3: N450915 E0125549
= in DEG: (45.154166666667, 12.930277777778) <–I made this
= in RAD: (0.78808887932761, 0.22567592041968) <–I also made this
Epidaurus N373800 E0230800
= in DEG: (37.633333333333, 23.133333333333) <–I also made this
= in RAD: (0.6568255751672, 0.40375283362802) <–I also made this
distance = 1191 <— I CANNOT made this!!
how? how to know travel point to this capital’s distance is 1191 km?? I copied some codes from the internet , and they still cannot help me to solve this puzzle.
I had solved ALL easy practice puzzle but the last one: this puzzle… and I know that reason why I cannot solve it because I don’t know how to USE the distance formula, that made me depressed
these datas are my codes output in testcase 2 & 6:
#0 N373800 E0230800
Epidaurus distance= 0
The_Globe_Theatre distance= 2382
Broadway distance= 7903
#1 N513025 W0000542
Epidaurus distance= 2382
The_Globe_Theatre distance= 0
Broadway distance= 5567
#2 N404532 W0735906
Epidaurus distance= 7903
The_Globe_Theatre distance= 5567
Broadway distance= 0
#3 N450915 E0125549
Epidaurus distance= 1191
The_Globe_Theatre distance= 1191
Broadway distance= 6732
#4 N505540 W0235856
Epidaurus distance= 3951
The_Globe_Theatre distance= 1657
Broadway distance= 3951
#5 N522335 W0411458
Epidaurus distance= 5132
The_Globe_Theatre distance= 2783
Broadway distance= 2783
#6 N450815 E0125649
Epidaurus distance= 1189
The_Globe_Theatre distance= 1193
Broadway distance= 6735
#7 N451015 E0125449
Epidaurus distance= 1193
The_Globe_Theatre distance= 1189
Broadway distance= 6730
#8 N512335 W0511458
Epidaurus distance= 5826
The_Globe_Theatre distance= 3471
Broadway distance= 2101
#0 N000000 W1753000
Joe_s_Place distance= 614
Jack_s_Place distance= 611
Laplace distance= 614
#1 N900000 E1790000
Joe_s_Place distance= 10006
Jack_s_Place distance= 10006
Laplace distance= 10006
#2 N900000 W1700000
Joe_s_Place distance= 10006
Jack_s_Place distance= 10006
Laplace distance= 10006
#3 S900000 W0123456
Joe_s_Place distance= 10008
Jack_s_Place distance= 10008
Laplace distance= 10008
#4 N000000 E0043000
Joe_s_Place distance= 19402
Jack_s_Place distance= 19402
Laplace distance= 19402
#5 N123456 E0043000
Joe_s_Place distance= 18489
Jack_s_Place distance= 18489
Laplace distance= 18489
#6 S123456 E0123456
Joe_s_Place distance= 17964
Jack_s_Place distance= 18587
Laplace distance= 17964
You may have some rounding issues, here’s what I get for test 2 :
Location 1
Epidaurus distance: 0
The_Globe_Theatre distance: 2383
Broadway distance: 7903
Location 2
Epidaurus distance: 2383
The_Globe_Theatre distance: 0
Broadway distance: 5568
Location 3
Epidaurus distance: 7903
The_Globe_Theatre distance: 5568
Broadway distance: 0
Location 4
Epidaurus distance: 1191
The_Globe_Theatre distance: 1191
Broadway distance: 6733
Location 5
Epidaurus distance: 3952
The_Globe_Theatre distance: 1658
Broadway distance: 3952
Location 6
Epidaurus distance: 5132
The_Globe_Theatre distance: 2784
Broadway distance: 2784
Location 7
Epidaurus distance: 1189
The_Globe_Theatre distance: 1194
Broadway distance: 6735
Location 8
Epidaurus distance: 1194
The_Globe_Theatre distance: 1189
Broadway distance: 6731
Location 9
Epidaurus distance: 5826
The_Globe_Theatre distance: 3471
Broadway distance: 2101
Your result is very close. Two possibilities:
- Do you use rounding with the ‘half round up’ method? (Simply casting the float value to integer is like floor(), so not enough here).
- Do you use double precision floats during the computation and cast to integer only as the very last step? (Some languages double is the default or even the only available floating point type, in other languages you need to explicitly declare it.)
Because your result is usually just 1 off from the correct one, your distance formula seems okay, try to check the above two ideas.
it seems the problem , and I try to fix it to carry out test#2, but still cannot pass#6
here is my data updated:
#0
Joe_s_Place distance= 614
Jack_s_Place distance= 612 <— is this correct??
Laplace distance= 614
#1
Joe_s_Place distance= 10007
Jack_s_Place distance= 10007
Laplace distance= 10007
#2
Joe_s_Place distance= 10007
Jack_s_Place distance= 10007
Laplace distance= 10007
#3
Joe_s_Place distance= 10008
Jack_s_Place distance= 10008
Laplace distance= 10008
#4
Joe_s_Place distance= 19402
Jack_s_Place distance= 19402
Laplace distance= 19402
#5
Joe_s_Place distance= 18490
Jack_s_Place distance= 18490
Laplace distance= 18490
#6
Joe_s_Place distance= 17964
Jack_s_Place distance= 18588
Laplace distance= 17964