How get all the possible combinations of 4 digit numbers whose individual digit sum is 13 and last digit is 5 in that number?
I am trying it in python as:
nmz = []
for i in range(1000,10000):
if ((sum(int(j) for j in str(i))==13) & (i % 10)):
nmz = nmz.append(i)
return(nmz)
else:
continue
I am getting errors and not able to get expected output:
nmz = [1165, 1345, 1435, 1615, 1705, 2245, 2425, 3055 ..... ]
errors are:
- no output as expected
- SyntaxError: 'return' outside function
CodePudding user response:
There's no point in starting the range at 1000 because it doesn't fulfil the significant criterion that the number should end with 5. So, start at 1005 and increment by 10. Therefore:
mylist = []
for i in range(1_005, 10_000, 10):
if sum(int(d) for d in str(i)) == 13:
mylist.append(i)
print(mylist)
Output:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
CodePudding user response:
Faster alternative using itertools.product which doesn't require the int -> str conversion:
from itertools import product
[sum(a*10**b for a,b in zip(reversed(i), range(len(i)))) # decimal integer from individual integers
for i in product(range(1,10), range(10), range(10), [5]) # all combinations
if sum(i)==13] # condition to keep
output:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
Version for any number of digits:
from itertools import product
DIGITS = 4
[sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
for i in product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
if sum(i)==13]
This answer and particularly the suggestion in the comments by @keyllbundy are much faster than other currently posted answers and these techniques of leveraging itertools should be understood by all python users. If you want to see how much faster they are, you can use the timeit module like:
import timeit
setup = """
import itertools
def olvin_roght():
mylist = []
for i in range(1_005, 10_000, 10):
if sum(int(d) for d in str(i)) == 13:
mylist.append(i)
return mylist
def jonsg():
return [10*i 5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]
def mozway():
DIGITS = 4
return [
sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
for i in itertools.product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
if sum(i)==13
]
def kelly_bundy():
return [(1 a) * 1000 (b-a) * 100 (7-b) * 10 5
for a, b in itertools.combinations_with_replacement(range(8), 2)]
"""
print(f"olvin_roght: {timeit.timeit('olvin_roght()', setup=setup, number=10_000)}")
print(f"jonsg: {timeit.timeit('jonsg()', setup=setup, number=10_000)}")
print(f"mozway: {timeit.timeit('mozway()', setup=setup, number=10_000)}")
print(f"kelly_bundy: {timeit.timeit('kelly_bundy()', setup=setup, number=10_000)}")
This should show you results like:
olvin_roght: 8.36
jonsg: 7.19
mozway: 1.70
kelly_bundy: 0.08
CodePudding user response:
A slightly alternate approach would be to reframe the questions from:
Get a list of all the possible combinations of 4 digit numbers whose individual digits sum to 13 and last digit is 5
as:
Get all 3 digit numbers whose sum is 8.
Then we can do:
results = [i*10 5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]
or formatted a bit as:
results = [
i * 10 5
for i
in range(100, 1000)
if 8 == sum(
int(j)
for j
in str(i)
)
]
Also giving us:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
CodePudding user response:
you can find all of the answers with:
nums = []
for i in range(1000,10000):
sumi = (sum([int(j) for j in str(i)])) # sum of i digits
i_l = i % 10 # i last digit
if i_l == 5 and sumi == 13:
nums.append(i)
print (nums)
