var _ = require('lodash'); var hostTeamsFactory = function(teams){ var i = 0; return function(){ var ret = teams[i]; i = i + 1; if(i == teams.length){ i = 0; teams = _.shuffle(teams); } return ret; }; }; var getGuestTeams = function(hostTeams, teams){ return _.difference(hostTeams, teams); }; var getLastTimeTwoTeamHasPlayedAgainst = function(history, team1, team2){ for(var i = 0; i < history.length; i++){ var nighGame = history[history.length - i - 1]; if(nighGame[team1] == team2 || nighGame[team2] == team1){ return i; } } return -Infinity; }; var initiateScheduleWithHostTeams = function(teams, numberOfNights, numberOfGamePerNight){ var hostTeams = hostTeamsFactory(teams); return _.map(_.range(numberOfNights), function(){ var ret = {}; _.each(_.range(numberOfGamePerNight), function(){ ret[hostTeams()] = undefined; }); return ret; }); }; var getBestGuestTeam = function(hostTeam, previousSchedule, possibleGuests){ // TODO: FIX ME. var presiouslyPlayed = _.map(possibleGuests, function(guestTeam){ return getLastTimeTwoTeamHasPlayedAgainst(previousSchedule, hostTeam, guestTeam); }); var m = _.fromPairs(_.zip(presiouslyPlayed, possibleGuests)); console.log(hostTeam); console.log(m); console.log(m[_.min(presiouslyPlayed)]); console.log('\n\n\n\n'); return m[_.min(presiouslyPlayed)]; }; var addGuestTeamToNight = function(night, previousSchedule, teams){ var hostTeams = _.keys(night); var nightHistory = 12; _.each(hostTeams, function(hostTeam){ var alreadyChoosenTeam = _.compact(_.values(night)); var prohibitedGuests = _.concat(hostTeams, alreadyChoosenTeam); var possibleGuests = _.difference(teams, prohibitedGuests); night[hostTeam] = getBestGuestTeam(hostTeam, previousSchedule, possibleGuests); }); return night; }; var addGuestTeams = function(schedule, teams){ return _.map(schedule, function(night, idx){ return addGuestTeamToNight(night, schedule.slice(0, idx), teams); }); }; function createSchedule(teams, numberOfNights, numberOfGamePerNight){ var schedule = initiateScheduleWithHostTeams(teams, numberOfNights, numberOfGamePerNight); return addGuestTeams(schedule, teams); } function main(){ var teams = ['jaune', 'vert', 'bleu', 'rouge', 'gris', 'orange']; var numberOfNights = 10; var numberOfGamePerNight = 3; var schedule = createSchedule(teams, numberOfNights, numberOfGamePerNight); _.each(schedule, function(night){ console.log(night, ','); }); } main();