Created
May 27, 2012 17:42
-
-
Save greyd/2815223 to your computer and use it in GitHub Desktop.
ДЗ5 таск 2
This file contains 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
var userInput = [ | |
"10 KM/H, 20 m", | |
"12 KM/sec, 1 km", | |
"7 miles/M, 123 miles", | |
"10 m/MIN, 2 metra", | |
"20 m/sec, 10 m", | |
"3 hours/min, 4 m" | |
]; | |
var calculateSpendTime = ( function() { | |
var availableUnits = { | |
distance : { | |
'km' : 1000, | |
'm' : 1 | |
}, | |
time : { | |
'h' : 3600, | |
'm' : 60, | |
's' : 1 | |
} | |
} | |
function readUserInput(str) { | |
var str = removeExtraSpaces(str).toLowerCase(); | |
var args = str.split(',') | |
if(args.length !== 2) throw 'Wrong input format : "xx (speed) , xx (distanse)")'; | |
var speed = parseUnit(trim(args[0])), | |
distance = parseUnit(trim(args[1])); | |
return spendTime(speed, distance); | |
} | |
function convertDistance(from, to) { | |
var distance = availableUnits.distance; | |
return distance[from] / distance[to]; | |
} | |
function trim(string) { | |
return string.replace(/^\s|\s$/, ''); | |
} | |
function removeExtraSpaces( string) { | |
return string.replace(/\s+/g, ' '); | |
} | |
function contains(item, mas) { | |
for(var key in mas) { | |
if (key === item) return true; | |
} | |
return false; | |
} | |
function isTime(unit) { | |
return contains(unit, availableUnits.time); | |
} | |
function isDistance(unit) { | |
return contains(unit, availableUnits.distance); | |
} | |
function parseUnit(unit){ | |
var items = unit.split(' '), | |
res = {}, | |
number = parseInt(items[0], 10), | |
dimension = items[1].split('/'); | |
if (items.length !== 2) throw 'Space is required in ' + unit; | |
if (number !== number) throw 'Wrong number format in ' + unit; | |
if (dimension.length === 2) { | |
var distance = dimension[0], | |
time = dimension[1] | |
if(isDistance(distance) && isTime(time)) { | |
res.distance = distance; | |
res.time = time; | |
} else throw 'Wrong dimension format in ' + items[1]; | |
} else if(isDistance(dimension[0])){ | |
res.distance = dimension[0]; | |
} else throw 'Wrong dimension format'; | |
res.number = number; | |
return res; | |
} | |
function spendTime( speed, distance ) { | |
if(!speed || ! distance) throw 'Strange uncatched error'; | |
return { | |
value : distance.number / speed.number * convertDistance(speed.distance, distance.distance), | |
distanceUnit : distance.distance, | |
timeUnit : speed.time | |
} | |
} | |
return { | |
getSpendTime : readUserInput, | |
addDistanceUnit : function(name, value) { | |
availableUnits.distance[name] = value; | |
} | |
} | |
})() | |
var calc = calculateSpendTime; | |
calc.addDistanceUnit('miles',1600) | |
for(var i = 0; i < userInput.length; i++ ) { | |
console.log('User input : ' + userInput[i]) | |
try{ | |
console.log('Result : ', calc.getSpendTime(userInput[i])); | |
}catch(e){ | |
console.log('Error : ' + e); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment