श्रेणी में पूर्णांकों के लिए (1, 13) मुझे तीन पूर्णांकों के सभी संभावित रूपों का निर्माण करने की आवश्यकता है जो कि 13 के योग हैं। वेरिएंट में दोहराव नहीं होना चाहिए। उदाहरण के लिए (1,2,10), (2,1,10), (10,1,2) और (10,2,1) सभी एक ही प्रकार के दोहराव हैं। इस प्रकार परिणामी सूची में इस टुपल्स में से केवल एक होना चाहिए, इससे कोई फर्क नहीं पड़ता कि कौन सा है। परिणामी टपल जैसे (1,1,11) में अलग-अलग स्थिति में समान पूर्णांक वाले वेरिएंट भी मान्य हैं। इन प्रकारों के लिए दोहराव जैसे (1,1,11), (1,11,1) और (11,1,1) होंगे।

शायद समस्या की बेहतर व्याख्या देने के लिए यहाँ वह कहानी है जहाँ से यह आती है:

दो दोस्त एलन और ड्रेक मिलते हैं।

एलन: मेरे तीन बच्चे हैं।

ड्रेक: वे कितने साल के हैं?

एलन: बच्चों की उम्र का योग 13 के बराबर है।

इसलिए मैं सभी संभावित उम्र की सूची प्राप्त करने का प्रयास कर रहा हूं।

मेरे पास यह कोड है, जो सभी संभावित दोहराव उत्पन्न करता है जिन्हें मुझे छोड़ने की आवश्यकता है:

ages = list(range(1,13))
kids_ages = []
for a in ages:
  for b in ages:
    for c in ages:
      if a + b + c == 13:
        kids_ages.append((a,b,c))

परिणामस्वरूप मुझे मिलता है:

([(1, 1, 11),
(1, 2, 10),
(1, 3, 9),
(1, 4, 8),
(1, 5, 7),
(1, 6, 6),
(1, 7, 5),
(1, 8, 4),
(1, 9, 3),
(1, 10, 2),
(1, 11, 1),
(2, 1, 10),
(2, 2, 9),
(2, 3, 8),
...

दोहराव से कैसे छुटकारा पाएं?

0
dokondr 2 नवम्बर 2019, 12:15

3 जवाब

सबसे बढ़िया उत्तर

प्रयत्न:

import itertools

res=list(sorted(el) for el in itertools.combinations_with_replacement(range(1, 14), 3) if sum(el)==13)

print(res)

आउटपुट:

[[1, 1, 11], [1, 2, 10], [1, 3, 9], [1, 4, 8], [1, 5, 7], [1, 6, 6], [2, 2, 9], [2, 3, 8], [2, 4, 7], [2, 5, 6], [3, 3, 7], [3, 4, 6], [3, 5, 5], [4, 4, 5]]

[Program finished]
1
Grzegorz Skibinski 2 नवम्बर 2019, 14:13

फ्रोजेनसेट आपको यहां डुप्लीकेट हटाने में मदद कर सकता है।

ages = list(range(1,13))
kids_ages = []
for a in ages:
  for b in ages:
    for c in ages:
      if a + b + c == 13:
        kids_ages.append((a,b,c))

result=set(map(frozenset, kids_ages))
print(result)
1
Saqib Naseeb 2 नवम्बर 2019, 12:29

मैंने इसे केवल पहली स्थिति के लिए सबसे कम उम्र और दूसरे स्थान के लिए दूसरी सबसे कम उम्र पर विचार करके हल किया। इस तरह, डुप्लिकेट की तलाश करना आवश्यक नहीं है।

ages = list(range(1,13))
kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
    remaining_sum = 13 - age1
    # Pick the next smallest age
    for age2 in range(age1 + 1, 13):
        age3 = 13 - age1 - age2
        if age3 > age1 and age3 > age2:
            kids_ages.append( (age1, age2, age3) )

print kids_ages
# Result:
# [(1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 4, 6)]

संपादित करें: उपरोक्त समाधान में ऐसे वेरिएंट शामिल नहीं हैं जहां एक संख्या दोहराई जाती है, जैसे (1, 1, 11)। इन्हें शामिल करने के लिए, बस कोड में एक स्थान को बदलने के लिए प्राप्त करें:

kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
    remaining_sum = 13 - age1
    # Pick the next smallest age, whch may be the same as the first
    for age2 in range(age1, 13):
        # Only a single number can be the third age. Check if it's valid.
        age3 = 13 - age1 - age2
        if age3 >= age2:
            kids_ages.append( (age1, age2, age3) )

# Result:
# [(1, 1, 11), (1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (1, 6, 6), (2, 2, 9), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 3, 7), (3, 4, 6), (3, 5, 5), (4, 4, 5)]

तीन संख्याओं के समान होने के कारण, ऐसा कोई हल नहीं है जिसका योग 13 हो।

0
Anders Petersson 2 नवम्बर 2019, 13:34