Odd One Out
The tricky part about this challenge is that we need to figure out which specific element is different from the others. But there can be only one element that is a different length, the rest need to be the same length as one another. In this case, using sort
doesn’t quite get us to a conscise solution.
Here, I made an array of the lengths of all the elements. Then I initiated an object called counts
to hold all the lengths and how many times they occur. Then, I used Object.entries
to make an array from the counts object, then compared the length of the array with all elements minus one to the array with element with only one occurence removed. If they were equal, this indicates that all elements are the same length except for one. and therefore true
.
Instructions
Write a function that returns true if exactly one word in the array differs in length from the rest. Return false in all other cases. Examples
oddOneOut([“silly”, “mom”, “let”, “the”]) ➞ true
oddOneOut([“swanky”, “rhino”, “moment”]) ➞ true
oddOneOut([“the”, “them”, “theme”]) ➞ false
oddOneOut([“very”, “to”, “an”, “some”]) ➞ false
Notes
The length of the array will always have at least three or more words.
My solution
function oddOneOut(arr) {
const counts = {}
arr.map(x=> x.length).map(e => counts[e] = counts[e] ? counts[e] + 1 : 1 )
return Object.entries(counts).filter(x=> x[1] !== 1).length === Object.entries(counts).length-1
}
oddOneOut(["silly", "mom", "let", "the"]) // true
oddOneOut(["swanky", "rhino", "moment"]) // true
oddOneOut(["the", "them", "theme"]) // false
oddOneOut(["very", "to", "an", "some"]) // false
Other solutions
function oddOneOut(arr) {
return arr
.map(word => word.length)
.filter((len,_,a) => a.indexOf(len) === a.lastIndexOf(len))
.length === 1
}
// cefalexin
function oddOneOut(arr) {
let arrLen = arr.map( e => e.length ? e.length : 0 );
let result = 0;
new Set(arrLen).forEach( s => {
if (arrLen.indexOf(s) === arrLen.lastIndexOf(s)) {
result++;
}
} )
return result === 1;
}
// Ân