-
-
Save 1st/5278729 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# | |
# Test that I passed on codility.com for TopTal company | |
# | |
# Task #1 | |
def binary_gap(N): | |
''' | |
A binary gap within a positive integer N is any maximal | |
sequence of consecutive zeros that is surrounded by ones | |
at both ends in the binary representation of N. | |
Args: | |
- N: integer within the range [1..2,147,483,647] | |
''' | |
bin_representation = bin(N)[2:] | |
max_gap = 0 | |
gap_counter = 0 | |
gap_started = False | |
for symbol in bin_representation: | |
if symbol == '1': | |
if gap_counter > max_gap: | |
max_gap = gap_counter | |
gap_counter = 0 | |
gap_started = True | |
elif gap_started: | |
gap_counter += 1 | |
return max_gap | |
print binary_gap(1041) | |
# Task #2 | |
def count_div(A, B, K): | |
''' | |
Returns the number of integers within the range [A..B] that are divisible by K. | |
Used generators to save memory on large amounts of data. | |
Args: | |
- A: is an integer within the range [0..2,000,000,000] | |
- B: is an integer within the range [0..2,000,000,000] and A <= B | |
- K: is an integer within the range [1..2,000,000,000] | |
''' | |
divs_count = 0 | |
for x in xrange(A, B + 1): | |
if (x % K) == 0: | |
divs_count += 1 | |
return divs_count | |
print count_div(1, 200000000, 1000) | |
# Task #3 | |
def triangle(A): | |
''' | |
Calculate triangel of integers, where sentense of numbers P, Q, R | |
correspond to next rules: | |
- P + Q > R | |
- Q + R > P | |
- R + P > Q | |
Args: | |
- A: list of integers, where we will search triangle | |
Return: 1 - if triangle exists, and 0 - otherwise | |
''' | |
A = tuple(enumerate(A)) | |
for p, P in A: | |
for q, Q in A[p + 1:]: | |
for r, R in A[q + 1:]: | |
if (P + Q > R) and (Q + R > P) and (R + P > Q): | |
return 1 | |
return 0 | |
print triangle([10, 2, 5, 1, 8, 20]) |
Your answers are pretty obvius and not so opimitized did you passed the test?
Here is another solution for 3rd task
def triangle(A):
pools=tuple(A)*3
n=len(pools)
result=[[]]
for pool in pools:
result=[x+[y] for x in result for y in pool]
for prod in result:
if len(set(prod))==3:
R=prod[0]
P=prod[1]
Q=prod[2]
if P+Q>R and Q+R>P and R+P>Q:
return 1
return 0
print triangle([[10, 2, 5, 1, 8, 20]])
Another java solution for the second task with O(K) computational time complexity:
public static int count_div(int A, int B, int K){
int i;
for (i=A;(i<B);i++ ) // Find the first divisor greater than A
if ((i%K)==0) break;
int t=0;
if (i<B) t=(int)Math.ceil((double)(B-i)/(double)K);
if ((B%K)==0) t++;
return t;
}
These are all problems from the Lessons available at codility. No way you passed their evaluation with the complexity of these solutions.
These are some of the easiest problems on Codility Lessons, available on their website. I don't believe the Toptal screening test questions are that simple.
How can you import a library during codility test? For example, I need to use np.int32( ). When I import numpy as np, the program doesn't compile.
Here is one-liner for the problem 1:
import re
def gap(number):
return len(max(re.findall(r'0+',bin(number)[2:]),default=[]))
Did you intend to use 'yield' for generator in your solution for Task 2?
Alternative solution for Task 3:
def isTriangle (arr):
# If the number of elements
# is less than 3, then
# a triangle isn’t possible
N = len(arr)
if N< 3:
return False
# first sort the array
arr.sort()
# then loop for all three
# consecutive triplets
for i in range(N - 2):
# Check if the triplet satisfies the triangle
# condition
if arr[i] + arr[i + 1] > arr[i + 2]:
return True
Driver Code
arr = [5, 4, 3, 1, 2]
print("This satisfies the triangle inequality theorem" if isTriangle(arr) else " This does not satisfy the triangle inequality theorem ")
Alternate solution for Task #2
def count_div(A, B, K):
# find smallest_divisible between (A or K) to B
try:
smallest_divisible = next(
a for a in xrange(A if A == 0 or A >= K else K, B+1)
if a%K==0
)
except:
# no number within range is divisible
return 0
return (B-smallest_divisible)/K + 1
Alternate solution to Task #1
import re
def gap(number):
binary_number = bin(number)[2:]
zeros = re.findall(r'0+', binary_number)
if binary_number[0] != '1':
zeros = zeros[1:]
if binary_number[-1] != '1':
zeros = zeros[:-1:]
if not zeros:
return 0
return len(max(zeros))
Solution for task 2: O(1)
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(A, B, K) {
// write your code in JavaScript (Node.js 8.9.4)
return Math.floor(B / K) - Math.floor((A - 1) / K)
}
For number one Ruby two liner that took me far longer than it should have because I'm weak with regex:
def solution(n)
split = n.to_s(2).scan(/(?=(10+1))/)
split.any? ? split.flatten.sort.first.length - 2 : 0
end
Here is one-liner for the problem 1:
import re def gap(number): return len(max(re.findall(r'0+',bin(number)[2:]),default=[]))
Doesn't this incorrectly return 5 for '11100000'?
len(max(re.findall(r'0+', '11100000'),default=[]))
5
Doesn't this incorrectly return 5 for '11100000'?
@haveaguess, you are correct, the oneliner with re for problem 1 does not work for edge cases
. You need the checking for the one
's as in the post written by Odame.
binary gap
import re
def solution(n):
bin_n = bin(n)[2:]
gap = re.findall(r'(?=(10+1))', bin_n)
return 0 if len(gap) == 0 else len(max(gap,key=len))-2
Are you sure this was the toptal test and not you just practising the lessons. Mine was much more harder than this with optimal solutions involving dynamic programming.
for task 3 another java imp
class Solution {
public int solution(int[] A) {
Arrays.sort(A);
for (int i = 0; i < A.length-2; i++) {
long i1 = A[i];
long i2 = A[i+1];
long i3 = A[i+2];
if((i1+i2>i3 && i2+i3>i1 && i3+i1>i2))
return 1;
}
return 0;
}
}
These are the training question company asked the same questions which are provided in the traininng course of the codility website
my code for big binary gap
def DecimalToBinary(num):
S = bin(num).replace("0b", "")
res = [int(x) for x in str(S)]
print(res)
if res.count(1) < 2 or res.count(0) < 1:
print("its has no binary gap")
else:
positionof1 = [i for i,x in enumerate(res) if x==1]
print(positionof1)
differnce = [abs(j-i) for i,j in zip(positionof1, positionof1[1:])]
differnce[:] = [differnce - 1 for differnce in differnce]
differnce.sort()
print(differnce[-1])
[email protected] send me an email and I will send you solution for any task