कम से कम N अच्छे नंबर लाने के लिए लॉटरी के कुछ टिकटों को चलायें


11

यह एक बल्कि जटिल लेकिन बहुत ही रोचक गणित विषय (जिसे "समस्या को कवर करना" कहा जाता है ),

और मैं इसे लागू करने के लिए आपकी मदद चाहूंगा।

एक लॉटरी गेम की कल्पना करें, जहां प्रत्येक टिकट को 50 नंबर (1 से 50 तक) के सेट में 5 यादृच्छिक संख्याओं का चयन करना होगा।

जीतने वाले टिकट की संभावना, या 1, 2, 3 या 4 अच्छे नंबरों की संभावना जानना काफी आसान है।

उन सभी टिकटों को "जनरेट" करना भी काफी आसान है जिनमें 1, 2, 3, 4 अच्छे नंबर हैं।

मेरा प्रश्न (और कोड चुनौती) इससे संबंधित है, लेकिन थोड़ा अलग:

मैं कुछ लॉटरी टिकट (सबसे कम संभव) खरीदना चाहता हूं, जैसे मेरे कम से कम एक टिकट में 3 अच्छे नंबर हैं।

चुनौती

आपका लक्ष्य एक सामान्य समाधान (एक कार्यक्रम या सिर्फ एक समारोह के रूप में) को लागू करना है, इस तरह से, किसी भी भाषा में:

// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)

उपरोक्त उदाहरण के लिए, किसी को कॉल करना होगा:

min_lottery_tickets(50, 5, 3)

और कार्यक्रम इस लक्ष्य को प्राप्त करने के लिए खेलने के लिए टिकटों के सबसे छोटे सेट को उत्पन्न करेगा।


उदाहरण:

 min_lottery_tickets(10, 5, 2)

उन जैसे 7 टिकटों का उत्पादन करेगा:

1   2   3   4   5
5   6   7   8   9
10  1   2   6   7
10  3   4   8   9
3   4   6   7   8
1   2   3   8   9
1   4   9   5   10

क्योंकि ऐसे टिकट किसी भी जोड़ी को 1 से 10 तक कवर करने के लिए पर्याप्त हैं।


उत्पादन

पाठ, प्रति टिकट एक पंक्ति, संख्याओं के बीच सारणियाँ या स्थान


किसी जीत

सबसे कुशल कार्यक्रम जीत (यानी उपरोक्त मापदंडों के लिए सबसे कम टिकट पैदा करने वाला कार्यक्रम):

min_lottery_tickets(50, 5, 3)


धन्यवाद!



4
इस प्रश्न को विभिन्न स्पष्टीकरणों की आवश्यकता है। क्या आप एक कार्यक्रम, एक समारोह, या तो के बाद हैं? क्या आउटपुट स्वरूप मायने रखता है? क्या संख्याओं को 1 से अनुक्रमित किया जाना है, या क्या उन्हें 0 से अनुक्रमित किया जा सकता है? और उद्देश्य जीतने की स्थिति क्या है?
पीटर टेलर

3
@ यह लगभग तब मठ एसई पर है। जहां वे शायद आपको साबित करेंगे कि संख्या आपके पक्ष में नहीं है (हालांकि वहाँ कुछ जैकपॉट नंबर मौजूद है जो टिकट खरीदने लायक है)
क्रंचर

2
एक अच्छी संख्या क्या है ?
डेविड

2
मुझे पूरा यकीन है कि यह साबित होगा कि अगर आप वास्तव में इस तरह के कार्यक्रम से टिकट आउटपुट खरीदते हैं तो आप बहुत पैसा खो देंगे।
माइकल हैम्पटन

जवाबों:


1

मुझे पता है कि यह इष्टतम नहीं है , लेकिन यहाँ नोड में कोड है। js:

function min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want) {
    c(function(result) {
        var other = result[result.length - 1];
        while (result.length < how_many_numbers_to_choose) {
            other++;
            var already = false;
            for (var i = 0; i < result.length; i++) {
                if (other === result[i]) {
                    already = true;
                    break;
                }
            }
            if (!already) {
                result.push(other);            
            }
        }
        if (other <= total_numbers_to_choose_from) {
            // Print results
            console.log(result);
        }
    }, total_numbers_to_choose_from, how_many_good_numbers_i_want);
}

function c(next, total_numbers, length, start, results) {
    if (!start) start = 1;
    if (!results) results = [];

    for (var i = start; i <= total_numbers + 1 - length; i++) {
        var resultsNew = results.slice(0);
        resultsNew.push(i);
        if (length > 1) {
            c(next, total_numbers, length - 1, i + 1, resultsNew);
        } else {
            next(resultsNew);
        }
    }
}

कुछ उदाहरण परिणाम:

> min_lottery_tickets(5, 3, 2)
[ 1, 2, 3 ]
[ 1, 3, 4 ]
[ 1, 4, 5 ]
[ 2, 3, 4 ]
[ 2, 4, 5 ]
[ 3, 4, 5 ]

अन्य:

> min_lottery_tickets(10, 5, 2)
[ 1, 2, 3, 4, 5 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]

अन्य:

> min_lottery_tickets(10, 5, 3)
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 4, 5, 6 ]
[ 1, 2, 5, 6, 7 ]
[ 1, 2, 6, 7, 8 ]
[ 1, 2, 7, 8, 9 ]
[ 1, 2, 8, 9, 10 ]
[ 1, 3, 4, 5, 6 ]
[ 1, 3, 5, 6, 7 ]
[ 1, 3, 6, 7, 8 ]
[ 1, 3, 7, 8, 9 ]
[ 1, 3, 8, 9, 10 ]
[ 1, 4, 5, 6, 7 ]
[ 1, 4, 6, 7, 8 ]
[ 1, 4, 7, 8, 9 ]
[ 1, 4, 8, 9, 10 ]
[ 1, 5, 6, 7, 8 ]
[ 1, 5, 7, 8, 9 ]
[ 1, 5, 8, 9, 10 ]
[ 1, 6, 7, 8, 9 ]
[ 1, 6, 8, 9, 10 ]
[ 1, 7, 8, 9, 10 ]
[ 2, 3, 4, 5, 6 ]
[ 2, 3, 5, 6, 7 ]
[ 2, 3, 6, 7, 8 ]
[ 2, 3, 7, 8, 9 ]
[ 2, 3, 8, 9, 10 ]
[ 2, 4, 5, 6, 7 ]
[ 2, 4, 6, 7, 8 ]
[ 2, 4, 7, 8, 9 ]
[ 2, 4, 8, 9, 10 ]
[ 2, 5, 6, 7, 8 ]
[ 2, 5, 7, 8, 9 ]
[ 2, 5, 8, 9, 10 ]
[ 2, 6, 7, 8, 9 ]
[ 2, 6, 8, 9, 10 ]
[ 2, 7, 8, 9, 10 ]
[ 3, 4, 5, 6, 7 ]
[ 3, 4, 6, 7, 8 ]
[ 3, 4, 7, 8, 9 ]
[ 3, 4, 8, 9, 10 ]
[ 3, 5, 6, 7, 8 ]
[ 3, 5, 7, 8, 9 ]
[ 3, 5, 8, 9, 10 ]
[ 3, 6, 7, 8, 9 ]
[ 3, 6, 8, 9, 10 ]
[ 3, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8 ]
[ 4, 5, 7, 8, 9 ]
[ 4, 5, 8, 9, 10 ]
[ 4, 6, 7, 8, 9 ]
[ 4, 6, 8, 9, 10 ]
[ 4, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9 ]
[ 5, 6, 8, 9, 10 ]
[ 5, 7, 8, 9, 10 ]
[ 6, 7, 8, 9, 10 ]

1
min_lottery_tickets(10, 5, 2)ओपी की तुलना में आपका अधिक समाधान उत्पन्न करता है।
ग्रू

मुझे पता है @Groo, मैंने कहा कि मुझे पता था कि यह इष्टतम नहीं था, लेकिन मेरे पास यह पहला कार्यशील संस्करण था;) "निरर्थक" परिणामों को हटाने के बारे में कोई सुझाव?
16

हाय ग्रू, हाय ग्रीज़े, इस पहले प्रयास के लिए बहुत बहुत धन्यवाद। आपके पास 21 का स्कोर है (क्योंकि आपने (10,5,2) के लिए 21 टिकट बनाए थे)। मुझे नहीं पता कि निरर्थक परिणामों को कैसे निकालना है, लेकिन इसीलिए मैंने यह विषय बनाया है। मैं अभी भी सोच रहा हूं कि इस काम को करने के लिए सबसे अच्छा एल्गोरिथ्म कैसा दिखता है।
xem

इस विषय पर कुछ अच्छी रीडिंग इस प्रकार हैं: (1) dip.sun.ac.za/~vuuren/papers/lotery_artikel1oud.pdf , (2) goo.gl/Ex7Woa , (3) google.fr/…
xem

1
यह एक एनपी-पूर्ण समस्या है, इसलिए मुझे डर है कि कोई जादू समाधान नहीं है। हमें सभी संभावित टिकटों की गणना और उन सभी के उन्मूलन के लिए "ब्रूट फोर्स" को तैयार करना होगा जो इसके प्रत्येक संख्या के समूह की तुलना अन्य सभी टिकटों से करते हैं। यह एक घातीय समय लगेगा।
XEM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.