Not a member of Pastebin yet?
                        Sign Up,
                        it unlocks many cool features!                    
                - const NUM_TRANS_PARTS = 10;
 - const REIGNS_SUPREME = new Set([
 - 'Optimus Prime',
 - 'Predaking',
 - ]);
 - const TEAMS = new Map([
 - ['D', 'Decepticons'],
 - ['A', 'Autobots'],
 - ]);
 - /////
 - let sampleInput = [
 - 'Soundwave, D, 8,9,2,6,7,5,6,10',
 - 'Bluestreak, A, 6,6,7,9,5,2,9,7',
 - 'Hubcap, A, 4,4,4,4,4,4,4,4',
 - ];
 - let withOptimus = [
 - 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
 - 'Soundwave, D, 8,9,2,6,7,5,6,10',
 - ]
 - let cataclysmBattle = [
 - 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
 - 'Predaking, D, 10, 5, 0, 8,7, 9, 9, 8',
 - 'Soundwave, D, 8,9,2,6,7,5,6,10',
 - 'Bluestreak, A, 6,6,7,9,5,2,9,7',
 - 'Hubcap, A, 4,4,4,4,4,4,4,4',
 - ];
 - let largeBattle = [
 - 'Optimus Prime, A, 10,10,8,10,10,10,8,10',
 - 'Predakung, D, 10, 5, 0, 8,7, 9, 9, 8',
 - 'Soundwave, D, 8,9,2,6,7,5,6,10',
 - 'Bluestreak, A, 6,6,7,9,5,2,9,7',
 - 'Hubcap, A, 4,4,4,4,4,4,4,4',
 - ]
 - /////
 - console.log(run(largeBattle));
 - console.log(run(sampleInput));
 - console.log(run(cataclysmBattle));
 - /**
 - * This function is the entry point
 - * @param {Array} battleInput array of strings describing the contestants
 - * @return {String} results
 - */
 - function run(battleInput) {
 - let transformers = sortTransformers(makeTransformers(battleInput));
 - let teams = makeTeams(transformers);
 - let matchups = createMatchups(teams);
 - let willHaveCataclysm = matchups.reduce(findCataclysm, false);
 - if(willHaveCataclysm) {
 - return `All transformers destroyed`;
 - }
 - let results = matchups.map(fight);
 - let destroyed = results.reduce(findDestroyed, []);
 - let alive = transformers.filter(stillAlive(destroyed));
 - let teamResults = getTeamResults(makeTeams(destroyed));
 - let aliveByTeam = makeTeams(alive);
 - return [
 - matchups.length == 1 ? '1 battle' : `${matchups.length} battles`,
 - teamResults ? `Winning team (${TEAMS.get(teamResults.winner)}): ${teams[teamResults.winner].map(getName).join(', ')}` : 'Battle draw',
 - teamResults
 - ? `Survivors from the losing team (${TEAMS.get(teamResults.loser)}): ${aliveByTeam[teamResults.loser].map(getName).join(', ')}`
 - : `Survivors: ${alive.map(getNameTeam).join(', ')}, Deaders: ${destroyed.map(getNameTeam).join(', ')}`,
 - ].join('\n')
 - }
 - //// HELPERS
 - function makeTransformers(input) {
 - return Array.isArray(input)
 - ? input.map(makeTransformer)
 - .filter(Boolean)
 - : [];
 - }
 - /**
 - * Creates a transformer object from an input string
 - * @param {String} input
 - * @return {Object}
 - */
 - function makeTransformer(input) {
 - let parts = input.split(',')
 - .filter(Boolean)
 - .map((part) => part.trim());
 - if(parts.length !== NUM_TRANS_PARTS) { return; }
 - let [name, team, ...stats] = parts,
 - [strength, intelligence, speed, endurance, rank, courage, firepower, skill] = stats.map(parseFloat);
 - return {
 - name, team, strength, intelligence, speed, endurance, rank, courage, firepower, skill,
 - rating: strength + intelligence + speed + endurance + firepower,
 - isSupreme: REIGNS_SUPREME.has(name),
 - };
 - }
 - function sortTransformers(transformers) {
 - return transformers.sort((transA, transB) => {
 - let {rankA} = transA,
 - {rankB} = transB;
 - return rankA - rankB;
 - })
 - }
 - function makeTeams(transformers) {
 - return transformers.reduce((teams, transformer) => {
 - teams[transformer.team].push(transformer);
 - return teams;
 - }, {A: [], D:[]})
 - }
 - function createMatchups({D, A}) {
 - let numDecep = D.length;
 - let numAuto = A.length;
 - let largestTeam = numAuto > numDecep ? A : D;
 - let smallestTeam = numAuto > numDecep ? D : A;
 - return largestTeam.reduce((fights, fighterA, index) => {
 - let fighterB = smallestTeam[index];
 - if(!fighterB) {
 - return fights;
 - };
 - return [...fights, [fighterA, fighterB]];
 - }, [])
 - }
 - /**
 - * The function that actually makes them compete
 - * @param {Object} [transformerA
 - * @param {Object} transformerB]
 - * @return {Object} results from the fight
 - */
 - function fight([transformerA, transformerB]) {
 - let transASupreme = transformerA.isSupreme,
 - transBSupreme = transformerB.isSupreme;
 - if(transASupreme) { return aWins(); }
 - if(transBSupreme) { return bWins(); }
 - let courageDiff = transformerA.courage - transformerB.courage;
 - let strengthDiff = transformerA.strength - transformerB.strength;
 - if((courageDiff > 3) && (strengthDiff > 2)) {
 - return aWins();
 - }
 - if((courageDiff < -3) && (strengthDiff < -2)) {
 - return bWins();
 - }
 - let skillDiff = transformerA.skill - transformerB.skill;
 - if((skillDiff > 2)) {
 - return aWins();
 - }
 - if((skillDiff < -2)) {
 - return bWins();
 - }
 - let ratingDiff = transformerA.rating - transformerB.rating;
 - if(ratingDiff != 0) {
 - return ratingDiff > 0
 - ? aWins()
 - : bWins();
 - }
 - return {destroyed: [transformerA, transformerB]};
 - function aWins() {
 - return {
 - alive: [transformerA],
 - destroyed: [transformerB]
 - };
 - }
 - function bWins() {
 - return {
 - alive: [transformerB],
 - destroyed: [transformerA]
 - }
 - }
 - }
 - function findDestroyed(memo, {destroyed}) {
 - return memo.concat(destroyed);
 - }
 - function stillAlive(destroyed) {
 - return (transformer) => {
 - return destroyed.indexOf(transformer) == -1;
 - }
 - }
 - /**
 - * Finds out if Optimus Primer or Predaking are about to fight in a battle
 - * @param {Boolean} hadCataclysm
 - * @param {Object} [transformerA
 - * @param {Object} transformerB]
 - * @return {Boolean}
 - */
 - function findCataclysm(hadCataclysm, [transformerA, transformerB]) {
 - let transASupreme = transformerA.isSupreme,
 - transBSupreme = transformerB.isSupreme;
 - return hadCataclysm || (transformerA && transBSupreme);
 - }
 - /**
 - * Determines which, if any, team won
 - * @param {Array} options.D array of destroyed decepticons
 - * @param {Array} options.A array of destroyed autobots
 - * @return {Object|undefined}
 - */
 - function getTeamResults({D, A}) {
 - if(D.length === A.length) { return; }
 - return D.length < A.length
 - ? {winner: 'D', loser: 'A'}
 - : {winner: 'A', loser: 'D'};
 - }
 - function getName({name}) {
 - return name;
 - }
 - function getNameTeam({name, team}) {
 - return `${name}(${team})`;
 - }
 
                    Add Comment                
                
                        Please, Sign In to add comment