Skip to content

Instantly share code, notes, and snippets.

@greyd
Created May 27, 2012 17:42
Show Gist options
  • Save greyd/2815223 to your computer and use it in GitHub Desktop.
Save greyd/2815223 to your computer and use it in GitHub Desktop.
ДЗ5 таск 2
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