If you missed the introductory post, it's here. For a list of previously solved katas, please refer to the bottom of this page.
If this is your first time seeing my post, please note - these katas are probably randomly assigned per user so please don't go into Codewars thinking we will have exactly the same user experience, I am just posting these in the order that I got them.
Kata #19
DESCRIPTION:
You might know some pretty large perfect squares. But what about the NEXT one?
Complete the findNextSquare method that finds the next integral perfect square after the one passed as a parameter. Recall that an integral perfect square is an integer n such that sqrt(n) is also an integer.
If the parameter is itself not a perfect square then -1 should be returned. You may assume the parameter is non-negative.
Examples:(Input --> Output)
121 --> 144
625 --> 676
114 --> -1 since 114 is not a perfect square
Starting code:
function findNextSquare(sq) {
// Return the next square if sq is a perfect square, -1 otherwise
return -1;
}
My attempt that worked:
function findNextSquare(sq) {
let sqrtCheck = (sq**.5)
if (Number.isInteger(sqrtCheck) == true){
return ((sq**.5)+1)**2
}else{
return -1
}
}
Had to research and learned about the .isInteger() method. Wanted to shorten my solution to a one-liner so it turned into this:
const findNextSquare = sq => Number.isInteger(sq**.5) ? ((sq**.5)+1)**2 : -1
Moving on to best practices, we see rank #1 with the Math object combined with the .sqrt() method and using the modulus operator:
function findNextSquare(sq) {
return Math.sqrt(sq)%1? -1 : Math.pow(Math.sqrt(sq)+1,2);
}
Rank #2:
function findNextSquare(sq) {
var number = Math.sqrt(sq);
if(Math.round(number) === number) {
return Math.pow(++number, 2)
}
return -1;
}
Rank #3 is quite similar to rank #1 but with an additional variable declaration:
function findNextSquare(sq) {
var root = Math.sqrt(sq);
return root % 1 === 0 ? Math.pow(root + 1, 2) : -1;
}
Rank #4 is where my initial approach falls under by using the Number.isInteger() method:
function findNextSquare(sq) {
// Return the next square if sq if a perfect square, -1 otherwise
var root = Math.sqrt(sq);
if (Number.isInteger(root)) {
return Math.pow(root + 1, 2);
} else {
return -1;
}
}
Notable mention at rank #5 with 131 'Clever' votes at the time of writing:
function findNextSquare(sq) {
let r = Math.sqrt(sq)
return r % 1 ? -1 : ++r * r
}
That's it for Kata #19, stay tuned for more katas to be solved!
Link to Kata #1: Square(n) Sum
Link to Kata #2: Convert a Number to a String
Link to Kata #3: DNA to RNA Conversion
Link to Kata #4: Remove First and Last Character
Link to Kata #5: MakeUpperCase
Link to Kata #6: Total amount of points
Link to Kata #7: A Needle in the Haystack
Link to Kata #8: Sum of positive
Link to Kata #9: Basic Mathematical Operations
Link to Kata #10: Beginner - Reduce but Grow
Link to Kata #11: Square Every Digit
Link to Kata #12: Friend or Foe?
Link to Kata #13: Grasshopper - Summation
Link to Kata #14: Get the Middle Character
Link to Kata #15: Descending Order
Link to Kata #16: String ends with?