Given two arrays
a
andb
write a functioncomp(a, b)
(compSame(a, b)
in Clojure) that checks whether the two arrays have the “same” elements, with the same multiplicities. “Same” means, here, that the elements inb
are the elements ina
squared, regardless of the order.
Examples
Valid arrays
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
comp(a, b)
returns true because inb
121 is the square of 11, 14641 is the square of 121, 20736 the square of 144, 361 the square of 19, 25921 the square of 161, and so on. It gets obvious if we writeb's
elements in terms of squares:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19]
Invalid arrays
If we change the first number to something else,
comp
may not return true anymore:
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [132, 14641, 20736, 361, 25921, 361, 20736, 361]
comp(a,b)
returns false because inb
132 is not the square of any number ofa
.
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 36100, 25921, 361, 20736, 361]
comp(a,b)
returns false because inb
36100 is not the square of any number ofa
.
Remarks
a
orb
might be[]
(all languages except R, Shell).a
orb
might benil
ornull
orNone
ornothing
(except in Haskell, Elixir, C++, Rust, R, Shell, PureScript).
If
a
orb
areni
l (ornull
orNone
), the problem doesn’t make sense so return false.
If
a
orb
are empty then the result is self-evident.
a or b are empty or not empty lists.
Solution :
def comp(array1, array2):
a1 = array1
a2 = array2
a3 = []
if a1 == [] and a2 == []:
return True
elif a1 == [] and a2 != []:
return False
elif a1 != [] and a2 == []:
return False
else:
for num in a1:
a3.append(num ** 2)
a3.sort()
a2.sort()
for i in range(len(a3)):
if a3[i] != a2[i]:
return False
return True