Vinnaren i pepparkakshustävlingen!
2018-09-18, 14:40
  #1
Medlem
Hej!
Målet är att skicka in
4 parametrar:
3 //antalet parametrar som ska in
red 10
10 blue
green 7

Tänkte se om nån kan se vart det är fel i koden.
När man kör den i consolen så fungerar den som den ska där den sorterar och skriver enbart ut färgen.
I kattis skriver den ut första och tredje in parametern där den dessutom skriver ut siffran.

Kod:
User[] users = new User[3]; //Finns som separat klass som tar en int och en string
            string[] test = new string[3];

            for (int i = 0; i < 3; i++)
            {
                int myInt = 0;
                int secondInt = 0;

                string r = Console.ReadLine();
                if (int.TryParse(r, out myInt))
                {
                    string b = Console.ReadLine();
                    users[i] = new User(myInt, b);
                }
                else
                {
                    string b = Console.ReadLine();
                    int.TryParse(b, out secondInt);
                    secondInt = secondInt * 2;
                    users[i] = new User(secondInt, r);
                }
            }
            for (int i = 0; i < users.Length; i++)
            {
                Array.Sort(users, delegate (User user2, User user1)
                {
                    return user2.Radius.CompareTo(user1.Radius);
                });
            }

            for (int i = 0; i < 3; i++) //för att plocka ut enbart färgen
            {
                string split = users[i].Color;
                test[i] = split;
            }

            foreach (var item in test) 
            {
                Console.WriteLine(item);
            }

I konsolen blir utskriften : blue, green, red.
I kattis blir utskriften: 10 red, "space", 7 green
Länk till problemet:
https://open.kattis.com/problems/cups
__________________
Senast redigerad av icascola 2018-09-18 kl. 15:23.
Citera
2018-09-18, 14:56
  #2
Medlem
}}; ser inte ut att vara rätt, i den andra for loopen, bör väl bara vara }.
Citera
2018-09-18, 15:01
  #3
Medlem
Citat:
Ursprungligen postat av killing.fields
}}; ser inte ut att vara rätt, i den andra for loopen, bör väl bara vara }.

Den fungerar som den skall, får kompileringsfel om jag tar bort
Citera
2018-09-18, 16:30
  #4
Medlem
Citat:
Ursprungligen postat av killing.fields
}}; ser inte ut att vara rätt, i den andra for loopen, bör väl bara vara }.

I den andra for loopen är det en måsvinge följt av en parentes i slutet, vilket är korrekt. Eftersom Array.Sort() tar en array som första argument och en Comparison<T> (overloaded) som argument två blir:
Kod:
Array.Sort(usersdelegate (User user2User user1)
                {
                    return 
user2.Radius.CompareTo(user1.Radius);
                }); 

samma sak som:
Kod:
Comparison<Usercomparison delegate (User user2User user1){return user2.Radius.CompareTo(user1.Radius);};

Array.
Sort(userscomparison); 

Delegates kan man skriva om med lambda syntax och man skulle då kunna få koden att bli så enkel som detta:
Kod:
Array.Sort(users, (User user2User user1) => user2.Radius.CompareTo(user1.Radius)); 
Citera
2018-09-18, 16:43
  #5
Medlem
kodsnickrarns avatar
Du skriver "när man kör den i kattis..." - vad är "kattis" för något?

Din kod funkar även om den är lite "onödig".

T.ex. varför sorterar du arrayen lika många ggr. som du har users i arrayen??
Och varför plocka ut färgerna till en separat array innan de skrivs ut, du har ju redan
sorterat dina users efter radien, loopa bara igenom users och skriv ut user.Color..?

Dessutom sparar du diametern och inte radien i User.Radius, men det är ju ett semantiskt fel...

Så, gissningsvis har detta mer med "kattis" än din kod att göra

/K
__________________
Senast redigerad av kodsnickrarn 2018-09-18 kl. 16:47.
Citera
2018-09-18, 19:44
  #6
Medlem
Citat:
Ursprungligen postat av kodsnickrarn
Du skriver "när man kör den i kattis..." - vad är "kattis" för något?

Din kod funkar även om den är lite "onödig".

T.ex. varför sorterar du arrayen lika många ggr. som du har users i arrayen??
Och varför plocka ut färgerna till en separat array innan de skrivs ut, du har ju redan
sorterat dina users efter radien, loopa bara igenom users och skriv ut user.Color..?

Dessutom sparar du diametern och inte radien i User.Radius, men det är ju ett semantiskt fel...

Så, gissningsvis har detta mer med "kattis" än din kod att göra

/K

Ja sorteringen är onödig och ska jag fixa!
Man laddar upp sin kod till kattis som kör den mot olika testfall och anledningen varför jag tog ut enbart colors var för att av någon anledning så tog den ut både radius och color fast jag enbart skrev ut colors.
Citera
2018-12-20, 19:47
  #7
Medlem
Det finns ett flertal problem med koden som jag kan se

1. du sätter antalet i "users" arrayen till 3. I exemplet är det 3 rader, men läser du instruktionerna så står det att det kommer vara mellan 1 och 20 rader som kommer matas in.

2. String arrayen test är hårdkodad till 3 och första forsatsen är också hårdkodad till 3

3. I första forsatsen läser du först in input till strängen r. Du försöker att parsa den (vilket i första fallet kommer lyckas). Du läser då in ytterligare en rad, men sätter sen det värde du fick ut i TryParse som värde i din user.

4. Andra vändan i forsatsen läser du in ytterligare en rad, den här gången kommer den inte att kunna parsa värdet som är "10 red" eller motsvarande. Du går då till elsesatsen och läser in ytterligare ett värde. Här kör du en tryparse men kollar inte om parsningen lyckades, vilket betyder att secondInt blir 0

5. I elsesatsen kör du dessutom secondint = secondint * 2 vilket är diametern, om man läser senare så har du user.Radius, vilket betyder att de rader där man får in en diameter borde vara värde / 2. Du gör det dessutom på alla rader vilket är fel... inte för att det gör någon skillnad med tanke på vad jag nämnt i punkt 4.

6. I andra forsatsen sorterar du arrayen lika många gånger som det finns users. Ett betydligt enklare sätt kan göras med linq

var users = users.OrderBy(x => x.Radius).ToArray();

7. i tredje forsatsen är det åter igen hårdkodat 3. Och här kör du en split på färgen vilket du borde gjort betydligt tidigare.

8. I det här programmet har du fyra forsatser vilket är väldigt många för uppgiften.

Det är fullt möjligt att få ner det till en forsats där du läser in data, delar upp värdena, kontrollerar om det är en korrekt ("red 5" eller felaktig "10 black") rad och räkna om till radius eller diameter beroende på vad du vill (personligen körde jag på radius då det var det "korrekta" enligt uppgiften, men då måste man köra med double istället för int iom att om man får in en 9 black så blir det 4.5 och det skulle således bli fel om man använde int)
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback