Średnikowe wyzwanie – konkurs!
Grudzień nadchodzi, a jak grudzień to święta, a jak święta to prezenty!
Wolisz nie liczyć na innych i samemu zrobić sobie prezent, a dodatkowo umiesz programowania w języku C#? Doskonale! Weź udział w organizowanym przeze mnie konkursie i zgarnij książkę „Testy jednostkowe. Świat niezawodnych aplikacji” wydawnictwa Helion!
Być może słyszałeś o konkursach na jak najkrótszy kod wykonujący dany algorytm. Ja proponuję dziwniejszą wariację. Zadanie jest proste – napisz kod w języku C# wykonujący poniższe polecenie tak, żeby we wszystkich plikach źródłowych znalazło się jak najmniej średników.
Brzmi prosto? Zobaczymy!
Uprzedzając jeszcze tylko osoby zbyt intensywnie chłonące każdą wiedzę, że rozwiązania, które się tutaj pojawią prawdopodobnie będą miały mało wspólnego z ogólnie przyjętymi zasadami czystości kodu, a sama treść zadania miała bardziej umożliwić rywalizację niż być przykładem praktycznego zadania z życia wziętego ;)
Co zatem ma robić program?
Konkursowy program ma za zadanie utworzyć listę 5 obiektów klasy A, która zawiera dwie wartości – jedną typu int i jedną typu string. Dla każdego obiektu wartość typu int ma być wylosowana z przedziału domkniętego liczb parzystych od 2 do 100, a wartość typu string niech będzie brana kolejno z tablicy stringów przechowującej 5 ciągów tekstowych (pierwszy obiekt dostaje string znajdujący się w tablicy pod indeksem 0, drugi dostaje ciąg znajdujący się w tablicy pod indeksem 1 itd.). Następnie program ma na podstawie utworzonej listy obiektów klasy A stworzyć listę obiektów klasy B ( która to klasa zawiera dwie wartości typu int), zawierającą 5 obiektów (a więc jeden obiekt klasy A odpowiada jednemu obiektowi klasy B), i przypisać ją do zmiennej. Pierwsza wartość w obiekcie typu B ma być dwu krotnością wartości typu int z odpowiadającego obiektu klasy A, a druga wartość w obiekcie klasy B ma być długością stringa zawartego w odpowiadającym obiekcie klasy A. Tak utworzoną listę obiektów klasy B należy posortować rosnąco po wartościach odpowiadających długości stringa. Na koniec program ma wypisać w konsoli w kolejnych liniach wg kolejności wartości wszystkich obiektów klasy B w postaci „wartosc1 : wartosc2” (wartosc2 – długość stringa) i czekać na reakcję użytkownika (np. poprzez funkcję ReadKey()) po czym program ma zakończyć działanie.
Krótki (albo i nie) regulamin:
Organizatorem konkursu jestem ja sam jako właściciel tego bloga – Marek Zając.
Uczestnik konkursu, którym jest każdy kto wysłał rozwiązanie na podany niżej adres w czasie trwania konkursu, akceptuje ten regulamin i wyraża zgodę na przetwarzanie przez organizatora jego danych osobowych niezbędnych w przypadku ewentualnej wygranej. Jednocześnie oświadcza, że podaje te dane dobrowolnie i ma możliwość dostępu do nich, poprawiania i sprzeciwu wobec dalszego przetwarzania.
Nagrodę wysyłam za pośrednictwem Poczty Polskiej niezwłocznie po podaniu wyników i skontaktowaniu się mailowo ze zwycięzcą. Pokrywam też koszt wysyłki.
Poprawnie rozwiązane zadanie powinno kompilować się w środowisku Visual Studio 2013. Można używać jedynie bibliotek, które znajdują się w przestrzeni nazw System.* i jednocześnie są dostępne w standardowej instalacji Visual Studio 2013 Express for Desktop. Jeśli jakaś moduł wymaga dodania referencji w projekcie (standardowy projekt aplikacji konsolowej w środowisku Visual Studio 2013 Express for Desktop) należy to napisać w pliku readme.txt, dołączonym do paczki z kodem.
Program nie może wymagać połączenia z Internetem oraz nie może próbować odczytywać lub zapisywać plików na dysku, ani w inny sposób ingerować w system, na którym jest uruchamiany.
Program powinien być aplikacją konsolową (tekstową) napisaną w języku C#.
Aplikacja i zawierające ją archiwum nie mogą powodować uszkodzenia sprzętu ani systemu organizatora.
Wszystkie pliki źródłowe powinny znajdować się w jednym katalogu. Katalogiem branym pod uwagę jest katalog gdzie znajduje się plik źródłowy z kodem zawierającym funkcję main(). Wszystkie inne katalogi nadrzędne i podrzędne zostaną zignorowane.
Wszystkie przesłane aplikacje będą uruchamiane w systemie Windows 7 x64.
Nazwy klas, pól i zmiennych mogą być praktycznie dowolne z małymi wyjątkami – nie można używać słów powszechnie używanych za wulgarne, ani określeń sprzecznych z prawem, obraźliwych dla osób o innym wyznaniu, pochodzeniu, kolorze skóry czy poglądach politycznych. Podane w treści zadania nazwy klas i pól są przykładowe i można je zmieniać.
Warunkiem zwycięstwa jest napisanie kodu źródłowego, w którym suma wszystkich średników ( znak ’;’ ), we wszystkich dołączonych w rozwiązaniu plikach źródłowych (*.cs) będzie jak najmniejsza. Jednocześnie przesłane rozwiązaniu musi być działającą aplikacją dlatego przed policzeniem średników program będzie kompilowany i uruchamiany, dodatkowo sprawdzone będzie czy wykonuje wszystkie podane w treści zadania polecenia.
Rozwiązania nie spełniające warunków regulaminu będą odrzucane.
Jeśli więcej niż jedno rozwiązanie uzyska najlepszy wynik decydować będzie czas odebrania emaila z paczką z kodem wyświetlany przez webowy interfejs skrzynki pocztowej. Wcześniej == lepiej.
Zgłoszenia w postaci archiwum ZIP z plikami .cs i ewentualnym plikiem readme.txt (inne typy archiwów i znajdujących się w nich plików będą ignorowane) wysyłajcie na adres konkurs@zajacmarek.com do 5 grudnia do godz. 24:00, w treści napiszcie swoje imię i nazwisko, które wraz z waszym rozwiązaniem pojawią się na blogu w przypadku wygranej, a w temacie wpiszcie słowo „Konkurs”. Pod uwagę będzie brane tylko pierwsze wysłane przez daną osobę rozwiązanie. Ze zwycięzcą skontaktuję się mailowo, żeby ustalić dane do wysłania nagrody.
Na podany wyżej adres email możecie też kierować swoje pytania i uwagi. Od razu mówię, że prośby o podanie gotowego rozwiązania albo podpowiedzi ułatwiających rozwiązanie będą odrzucane ;)
Zwycięzcę postaram się podać na blogu do 7 grudnia 2014r. do godz. 22:00, w przypadku dużego zainteresowania termin ten może się przesunąć.
Co do nazwy konkursu to lepsza nie przyszła mi do głowy, a ta przynajmniej mówi coś o treści zadania :P
Przy okazji zapraszam też na mój fanpage na Facebooku :)
Pingback: We love mondays #3 - Marek Zając - devblog
Nie do konca rozumiem inicjalizacje obiektów klasy A. Skad ma sie wziac tablica stringów uzywana do inicjalizacji wartości obiektu A? ;)
Tablica stringów powinna być stworzona przed inicjalizacją obiektów klasy A ;)
No tak, ale z czego ona powinna być stworzona? User powinien te stringi wprowadzac?
Stringi powinny być wpisane już bezpośrednio w kodzie.