Finding the smartest set from an array of numbers
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
4
down vote
favorite
Is there any way to make this program run in better time ? While running, it is taking 1 second for the sample test case to pass and 5-10 seconds for the rest of the test cases.
Problem statement
A smart-set is a set of distinct numbers in which all the elements have the same number of
1
s in their binary form. The set of all smallest elements from each smart-set
that can be formed from a given array of distinct positive numbers is known as the smartest-set.
So given an array of distinct numbers, outline the elements of the smartest-set in ascending sorted order.
Example
Let the array be
6 , 2 , 11 , 1 , 9 , 14 , 13 , 4 , 18
.
In binary form the set is
110, 010, 1011, 0001, 1001, 1110, 1101, 0100, 10010
.
The smart-sets are
1, 2, 4, 6, 9, 18, 11, 13, 14
.
The smartest-set is
1,6,11
as each element is the smallest element from each smart-set.
Input Format
The first line of input consists of an integer t
. This is the number of test cases. For each test case,
the first line of input contains an integer n
. Here n
is the number of elements in the array. The next line contains n
space separated distinct integers which are the elements
of the array.
Output Format
The output will space separated integer elements of the smartest-set in ascending order.
Constraints
0 < t < 1000 (This is the number of test cases )
2 < n < 10000 (This is the number of integer elements of the array)
1 < Xi < 100000 (This is the size of each element of the array)
SAMPLE STDIN 1
3
9
6 2 11 1 9 14 13 4 18
3
7 3 1
3
1 2 4
SAMPLE STDOUT
1 6 11
1 3 7
1
Code
test_case=input()
for case_num in range(int(test_case)):
num_of_elements=input()
arr=input()
dictn=
#print (num_of_elements,arr)
for bin_values in list(map(int,arr.split())):
count=0
for occurence in [int(x) for x in list('0:0b'.format(bin_values))]:
if occurence==1:
count=count+1
dictn[bin_values]=count
v =
for key, value in sorted(dictn.items()):
v.setdefault(value, ).append(key)
lst=
for key,value in (v.items()):
x=min(value)
lst.append(str(x))
s= ' '
s = s.join(lst)
print (s)
python programming-challenge array
add a comment |Â
up vote
4
down vote
favorite
Is there any way to make this program run in better time ? While running, it is taking 1 second for the sample test case to pass and 5-10 seconds for the rest of the test cases.
Problem statement
A smart-set is a set of distinct numbers in which all the elements have the same number of
1
s in their binary form. The set of all smallest elements from each smart-set
that can be formed from a given array of distinct positive numbers is known as the smartest-set.
So given an array of distinct numbers, outline the elements of the smartest-set in ascending sorted order.
Example
Let the array be
6 , 2 , 11 , 1 , 9 , 14 , 13 , 4 , 18
.
In binary form the set is
110, 010, 1011, 0001, 1001, 1110, 1101, 0100, 10010
.
The smart-sets are
1, 2, 4, 6, 9, 18, 11, 13, 14
.
The smartest-set is
1,6,11
as each element is the smallest element from each smart-set.
Input Format
The first line of input consists of an integer t
. This is the number of test cases. For each test case,
the first line of input contains an integer n
. Here n
is the number of elements in the array. The next line contains n
space separated distinct integers which are the elements
of the array.
Output Format
The output will space separated integer elements of the smartest-set in ascending order.
Constraints
0 < t < 1000 (This is the number of test cases )
2 < n < 10000 (This is the number of integer elements of the array)
1 < Xi < 100000 (This is the size of each element of the array)
SAMPLE STDIN 1
3
9
6 2 11 1 9 14 13 4 18
3
7 3 1
3
1 2 4
SAMPLE STDOUT
1 6 11
1 3 7
1
Code
test_case=input()
for case_num in range(int(test_case)):
num_of_elements=input()
arr=input()
dictn=
#print (num_of_elements,arr)
for bin_values in list(map(int,arr.split())):
count=0
for occurence in [int(x) for x in list('0:0b'.format(bin_values))]:
if occurence==1:
count=count+1
dictn[bin_values]=count
v =
for key, value in sorted(dictn.items()):
v.setdefault(value, ).append(key)
lst=
for key,value in (v.items()):
x=min(value)
lst.append(str(x))
s= ' '
s = s.join(lst)
print (s)
python programming-challenge array
add a comment |Â
up vote
4
down vote
favorite
up vote
4
down vote
favorite
Is there any way to make this program run in better time ? While running, it is taking 1 second for the sample test case to pass and 5-10 seconds for the rest of the test cases.
Problem statement
A smart-set is a set of distinct numbers in which all the elements have the same number of
1
s in their binary form. The set of all smallest elements from each smart-set
that can be formed from a given array of distinct positive numbers is known as the smartest-set.
So given an array of distinct numbers, outline the elements of the smartest-set in ascending sorted order.
Example
Let the array be
6 , 2 , 11 , 1 , 9 , 14 , 13 , 4 , 18
.
In binary form the set is
110, 010, 1011, 0001, 1001, 1110, 1101, 0100, 10010
.
The smart-sets are
1, 2, 4, 6, 9, 18, 11, 13, 14
.
The smartest-set is
1,6,11
as each element is the smallest element from each smart-set.
Input Format
The first line of input consists of an integer t
. This is the number of test cases. For each test case,
the first line of input contains an integer n
. Here n
is the number of elements in the array. The next line contains n
space separated distinct integers which are the elements
of the array.
Output Format
The output will space separated integer elements of the smartest-set in ascending order.
Constraints
0 < t < 1000 (This is the number of test cases )
2 < n < 10000 (This is the number of integer elements of the array)
1 < Xi < 100000 (This is the size of each element of the array)
SAMPLE STDIN 1
3
9
6 2 11 1 9 14 13 4 18
3
7 3 1
3
1 2 4
SAMPLE STDOUT
1 6 11
1 3 7
1
Code
test_case=input()
for case_num in range(int(test_case)):
num_of_elements=input()
arr=input()
dictn=
#print (num_of_elements,arr)
for bin_values in list(map(int,arr.split())):
count=0
for occurence in [int(x) for x in list('0:0b'.format(bin_values))]:
if occurence==1:
count=count+1
dictn[bin_values]=count
v =
for key, value in sorted(dictn.items()):
v.setdefault(value, ).append(key)
lst=
for key,value in (v.items()):
x=min(value)
lst.append(str(x))
s= ' '
s = s.join(lst)
print (s)
python programming-challenge array
Is there any way to make this program run in better time ? While running, it is taking 1 second for the sample test case to pass and 5-10 seconds for the rest of the test cases.
Problem statement
A smart-set is a set of distinct numbers in which all the elements have the same number of
1
s in their binary form. The set of all smallest elements from each smart-set
that can be formed from a given array of distinct positive numbers is known as the smartest-set.
So given an array of distinct numbers, outline the elements of the smartest-set in ascending sorted order.
Example
Let the array be
6 , 2 , 11 , 1 , 9 , 14 , 13 , 4 , 18
.
In binary form the set is
110, 010, 1011, 0001, 1001, 1110, 1101, 0100, 10010
.
The smart-sets are
1, 2, 4, 6, 9, 18, 11, 13, 14
.
The smartest-set is
1,6,11
as each element is the smallest element from each smart-set.
Input Format
The first line of input consists of an integer t
. This is the number of test cases. For each test case,
the first line of input contains an integer n
. Here n
is the number of elements in the array. The next line contains n
space separated distinct integers which are the elements
of the array.
Output Format
The output will space separated integer elements of the smartest-set in ascending order.
Constraints
0 < t < 1000 (This is the number of test cases )
2 < n < 10000 (This is the number of integer elements of the array)
1 < Xi < 100000 (This is the size of each element of the array)
SAMPLE STDIN 1
3
9
6 2 11 1 9 14 13 4 18
3
7 3 1
3
1 2 4
SAMPLE STDOUT
1 6 11
1 3 7
1
Code
test_case=input()
for case_num in range(int(test_case)):
num_of_elements=input()
arr=input()
dictn=
#print (num_of_elements,arr)
for bin_values in list(map(int,arr.split())):
count=0
for occurence in [int(x) for x in list('0:0b'.format(bin_values))]:
if occurence==1:
count=count+1
dictn[bin_values]=count
v =
for key, value in sorted(dictn.items()):
v.setdefault(value, ).append(key)
lst=
for key,value in (v.items()):
x=min(value)
lst.append(str(x))
s= ' '
s = s.join(lst)
print (s)
python programming-challenge array
edited Jun 23 at 7:09
Jamalâ¦
30.1k11114225
30.1k11114225
asked Jun 23 at 5:14
codaholic
485
485
add a comment |Â
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
3
down vote
accepted
Review
- Don't
print()
butreturn
variables, so other functions can reuse the outcome. - Split up your code into functions, for re usability and to easier test parts of your code.
- Write test cases using the
unittest
module rather then doing it from the CLI every time There are some code improvements as well,
- You could benefit from the
collections.defaultdict
module - An easier way to count the
"1"
in the binaray format is:str(bin(ele)[2:]).count("1")
- You can benefit from list or dict comprehension, see PEP202
- You could benefit from the
Alternative
import unittest
from collections import defaultdict
def smartest_set(array):
smart_sets = defaultdict(list)
for element in array:
num_of_ones = str(bin(element)[2:]).count("1")
smart_sets[num_of_ones].append(element)
# If you'd really want the output be printed, you can add a print statement in the function
result = [min(e) for e in smart_sets.values()]
print(result)
return result
class Test(unittest.TestCase):
def test_smartest_set(self):
array = [6, 2, 11, 1, 9, 14, 13, 4, 18]
expected = [1, 6, 11]
self.assertEqual(expected, smartest_set(array))
# More tests here...
if __name__ == "__main__":
unittest.main()
Or a slightly faster approach storing the minimum value of the counts only
def smartest_set_2(array):
smarts =
for ele in array:
num_of_ones = str(bin(ele)[2:]).count("1")
smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
return smarts.values()
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
in the latest suggestion, you can prevent theif
by doingsmarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
 |Â
show 3 more comments
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
Review
- Don't
print()
butreturn
variables, so other functions can reuse the outcome. - Split up your code into functions, for re usability and to easier test parts of your code.
- Write test cases using the
unittest
module rather then doing it from the CLI every time There are some code improvements as well,
- You could benefit from the
collections.defaultdict
module - An easier way to count the
"1"
in the binaray format is:str(bin(ele)[2:]).count("1")
- You can benefit from list or dict comprehension, see PEP202
- You could benefit from the
Alternative
import unittest
from collections import defaultdict
def smartest_set(array):
smart_sets = defaultdict(list)
for element in array:
num_of_ones = str(bin(element)[2:]).count("1")
smart_sets[num_of_ones].append(element)
# If you'd really want the output be printed, you can add a print statement in the function
result = [min(e) for e in smart_sets.values()]
print(result)
return result
class Test(unittest.TestCase):
def test_smartest_set(self):
array = [6, 2, 11, 1, 9, 14, 13, 4, 18]
expected = [1, 6, 11]
self.assertEqual(expected, smartest_set(array))
# More tests here...
if __name__ == "__main__":
unittest.main()
Or a slightly faster approach storing the minimum value of the counts only
def smartest_set_2(array):
smarts =
for ele in array:
num_of_ones = str(bin(ele)[2:]).count("1")
smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
return smarts.values()
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
in the latest suggestion, you can prevent theif
by doingsmarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
 |Â
show 3 more comments
up vote
3
down vote
accepted
Review
- Don't
print()
butreturn
variables, so other functions can reuse the outcome. - Split up your code into functions, for re usability and to easier test parts of your code.
- Write test cases using the
unittest
module rather then doing it from the CLI every time There are some code improvements as well,
- You could benefit from the
collections.defaultdict
module - An easier way to count the
"1"
in the binaray format is:str(bin(ele)[2:]).count("1")
- You can benefit from list or dict comprehension, see PEP202
- You could benefit from the
Alternative
import unittest
from collections import defaultdict
def smartest_set(array):
smart_sets = defaultdict(list)
for element in array:
num_of_ones = str(bin(element)[2:]).count("1")
smart_sets[num_of_ones].append(element)
# If you'd really want the output be printed, you can add a print statement in the function
result = [min(e) for e in smart_sets.values()]
print(result)
return result
class Test(unittest.TestCase):
def test_smartest_set(self):
array = [6, 2, 11, 1, 9, 14, 13, 4, 18]
expected = [1, 6, 11]
self.assertEqual(expected, smartest_set(array))
# More tests here...
if __name__ == "__main__":
unittest.main()
Or a slightly faster approach storing the minimum value of the counts only
def smartest_set_2(array):
smarts =
for ele in array:
num_of_ones = str(bin(ele)[2:]).count("1")
smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
return smarts.values()
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
in the latest suggestion, you can prevent theif
by doingsmarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
 |Â
show 3 more comments
up vote
3
down vote
accepted
up vote
3
down vote
accepted
Review
- Don't
print()
butreturn
variables, so other functions can reuse the outcome. - Split up your code into functions, for re usability and to easier test parts of your code.
- Write test cases using the
unittest
module rather then doing it from the CLI every time There are some code improvements as well,
- You could benefit from the
collections.defaultdict
module - An easier way to count the
"1"
in the binaray format is:str(bin(ele)[2:]).count("1")
- You can benefit from list or dict comprehension, see PEP202
- You could benefit from the
Alternative
import unittest
from collections import defaultdict
def smartest_set(array):
smart_sets = defaultdict(list)
for element in array:
num_of_ones = str(bin(element)[2:]).count("1")
smart_sets[num_of_ones].append(element)
# If you'd really want the output be printed, you can add a print statement in the function
result = [min(e) for e in smart_sets.values()]
print(result)
return result
class Test(unittest.TestCase):
def test_smartest_set(self):
array = [6, 2, 11, 1, 9, 14, 13, 4, 18]
expected = [1, 6, 11]
self.assertEqual(expected, smartest_set(array))
# More tests here...
if __name__ == "__main__":
unittest.main()
Or a slightly faster approach storing the minimum value of the counts only
def smartest_set_2(array):
smarts =
for ele in array:
num_of_ones = str(bin(ele)[2:]).count("1")
smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
return smarts.values()
Review
- Don't
print()
butreturn
variables, so other functions can reuse the outcome. - Split up your code into functions, for re usability and to easier test parts of your code.
- Write test cases using the
unittest
module rather then doing it from the CLI every time There are some code improvements as well,
- You could benefit from the
collections.defaultdict
module - An easier way to count the
"1"
in the binaray format is:str(bin(ele)[2:]).count("1")
- You can benefit from list or dict comprehension, see PEP202
- You could benefit from the
Alternative
import unittest
from collections import defaultdict
def smartest_set(array):
smart_sets = defaultdict(list)
for element in array:
num_of_ones = str(bin(element)[2:]).count("1")
smart_sets[num_of_ones].append(element)
# If you'd really want the output be printed, you can add a print statement in the function
result = [min(e) for e in smart_sets.values()]
print(result)
return result
class Test(unittest.TestCase):
def test_smartest_set(self):
array = [6, 2, 11, 1, 9, 14, 13, 4, 18]
expected = [1, 6, 11]
self.assertEqual(expected, smartest_set(array))
# More tests here...
if __name__ == "__main__":
unittest.main()
Or a slightly faster approach storing the minimum value of the counts only
def smartest_set_2(array):
smarts =
for ele in array:
num_of_ones = str(bin(ele)[2:]).count("1")
smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
return smarts.values()
edited Jun 25 at 8:10
answered Jun 23 at 14:29
Ludisposed
5,68621656
5,68621656
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
in the latest suggestion, you can prevent theif
by doingsmarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
 |Â
show 3 more comments
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
in the latest suggestion, you can prevent theif
by doingsmarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
It gave me this error: E ====================================================================== ERROR: test_smartest_set (main.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "test1.py", line 17, in test_smartest_set self.assertEqual(expected == smartest_set(array)) TypeError: assertEqual() takes at least 3 arguments (2 given) ---------------------------------------------------------------------- Ran 1 test in 0.031s FAILED (errors=1)
â codaholic
Jun 23 at 15:20
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
@codaholic Edited, my bad works now :)
â Ludisposed
Jun 23 at 18:07
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I still don't have any idea where you are printing the output of the prgram
â codaholic
Jun 23 at 19:28
I currently don't, but you can call this function with any input and print it's results using,
print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
I currently don't, but you can call this function with any input and print it's results using,
print(smartest_set([array]))
â Ludisposed
Jun 23 at 19:40
1
1
in the latest suggestion, you can prevent the
if
by doing smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
in the latest suggestion, you can prevent the
if
by doing smarts[num_of_ones] = min(ele, smarts.get(num_of_ones, float('inf'))
â Maarten Fabré
Jun 25 at 8:08
 |Â
show 3 more comments
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f197102%2ffinding-the-smartest-set-from-an-array-of-numbers%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password