Skip to content

Commit

Permalink
Turning climb grades into something better.
Browse files Browse the repository at this point in the history
  • Loading branch information
ripsawridge committed Dec 7, 2014
1 parent c6e078d commit b805f9e
Showing 1 changed file with 101 additions and 48 deletions.
149 changes: 101 additions & 48 deletions climbgrades/module.js
Original file line number Diff line number Diff line change
@@ -1,68 +1,121 @@

var ClimbGrades = (function() {

// index UIAA YDS French
var chart = [
[0, "3", "5.2", "1"],
[1, "3/3+", "5.2", "1"],
[2, "3+", "5.3", "2"],
[3, "3+/4-", "5.3", "2"],
[4, "4-", "5.4", "3"],
[5, "4-/4", "5.4", "3"],
[6, "4", "5.4", "3"],
[7, "4/4+", "5.5", "4a"],
[8, "4+", "5.5", "4a"],
[9, "4+/5-", "5.5", "4a"],
[10, "5-", "5.6", "4b"],
[11, "5-/5", "5.6", "4b"],
[12, "5", "5.6", "4b"],
[13, "5/5+", "5.7", "4c"],
[14, "5+", "5.7", "4c"],
[15, "5+/6-", "5.8", "5a"],
[16, "6-", "5.8", "5a"],
[17, "6-/6", "5.9", "5b"],
[18, "6", "5.9", "5b"],
[19, "6/6+", "5.10a", "5c"],
[20, "6+", "5.10a", "5c"],
[21, "6+/7-", "5.10b", "6a"],
[22, "7-", "5.10c", "6a+"],
[23, "7-/7", "5.10c", "6a+"],
[24, "7", "5.10d", "6b"],
[25, "7/7+", "5.10d", "6b"],
[26, "7+", "5.11a", "6b+"],
[27, "7+/8-", "5.11b", "6c"],
[28, "8-", "5.11c", "6c+"],
[29, "8-/8", "5.11c", "6c+"],
[30, "8", "5.11d", "7a"],
[31, "8/8+", "5.12a", "7a+"],
[32, "8+", "5.12a", "7a+"],
[33, "8+/9-", "5.12b", "7b"],
[34, "9-", "5.12c", "7b+"],
[35, "9-/9", "5.12c", "7b+"],
[36, "9", "5.12d", "7c"],
[37, "9/9+", "5.13a", "7c+"],
[38, "9+", "5.13a", "7c+"],
[39, "9+/10-", "5.13b", "8a"],
[40, "10-", "5.13c", "8a+"],
[41, "10-/10", "5.13c", "8a+"],
[42, "10", "5.13d", "8b"],
[43, "10/10+", "5.14a", "8b+"]
];


var GRADE = {
UIAA: { value: 1, name: "UIAA" },
YDS: { value: 2, name: "YDS" },
FRENCH: { value: 3, name: "French" }
};


// Use like FromIndex(3, GRADE.UIAA);
// returns string "3+/4-"
function FromIndex(index, grade) {
if (isNaN(parseInt(index)) || index < 0 || index >= chart.length) {
throw new TypeError("Invalid index parameter.");
}

var uiaa_pattern = /^([3-9])([\+\-])?(?:(?:(\/)[3-9](?:[\+\-])?)?)?$/;
if (!grade.hasOwnProperty("name") ||
!grade.hasOwnProperty("value")) {
throw new TypeError("invalid grade parameter.");
}

// Grades
// 3+
// 5+/6-
function GetSportGradeFromUIAA(rating) {
return 3.0 * rating - 7.0;
}
if (isNaN(parseInt(grade.value)) || grade.value < 1 || grade.value > 3) {
throw new TypeError("grade.value is invalid.");
}

return chart[index][grade.value];
}

function GetUIAAFromSportGrade(grade) {
return (grade + 7.0) / 3.0;
}

function ToIndex(string_value, grade) {
if (!grade.hasOwnProperty("value")) {
throw new TypeError("invalid grade parameter.");
}

function ParseSportGradeFromUIAA(uiaa) {
m = uiaa_pattern.exec(uiaa);
sport_grade = -1;
if (m !== null) {
grade = m[1];
sport_grade = GetSportGradeFromUIAA(grade);
if (m[2] != undefined) {
if (m[2] === '+') {
sport_grade = sport_grade + 1;
} else {
sport_grade = sport_grade - 1;
}
if (isNaN(parseInt(grade.value)) || grade.value < 1 || grade.value > 3) {
throw new TypeError("grade.value is invalid.");
}

if (m[3] != undefined) {
sport_grade = sport_grade + 0.5;
var column = grade.value;
for (var i = 0; i < chart.length; i++) {
if (chart[i][column] === string_value) {
return i;
}
}
return -1;
}

return sport_grade;
var module = {
GRADE: GRADE,
FromIndex: FromIndex,
ToIndex: ToIndex
};

return module;
}());

function ParseSportGradeFromUIAA(uiaa) {
var trimmed_uiaa = uiaa.trim();
var index = ClimbGrades.ToIndex(trimmed_uiaa, ClimbGrades.GRADE.UIAA);
return index;
}


function UIAAFromSportGrade(grade) {
rating = GetUIAAFromSportGrade(Math.round(grade));
rating_decimal = Math.floor(Math.round(rating,1));
slash_symbol = "";
if (((rating_decimal + 1) - rating) <= 0.5) {
slash_symbol = "/";
}
follow_symbol = "";
delta_from_previous = GetSportGradeFromUIAA(rating_decimal - 1);
if (delta_from_previous === 2) {
follow_symbol = "-";
} else if (delta_from_previous === 4) {
follow_symbol = "+";
}
// recurse if needed
follow_on = "";
if (slash_symbol === "/") {
follow_on = UIAAFromSportGrade(Math.ceil(Math.round(grade)) + 1);
}

str_rating = rating_decimal.toString() + follow_symbol + slash_symbol + follow_on;
return str_rating;
var uiaa_string = ClimbGrades.FromIndex(grade, ClimbGrades.GRADE.UIAA);
return uiaa_string;
}


function print(str) {
console.log(str);
}
Expand Down Expand Up @@ -90,7 +143,7 @@ function Main() {
}
}

average = accum / climb_count;
average = Math.round(accum / climb_count);
str_average_rating = UIAAFromSportGrade(average);
print("UIAA average rating -> " + str_average_rating);
print("Average sport grade -> " + average);
Expand Down

0 comments on commit b805f9e

Please sign in to comment.