Професионална програма
Loading...
+ Нов въпрос
valenteeeen avatar valenteeeen 6 Точки

[C# Advanced] Exercises - Sets and Dictionaries - 08. Hands of Cards

Здравейте!

Написах(преписах) кода от видеотo

въпреки че го няма целия код никъде в окончателния му вид(това, което се копира от преподавателя и "субмитва" в Judge-a) и получих 33 точки.

Къде сгреших? Къде е разликата - грешката ми(Къде са разликите - грешките ми)?

Преподавателят "субмитна" в Judge-a кода, който аз преписах от него и получи 100 точки, а аз само 33 точки? 

Ето моя вариант на кода

1
C# Advanced 15/06/2017 12:07:29
IskrenPenev avatar IskrenPenev 177 Точки

Имаш грешки в кода:

1. Първият цикъл който завърташ е от 1 до < 4 (вземаш боята на картата), тоест 1, 2 или 3, четвъратата боя я прескачаш.

2. Вторият цикъл трябва да започва от 1, а не от 0 - ти вече си взел първия елемент от масива (това е играча).

3. Трябва да излезаш от while цикъла веднага след като прочетеш следващия ред, пресмятането на сумата и печатането трябва да са извън него.

1
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей!

 

1-во - break-овете в switch-овете на 2та метода с излишни. Ти return-ваш преди тях и няма как да стигнеш до тях. Предполагам VS ти показва warning за това. Все пак не е фатално и не то ти хвърля грешката.

2ро - Нулевия ти тест не минава. Пробвай да го дебъгнеш и оправиш и тогава най - вероятно ще.се оправи всичко.

 

Маалко насоки:

value-то на houseOfCards ти стига да е HashSet<string>, не знам защо  си решил да е Dictionary<int, HashSet<int>> . След като набиеш всички ръце във HashSet-а, обхождаш го  с foreach и викаш методите за изчисление на всяка ръка.

Според мен, по твоя начин доста си усложняваш решението. Ако все пак решиш да се придържаш към него, провери си сплита, защото нулевият тест ти гърми от това.

Оставам на разположение за още въпроси.

 

Поздрави!

1
31/05/2016 09:39:20
valenteeeen avatar valenteeeen 6 Точки

Здравейте!

Благодаря за отговора!

Това не е моя начин, а някакво неточно копие на показаното на видеото

https://softuni.bg/trainings/resources/video/8766/video-ekran-19-05-2016-svetlin-gylov-advanced-c-sharp-may-2016

Дали може да ми напишете, нулевия тест който използвате!? Относно break-овете в switch-овете на 2 - та метода VS ги подчертава с зелено и изписва, че не "достига до тях, не ги използва или н.п. ", т.е. излишни са!

0
31/05/2016 12:37:39
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

 

Нулевият тест го имаш в дока с условието.

 

По - горе се изразих доста крайно. Погледнах решението на колегата от видеото и наистина има логика в използването на Dictionary<int, HashSet<int>>. Решението му се събмитва за по - малко време от това, което използвам аз, следователно е по - добро.

 

Поздрави!

0
31/05/2016 12:58:04
vani4ka66 avatar vani4ka66 24 Точки

Дава 100/100 - пак е от видеото

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace FirstDay
{
    class Program
    {

        static void Main(string[] args)
        {
            Dictionary<string, Dictionary<int, HashSet<int>>> houseOfCards = new Dictionary<string, Dictionary<int, HashSet<int>>>();
            string input = Console.ReadLine();

            while (input != "JOKER")
            {
                string[] handInfo = input.Split(new char[] { ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
                string name = handInfo[0];

                if (!houseOfCards.ContainsKey(name))
                {
                    houseOfCards.Add(name, new Dictionary<int, HashSet<int>>());

                    for (int i = 1; i <= 4; i++)
                    {
                        houseOfCards[name].Add(i, new HashSet<int>());
                    }
                }

                 for (int i = 1; i < handInfo.Length; i++)
                {
                    string currentCard = handInfo[i].Trim();
                    int face = 0;
                    int suite = 0;

                    if (currentCard.Length > 2)
                    {
                        face = GetFace(currentCard.Substring(0, 2));
                        suite = GetSuite(currentCard.Substring(2));
                    }
                    else
                    {
                        face = GetFace(currentCard[0].ToString());
                        suite = GetSuite(currentCard[1].ToString());
                    }

                    if (!houseOfCards[name][suite].Contains(face))
                    {
                        houseOfCards[name][suite].Add(face);
                    }
                }

                input = Console.ReadLine();
            }

            foreach (var outerPair in houseOfCards)
            {
                int sum = 0;
                foreach (var inner in outerPair.Value)
                {
                    sum += inner.Key * inner.Value.Sum();
                }
                Console.WriteLine("{0}: {1}", outerPair.Key, sum);
            }
        }

        private static int GetSuite(string suite)
        {
            switch (suite)
            {
                case "S":
                    return 4;
                case "H":
                    return 3;
                case "D":
                    return 2;
                case "C":
                    return 1;
                default:
                    return 0;
            }
        }

        private static int GetFace(string face)
        {
            switch (face)
            {

                case "J":
                    return 11;
                case "Q":
                    return 12;
                case "K":
                    return 13;
                case "A":
                    return 14;

                default:
                    return int.Parse(face);
            }
        }
    }
}


 

0
valenteeeen avatar valenteeeen 6 Точки

using System;
using System.Collections.Generic;
using System.Linq;

class _08_10_HandsOfCards
{
    private static object item;
    private static object outerPair;

    static void Main()
    {
        Dictionary<string, HashSet<int>> setMasiv1 = new Dictionary<string, HashSet<int>>();

        string inputStr = "";

        while (true)
        {
            inputStr = Console.ReadLine();/////
            if (inputStr == "JOKER")
            {
                break;
            }

            string[] myArr = inputStr.Split(new char[] { ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
            string personName = myArr[0];

            if (!setMasiv1.ContainsKey(personName))
            {
                setMasiv1.Add(personName, new HashSet<int>());
            }

            for (int i = 1; i < myArr.Length; i++)
            {
                setMasiv1[personName].Add(kalk(myArr[i]));

            }/////

        }
        Console.WriteLine();
        foreach (var outerPair in setMasiv1)
        {
            int sum = 0;
            foreach (var innerPair in outerPair.Value)
            {
                sum += innerPair;
            }
            Console.WriteLine($"{outerPair.Key}: {sum}");
        }
        Console.WriteLine();/////
    }

    private static int Sum()
    {
        throw new NotImplementedException();
    }

    public static int showNum(string str)
    {//(S -> 4, H-> 3, D -> 2, C -> 1).
        int sum = 0, m = 0, length = str.Trim().Length;
        // char ch = str.Trim()[length - 1];
        string substring = str.Trim().Substring(0, length - 1).Trim();
        if (substring == "J" || substring == "Q" || substring == "K" || substring == "A")
        {
            m = n(substring);
        }
        else
        {
            int p = int.Parse(substring);
            m = p;
        }
        sum += m;

        return sum;
    }
    public static int kalk(string str)
    {//(S -> 4, H-> 3, D -> 2, C -> 1).
        int sum = 0, m = 0;
        int length = str.Trim().Length;
        char ch = str.Trim()[length - 1];
        string substring = str.Trim().Substring(0, length - 1).Trim();
        if (substring == "J" || substring == "Q" || substring == "K" || substring == "A")
        {
            m = n(substring) * n(ch);
        }
        else
        {
            int p = int.Parse(substring);
            m = p * n(ch);
        }
        sum += m;
        return sum;
    }
    public static int n(char ch)
    {
        int sum = 0, s = 4, h = 3, d = 2, c = 1;
        if (ch == 'S') sum = s;
        else if (ch == 'H') sum = h;
        else if (ch == 'D') sum = d;
        else if (ch == 'C') sum = c;
        return sum;
    }
    public static int n(string str)
    {
        int sum = 0, j = 11, q = 12, k = 13, a = 14;
        if (str == "J") sum = j;
        else if (str == "Q") sum = q;
        else if (str == "K") sum = k;
        else if (str == "A") sum = a;
        return sum;
    }
}

0
valenteeeen avatar valenteeeen 6 Точки

Здравейте! 

Благодаря за кода,ще го разгледам, а това е моя код - няколко дни го писах. докато получа 100/100, малко се отклоних от видеото ... !

0
Bullsized avatar Bullsized 153 Точки

моето решение

та, имам въпрос, понеже първия от трите теста ми гърми - какво мога да поправя?
 

метода ми е следния - вземам въведения ред, добавям в речник<стринг, хешсет<стринг>>, като всеки стринг ми е името на картоиграча, а всеки хешсет са картите. с това завършвам while цикъла, и после почвам да смятам, като променливите ми не са много коректно наименовани, но след около 3 часа главоблъскане на тази задача ми е интересно просто какво съм объркал. та, смятам за първата част от 'ръката' дали ще е от 1 до А и после смятам за втората част дали ще е от C до S, като накрая събирам резултата и го принтирам на конзолата. някакви препоръки?

 

линк към джъджа за задачата, като условието може да се изтегли от същия раздел, само че задача 01 Phonebook

0
sktomov avatar sktomov 49 Точки

Нещо при сплитването е ставало. Промених ти началото на кода ;)

https://pastebin.com/B7WZ85Q7

 

Поздрави

1
Bullsized avatar Bullsized 153 Точки

Първо, благодаря за отделеното внимание, за да погледнеш кода.
Второ, нищо не ми идва на ум какво е объркано при сплитването, при положение, че другите два теста работят с това сплитване. Не мога да се сетя чак какъв частен случай са въвели, че да излиза извън норми...

0
e.manolov avatar e.manolov 79 Точки

Здравей, причината да не ви минават някои от тестовете според мен идва от :

"The input ends when a "JOKER" is drawn. The name can contain any ASCII symbol except ':'. The input will always be valid and in the format described, there is no need to check it."

При вашия код, вие се опитвате да сплитнете наведнъж целия инпут по ":", ",", " " , но в условието пише. че в името може да се съдържа всякакъв символ освен ":"(дори и "," може да има), тоест ако в името има запетая вие ще сплитнете името и то няма дабъде коректно.

Затова, както и колегата ви е направил корекция по кода, е добре първо да сплитнете само по ":", да си вземете името на играча (тука вече ако има запетая в името ще си го вземете коректно), и втората част от инпута (картите), тогава тях може да си ги сплитнете само по "," и " " .

Явно някои от тестовете са точно такива, за да ни проверят дали сме сплитнали правилно.

Дано съм успял да ви обясня откъде идва разминаването.

 

 

0
18/06/2017 11:21:36
warglaivee avatar warglaivee 59 Точки

https://gist.github.com/Warglaive/640b19ff5f099a809544beb1b43ddcc7
Някаква идея как да проверя дали елемент от новата ръка се съдържа в речника?

0
Nick97 avatar Nick97 0 Точки

Имате ли идея защо ми гърми нулевият тест?

using System;
using System.Collections.Generic;
using System.Linq;

namespace HandsOfCards
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine()
                .Trim().Split(new char[] { ',', ':', ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
            Dictionary<string, Dictionary<string, int>> output = new Dictionary<string, Dictionary<string, int>>();
            while (input[0] != "JOKER")
            {
                if (!output.ContainsKey(input[0]))
                {
                    output.Add(input[0], new Dictionary<string, int>());
                }
                for (int i = 1; i < input.Length; i++)
                {
                    if (!output[input[0]].ContainsKey(input[i]))
                    {
                        output[input[0]].Add(input[i], GetValue(input[i].ElementAt(0), input[i].Last()));
                    }
                }
                input = Console.ReadLine()
                .Trim().Split(new char[] { ',', ':', ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
            }
            foreach (var item in output)
            {
                
                Console.WriteLine($"{item.Key}: {item.Value.Values.Sum()}");
            }
        }
        static int PowOfHand(char ch)
        {
            switch (ch)
            {
                case '1': return 10;
                case '2': return 2;
                case '3': return 3;
                case '4': return 4;
                case '5': return 5;
                case '6': return 6;
                case '7': return 7;
                case '8': return 8;
                case '9': return 9;
                case 'J': return 11;
                case 'Q': return 12;
                case 'K': return 13;
                case 'A': return 14;
                case 'S': return 4;
                case 'H': return 3;
                case 'D': return 2;
                case 'C': return 1;
                default: return 0;
            }
        }
        static int GetValue(char a, char b)
        {
            return PowOfHand(a) * PowOfHand(b);
        }
    }
}

0
28/10/2018 15:52:29