Created
November 29, 2016 17:19
-
-
Save jnsprnw/5d3d50c6fb62448a3da7eff29b03c61b to your computer and use it in GitHub Desktop.
Insert a line break at the best postition
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 calcStandardDeviation(values){ | |
var avg = calcAverage(values); | |
var squareDiffs = values.map(function(value){ | |
var diff = value - avg; | |
var sqrDiff = diff * diff; | |
return sqrDiff; | |
}); | |
var avgSquareDiff = calcAverage(squareDiffs); | |
var stdDev = Math.sqrt(avgSquareDiff); | |
return stdDev; | |
} | |
function calcAverage(data){ | |
var sum = data.reduce(function(sum, value){ | |
return sum + value; | |
}, 0); | |
var avg = sum / data.length; | |
return avg; | |
} | |
function countChunksLength(arr) { | |
return arr.reduce(function(sum, n) { | |
return sum + n.length; | |
}, 0); | |
} | |
function countDifference(arr) { | |
return calcStandardDeviation(arr); | |
} | |
function countPartsLength(parts, n) { | |
const chunks = divideArray(parts, n); | |
const sizes = _.map(chunks, chunk => { | |
return countChunksLength(chunk); | |
}); | |
return sizes; | |
} | |
function divideArray(arr, n) { | |
const leftSide = _.clone(arr).splice(0, n); | |
const rightSide = _.clone(arr).splice(n, arr.length - n); | |
return [leftSide, rightSide]; | |
}; | |
function checkBreakPoint(parts, position) { | |
const sizes = countPartsLength(parts, position); | |
const difference = countDifference(sizes); | |
return { | |
[position]: difference, | |
}; | |
} | |
function countPossibleBreakPoints(parts) { | |
const nParts = parts.length; | |
return nParts - 1; | |
} | |
function getBestBreakPoints(arr) { | |
return parseInt(_.keys(_.first(_.sortBy(arr, v => { | |
return _.values(v)[0]; | |
})))[0]); | |
} | |
function insertLineBreak(parts, breakPoint) { | |
return _.map(divideArray(parts, breakPoint), part => { | |
return part.join(' '); | |
}).join('\n'); | |
} | |
function insertLineBreaks(str) { | |
const parts = str.split(' '); | |
const nPossibleBreaks = countPossibleBreakPoints(parts); | |
const possibilities = _.times(nPossibleBreaks, n => { | |
const position = n + 1; | |
return checkBreakPoint(parts, position); | |
}) | |
const bestBreakPoint = getBestBreakPoints(possibilities); | |
return insertLineBreak(parts, bestBreakPoint) | |
} | |
console.log(insertLineBreaks('Yo Yo Ma')); | |
console.log(insertLineBreaks('Tim Berners-Lee')); | |
console.log(insertLineBreaks('Mario Vargas Llosa')); | |
console.log(insertLineBreaks('Edward O. Wilson')); | |
console.log(insertLineBreaks('Adolfo Perez Esquivel')); | |
console.log(insertLineBreaks('Marian Wright Edelman')); | |
console.log(insertLineBreaks('Hans Magnus Enzensberger')); | |
console.log(insertLineBreaks('King Jigme Singye Wangchuck')); | |
console.log(insertLineBreaks('Enrique Valentin Iglesias')); | |
console.log(insertLineBreaks('Jesús Silva Herzog Márquez')); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment