समस्या

लोभ एक पासे का खेल है जो पाँच छः भुजाओं वाले पासों के साथ खेला जाता है। आपका मिशन, यदि आप इसे स्वीकार करना चुनते हैं, तो इन नियमों के अनुसार एक थ्रो स्कोर करना है। आपको हमेशा पांच छह-पक्षीय पासा मानों के साथ एक सरणी दी जाएगी।


  • तीन 1 का => १००० अंक
  • तीन 6 => 600 अंक
  • तीन 5 => 500 अंक
  • तीन 4 => 400 अंक
  • तीन ३ => ३०० अंक
  • तीन 2 => 200 अंक
  • एक १ => १०० अंक
  • एक ५ => ५० अंक

एक पासा प्रत्येक रोल में केवल एक बार गिना जा सकता है। उदाहरण के लिए, दिया गया "5" केवल एक ट्रिपलेट (500 अंक में योगदान) के हिस्से के रूप में या एक 50 अंक के रूप में गिना जा सकता है, लेकिन दोनों एक ही रोल में नहीं हैं।


उदाहरण स्कोरिंग:

फेंको | स्कोर

५ १ ३ ४ १ | २५०: ५० (५ के लिए) + २ * १०० (१ के लिए)

१ १ १ १ ३ १ | ११००: १००० (तीन १ के लिए) + १०० (अन्य १ के लिए)

२ ४ ४ ५ ४ | ४५०: ४०० (तीन ४ एस के लिए) + ५० (५ के लिए)

मेरा कोड

int score(const int dice[5]) {   
    int ones=0;
    int twos=0;
    int threes=0;
    int fours=0;
    int fives=0;
    int sixes=0;
    int total = 0;
      
    //counting roll
    for (int i=0; i < 6; i++)
    {
        if (dice[i] == 1){
            ones++;
        }
        else if(dice[i] == 2){
            twos++;
        }
        else if(dice[i] == 3){
            threes++;
        }
        else if(dice[i] == 4){
            fours++;
        }
        else if(dice[i] == 5){
            fives++;
        }
        else if(dice[i] == 6){
            sixes++;
        }
    }
      
    //adding value to roll
    if(ones == 1){
        total = total + 100;
    }
    else if (ones == 2){
        total = total + 200;
    }
    else if (ones == 3){
        total = total + 1000;
    }
    else if(ones == 4){
        total = total + 1100;
    }
    else if (ones == 5){
        total = total + 1200;
    }
    else if(ones == 6){
        total = total + 2000;
    }
      
    if(twos == 3){
        total = total + 200;
    }
    else if (twos == 6){
        total = total + 400;
    }
      
    if(threes == 3){
        total = total + 300;
    }
    else if (threes == 6){
        total = total + 600;
    }
      
    if(fours == 3){
        total = total + 400;
    }
    else if(fours == 6){
        total = total + 800;
    }
      
    if(fives == 1){
        total = total + 50;
    }
    else if (fives == 2){
        total = total + 100;
    }
    else if(fives == 3){
        total = total + 500;
    }
    else if (fives == 4){
        total = total + 550;
    }
    else if (fives == 5){
        total = total + 600;
    }
    else if (fives == 6){
        total = total + 1000;
    }
      
    if(sixes == 3){
        total = total + 600;
    }
    else if(sixes == 6){
        total = total + 1200;
    }
      
    return total;
}

मेरी त्रुटियां:

enter image description here


मेरा प्रश्न

मैं इस कोड में क्या खो रहा हूँ? मुझे लगा कि मैंने हर संभावना पर विचार किया है।

c
-2
Addi 20 अगस्त 2021, 23:25

2 जवाब

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

आपका फ़ंक्शन प्रोटोटाइप

int score(const int dice[5])

साथ ही आपका अपना विवरण बताता है कि पांच (5) पासे फेंके जाते हैं।

लेकिन लूप में

for (int i=0; i < 6; i++)

आप एक सरणी के छठे तत्व तक पहुँच प्राप्त करते हैं जिसमें केवल पाँच तत्व होते हैं (dice[5])। इस तरह व्यवहार अपरिभाषित है, जिसका अर्थ है कि आपके पास थ्रो की गलत गिनती और गलत कुल हो सकता है।

इसी कारण से, चेक की तरह

else if(ones == 6){
    total = total + 2000;
}

बेकार हैं क्योंकि आपके पास "छः एक तरह का" कभी नहीं हो सकता है।


यहां यह आपके कोड का एक संभावित संशोधित (और अनुकूलित) संस्करण है:

int score(const int dice[5]) {
    int diceCounts[6] = { 0 };
    int total = 0;
  
    //counting roll
    //the numbers of throws of 'n' is contained into diceCounts[n-1]
    for (int i=0; i<5; i++) 
    {
        if(dice[i]>=0 && dice[i] <= 6)
      
      ++diceCounts[dice[i]-1];
    }
  
    //adding value to roll
    if(diceCounts[0] >= 3){ //1
        total += 1000
        diceCounts[0] -= 3;
    }
    total += diceCounts[0] * 100;
 
    for (int i=1; i<6; i++)
    {
        if(diceCounts[i] >= 3){ //2...6
            total += i*100
            diceCounts[i] -= 3;
        }
    }
    
    total += diceCounts[4] * 50;
  
  return total;  
}

सुझाव:

  • प्रत्येक संख्या 'n' के थ्रो की संख्या वाले छह तत्वों की एक सरणी बनाएं (n-1-सरणी के तत्व में निहित)
  • प्रत्येक संख्या के लिए, जांचें कि क्या इसमें कम से कम 3 बारंबारताएं हैं। उस स्थिति में तदनुसार कुल अपडेट करें * केस 1 को अलग से प्रबंधित करें। अन्य सभी नंबर एक x*100 बोनस प्रदान करते हैं
  • घटनाओं की संख्या से 3 घटाएं। यह केस 5 के लिए उपयोगी होगा, जिसमें आप रिमाइंडर को 50 से गुणा करेंगे (एक 5 का बोनस)।
1
Roberto Caboni 20 अगस्त 2021, 21:21

आपने सभी मामलों को नहीं संभाला... यदि आपके पास 4 3s और एक कुछ और है, तो इसे 300 गिनना चाहिए लेकिन यह 0 की गणना करता है क्योंकि आपके पास 4 3s के लिए कोई मामला नहीं है (यह 3 3s के समान होना चाहिए)

4s के लिए वही।

मैंने शायद इसे एक लूप के रूप में लिखा होगा जहां यह गिनती को हटा देता है क्योंकि यह इसका उपयोग करता है, फिर किसी अन्य लूप में किसी भी बचे हुए को तब तक संभालता है जब तक कि लूप को कोई स्कोर नहीं मिलता है, लेकिन यह काम करेगा यदि आप उन मामलों को जोड़ते हैं जिन्हें आपने याद किया है और इंडेक्स 4 पर पुनरावृत्ति करना बंद कर दिया है जो आपके 5-तत्व सरणी का 5वां तत्व है।

0
sbingner 20 अगस्त 2021, 22:15