Last active
August 29, 2015 14:18
-
-
Save shturm/993a1982b512d95f780e to your computer and use it in GitHub Desktop.
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
function problem4(input) { | |
var matches = [], | |
players = []; | |
// create matches from input | |
for (var i = input.length - 1; i >= 0; i--) { | |
var line = input[i]; | |
var match = { | |
playerA: getFirstPlayer(line), | |
playerB: getSecondPlayer(line), | |
score: getScore(line), | |
result: null, | |
}; | |
match.result = getMatchResult(match); | |
matches.push(match); | |
}; | |
// create players from matches | |
var playerNames = getPlayersNames(matches); | |
for (var i = playerNames.length - 1; i >= 0; i--) { | |
var playerName = playerNames[i]; | |
var player = { | |
name: playerName, | |
matchesWon: getPlayerMatchesWon(playerName, matches), | |
setsWon: getPlayerSetsWon(playerName, matches), | |
gamesWon: getPlayerGamesWon(playerName, matches) | |
}; | |
players.push(player); | |
}; | |
// sort players by matches, sets, games and name | |
players.sort(comparePlayers); | |
// console.log(players); | |
console.log(JSON.stringify(players)); | |
// for (var i = 0; i < players.length; i++) { | |
// console.log(JSON.stringify(players[i])); | |
// }; | |
}; | |
var comparePlayers = function (a, b) { | |
if (a.matchesWon > b.matchesWon) return -1; | |
if (a.matchesWon < b.matchesWon) return 1; | |
if (a.matchesWon == b.matchesWon) { | |
if (a.setsWon > b.setsWon) return -1; | |
if (a.setsWon < b.setsWon) return 1; | |
if (a.setsWon == b.setsWon) { | |
if (a.gamesWon > b.gamesWon) return -1; | |
if (a.gamesWon < b.gamesWon) return 1; | |
if (a.gamesWon == b.gamesWon) { | |
if (a.name < b.name) return -1; | |
if (a.name > b.name) return 1; | |
} | |
} | |
} | |
} | |
var getPlayersNames = function (matches) { | |
var players = []; | |
for (var i = matches.length - 1; i >= 0; i--) { | |
var match = matches[i]; | |
if (players.indexOf(match.playerA) === -1) { | |
players.push(match.playerA); | |
} | |
if (players.indexOf(match.playerB) === -1) { | |
players.push(match.playerB); | |
} | |
}; | |
return players; | |
} | |
var getFirstPlayer = function (line) { | |
var matched = line.match(/^\s*(\w+)\s*(\w+)/); | |
return matched[1] +' '+ matched[2]; | |
}; | |
var getSecondPlayer = function (line) { | |
var matched = line.match(/\.\s*(\w+)\s+(\w+)/); | |
return matched[1] +' '+ matched[2]; | |
} | |
var getScore = function (line) { | |
var matched = line.match(/\d+-\d+/g); | |
return matched; | |
} | |
var getMatchResult = function (match) { | |
var aSets = 0; | |
var bSets = 0; | |
for (var i = match.score.length - 1; i >= 0; i--) { | |
var set = match.score[i]; | |
var setResult = getSetResult(set); | |
if (setResult === -1) bSets++; | |
if (setResult === 1) aSets++; | |
}; | |
if (aSets > bSets) return 1; | |
if (aSets < bSets) return -1; | |
} | |
var getSetResult = function (set) { | |
var split = set.split('-'); | |
var a = parseInt(split[0]); | |
var b = parseInt(split[1]); | |
if (a < b) return -1; | |
if (a > b) return 1; | |
}; | |
var getPlayerMatchGamesWon = function (playerName, match) { | |
var setsWon = 0; | |
for (var i = match.score.length - 1; i >= 0; i--) { | |
var set = match.score[i]; | |
var setResult = getSetResult(set); | |
if (setResult === 1 && match.playerA === playerName) { | |
setsWon += parseInt(set.split('-')[0]); | |
} | |
if (setResult === -1 && match.playerB === playerName) { | |
setsWon += parseInt(set.split('-')[1]); | |
} | |
}; | |
return setsWon; | |
} | |
var getPlayerMatchesWon = function (playerName, matches) { | |
var matchesWon = 0; | |
for (var i = matches.length - 1; i >= 0; i--) { | |
var match = matches[i]; | |
if (match.playerA === playerName && match.result === 1) { | |
matchesWon++ | |
}; | |
if (match.playerB === playerName && match.result === -1) { | |
matchesWon++ | |
}; | |
}; | |
return matchesWon; | |
} | |
var getPlayerMatchSetsWon = function (playerName, match) { | |
var matchSetsWon = 0; | |
for (var i = match.score.length - 1; i >= 0; i--) { | |
var set = match.score[i]; | |
var setResult = getSetResult(set); | |
if (setResult == 1 && playerName == match.playerA) { | |
matchSetsWon++; | |
}; | |
if (setResult == -1 && playerName == match.playerB) { | |
matchSetsWon++; | |
}; | |
}; | |
return matchSetsWon; | |
} | |
var getPlayerSetsWon = function (playerName, matches) { | |
var setsWon = 0; | |
for (var i = matches.length - 1; i >= 0; i--) { | |
var match = matches[i]; | |
var matchSetsWon = getPlayerMatchSetsWon(playerName, match); | |
setsWon += matchSetsWon; | |
}; | |
return setsWon; | |
} | |
var getPlayerGamesWon = function (playerName, matches) { | |
var gamesWon = 0; | |
for (var i = matches.length - 1; i >= 0; i--) { | |
var match = matches[i]; | |
var matchGamesWon = getPlayerMatchGamesWon(playerName, match); | |
gamesWon += matchGamesWon; | |
}; | |
return gamesWon; | |
} | |
var input = [ | |
'Novak Djokovic vs. Roger Federer : 6-3 6-3', | |
'Roger Federer vs. Novak Djokovic : 6-2 6-3', | |
'Rafael Nadal vs. Andy Murray : 4-6 6-2 5-7', | |
'Andy Murray vs. David Ferrer : 6-4 7-6', | |
'Tomas Bedrych vs. Kei Nishikori : 4-6 6-4 6-3 4-6 5-7', | |
'Grigor Dimitrov vs. Milos Raonic : 6-3 4-6 7-6 6-2', | |
'Pete Sampras vs. Andre Agassi : 2-1', | |
'Boris Beckervs.Andre Agassi:2-1' | |
]; | |
problem4(input); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment