debugcsharpModerate
"Nice Angles" - Code Eval challenge
Viewed 0 times
challengeniceanglescodeeval
Problem
Out of fun, I solved "Nice Angles" challenge on CodeEval in C# 4.0:
CHALLENGE DESCRIPTION:
Write a program that outputs the value of angle, reducing its
fractional part to minutes and seconds.
INPUT SAMPLE:
The first argument is a path to a file that contains the values of
angles with their decimal fractions:
OUTPUT SAMPLE:
Print to stdout values of angles with their fractional parts reduced
to minutes and seconds.
The whole and fractional parts are separated by period, minutes are
separated by apostrophe, seconds by double quotes. The values of
minutes and seconds are shown as two numbers (with leading zeros if
needed).
This is the code I used to solve the problem:
```
public static void ConvertToMinSec(string path)
{
using (StreamReader reader = File.OpenText(path))
{
while (!reader.EndOfStream)
{
var degreeValues = reader.ReadLine();
if (!string.IsNullOrWhiteSpace(degreeValues))
{
var totalVal = degreeValues.Split('.');
if (totalVal.Length == 1)
{
var temp = totalVal[0] + ".0";
totalVal = temp.Split('.');
}
var intPart = totalVal[0];
var decimalPart = "0." + totalVal[1];
decimal minutes;
decimal.TryParse(decimalPart, out minutes);
minutes = decimal.Multiply(minutes, 60);
var minutePart = (int)minutes;
var remainingDecimal = minutes.ToString().Split('.');
if (remainingDecimal.Length == 1)
{
CHALLENGE DESCRIPTION:
Write a program that outputs the value of angle, reducing its
fractional part to minutes and seconds.
INPUT SAMPLE:
The first argument is a path to a file that contains the values of
angles with their decimal fractions:
330.39991833
0.001
14.64530319
0.25
254.16991217OUTPUT SAMPLE:
Print to stdout values of angles with their fractional parts reduced
to minutes and seconds.
The whole and fractional parts are separated by period, minutes are
separated by apostrophe, seconds by double quotes. The values of
minutes and seconds are shown as two numbers (with leading zeros if
needed).
330.23'59"
0.00'03"
14.38'43"
0.15'00"
254.10'11"This is the code I used to solve the problem:
```
public static void ConvertToMinSec(string path)
{
using (StreamReader reader = File.OpenText(path))
{
while (!reader.EndOfStream)
{
var degreeValues = reader.ReadLine();
if (!string.IsNullOrWhiteSpace(degreeValues))
{
var totalVal = degreeValues.Split('.');
if (totalVal.Length == 1)
{
var temp = totalVal[0] + ".0";
totalVal = temp.Split('.');
}
var intPart = totalVal[0];
var decimalPart = "0." + totalVal[1];
decimal minutes;
decimal.TryParse(decimalPart, out minutes);
minutes = decimal.Multiply(minutes, 60);
var minutePart = (int)minutes;
var remainingDecimal = minutes.ToString().Split('.');
if (remainingDecimal.Length == 1)
{
Solution
At the heart of the solution, there should be a function that converts decimal degrees into a d°mm'ss" string. Assuming that the input is in a reasonable domain (between 0 and 360, for example), the conversion algorithm should be simple and regular. Above all, it should be purely mathematical at this point — you shouldn't be trying to do any string parsing.
Your format string had lots of unnecessary concatenation.
Your format string had lots of unnecessary concatenation.
public static string ToDegMinSec(double dec)
{
int degrees = (int)dec;
dec = 60 * (dec - degrees);
int minutes = (int)dec;
dec = 60 * (dec - minutes);
int seconds = (int)dec;
return string.Format("{0}.{1:00}'{2:00}\"", degrees, minutes, seconds);
}Code Snippets
public static string ToDegMinSec(double dec)
{
int degrees = (int)dec;
dec = 60 * (dec - degrees);
int minutes = (int)dec;
dec = 60 * (dec - minutes);
int seconds = (int)dec;
return string.Format("{0}.{1:00}'{2:00}\"", degrees, minutes, seconds);
}Context
StackExchange Code Review Q#62926, answer score: 10
Revisions (0)
No revisions yet.