Skip to content

Instantly share code, notes, and snippets.

@jnsprnw
Created November 29, 2016 17:19
Show Gist options
  • Save jnsprnw/5d3d50c6fb62448a3da7eff29b03c61b to your computer and use it in GitHub Desktop.
Save jnsprnw/5d3d50c6fb62448a3da7eff29b03c61b to your computer and use it in GitHub Desktop.
Insert a line break at the best postition
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