DEV Community

dev.to staff
dev.to staff

Posted on

Daily Challenge #265 - Equal Sides

You are going to be given an array of integers. Your job is to take that array and find an index N where the sum of the integers to the left of N is equal to the sum of the integers to the right of N. If there is no index that would make this happen, return -1.

For example:

Let's say you are given the array {1,2,3,4,3,2,1}: Your function will return the index 3, because at the 3rd position of the array, the sum of left side of the index ({1,2,3}) and the sum of the right side of the index ({3,2,1}) both equal 6.

Let's look at another one.
You are given the array {1,100,50,-51,1,1}: Your function will return the index 1, because at the 1st position of the array, the sum of left side of the index ({1}) and the sum of the right side of the index ({50,-51,1,1}) both equal 1.

Input:
An integer array of length 0 < arr < 1000. The numbers in the array can be any integer positive or negative.

Output:
The lowest index N where the side to the left of N is equal to the side to the right of N. If you do not find an index that fits these rules, then you will return -1.

Note:
If you are given an array with multiple answers, return the lowest correct index.

Tests

{1,2,3,4,3,2,1}
{1,100,50,-51,1,1}
{20,10,30,10,10,15,35}
{-8505, -5130, 1926, -9026}

Good luck!


This challenge comes from Shivo on CodeWars. Thank you to CodeWars, who has licensed redistribution of this challenge under the 2-Clause BSD License!

Want to propose a challenge idea for a future post? Email yo+challenge@dev.to with your suggestions!

Top comments (9)

Collapse
 
savagepixie profile image
SavagePixie • Edited

JavaScript

const sum = (a, b) => a + b

const doStuff = xs => xs.findIndex(
  (x, i, arr) => arr.slice(0, i).reduce(sum) === arr.slice(i + 1).reduce(sum)
)
Collapse
 
devtony101 profile image
Miguel Manjarres

Python

from functools import reduce

def findIndex(arr):
    sum = lambda a, b : a + b
    for i in range(len(arr)):
        leftSum = reduce(sum, arr[0:i+1])
        rightSum = reduce(sum, arr[i:len(arr)])
        if leftSum == rightSum:
            return i
    return -1

print(findIndex([1,2,3,4,3,2,1])) # 3
print(findIndex([1,100,50,-51,1,1])) # 1
print(findIndex([20,10,30,10,10,15,3])) # -1
print(findIndex([-8505, -5130, 1926, -9026])) # -1
Collapse
 
choroba profile image
E. Choroba

Perl

#!/usr/bin/perl
use strict;
use warnings;
use experimental qw{ signatures };
use List::Util qw{ sum };

sub equal_sides ($arr) {
    my ($left, $current, $right) = (0, 0, sum(@$arr[1 .. $#$arr]));
    until ($current > $#$arr || $left == $right) {
        $left += $arr->[$current];
        $right -= $arr->[++$current] // 0;
    }
    return $current > $#$arr ? -1 : $current
}

use Test::More tests => 4;

my @tests = ([1, 2, 3, 4, 3, 2, 1],        3,
             [1, 100, 50, -51, 1, 1],      1,
             [20, 10, 30, 10, 10, 15, 35], 3,
             [-8505, -5130, 1926, -9026], -1);

while (my ($arr, $result) = splice @tests, 0, 2) {
    is equal_sides($arr), $result;
}
Collapse
 
moufeed_m profile image
Mofid Jobakji

javascript

 const  fn = (arr) => {
  let sum = 0;
  const total = arr.reduce((a,b)=> a+b , 0);
  return arr.findIndex((x, i, arr) => (total - (sum += x)) * 2 + x === total) ;
}

console.log(fn([1, 2, 3, 4, 3, 2, 1])); // 3
console.log(fn([1, 100, 50, -51, 1, 1])); // 1
console.log(fn([20, 10, 30, 10, 10, 15, 35])); // 3
console.log(fn([-8505, -5130, 1926, -9026]));// -1
console.log(fn([11,4,30,5,10,20,15]));// 3
Collapse
 
heykieran profile image
heykieran

Clojure

(defn equal-sides
  [candidate-array]
  (loop
   [c candidate-array idx 1 lt 0 rt 0]
    (cond
      (empty? c) -1
      (and (= lt rt) (= 1 (count c))) idx
      :else
      (let
       [inc-l (> (+ rt (last c)) (+ lt (first c)))]
        (recur
         (if inc-l (rest c) (butlast c))
         (if inc-l (inc idx) idx)
         (+ lt (if inc-l (first c) 0))
         (+ rt (if-not inc-l (last c) 0)))))))
Collapse
 
aminnairi profile image
Amin

Haskell

halve :: [a] -> ([a], [a])
halve list =
    (take half list, drop (half + rest) list)

    where
        size = length list
        half = div size 2
        rest = mod size 2


isEqualSides :: [Int] -> Int
isEqualSides []        = -1
isEqualSides integers  =
    if (sum firstHalf) == (sum secondHalf) then 
        length firstHalf

    else
        isEqualSides (init firstHalf ++ tail secondHalf)

    where
        (firstHalf, secondHalf) = halve integers
Collapse
 
dimitrilahaye profile image
Dimitri Lahaye

My humble solution:

function findN(array) {
  reducer = (s, o) => s + o;
  return array.findIndex((a, i, arr) => arr.slice(0, i).reduce(reducer, 0) === arr.slice(i + 1 - array.length).reduce(reducer, 0));
}
Collapse
 
dry profile image
Hayden Mankin

Javascript

const equalSides = (arr) => {
  let right = arr.reduce((a, b) => a + b);
  let left = 0;
  return arr.findIndex(i => {
    right -= i;
    if (left == right) {
      return true;
    }
    left += i;
    return false;
  });
};

console.log(equalSides([1, 2, 3, 4, 3, 2, 1])); // 3
console.log(equalSides([1, 100 , 50, -51 , 1 , 1])); // 1
console.log(equalSides([20, 10, 30, 10, 10, 15, 35])); // 3
console.log(equalSides([-8505, -5130, 1926, -9026])); // -1
Collapse
 
bracikaa profile image
Mehmed Duhovic