Kolejny dopisek, tym razem do artykułu o konkursach programistycznych. Do poprzednich rekomendacji chciałbym dodać SPOJ. Serwis polski, a raczej dwujęzyczny - ma polską oraz angielską stronę (funkcjonalność jest ta sama ale zadania różne).
Opisuję dalej polską wersję, do angielskiej jednak także warto zajrzeć, są tam min. dostępne zadania z olimpiad i konkursów międzynarodowych.
Zasada działania
SPOJ funkcjonalnie leży gdzieś w połowie drogi pomiędzy topcoderem a projecteuler. Rozwiązujemy które zadania chcemy i kiedy chcemy, wybierając ze sporej puli, system ocenia je i prowadzi nam ranking. Nie wystarczy podanie poprawnego wyniku - trzeba napisać i wgrać gotowy program, który zostanie uruchomiony i przetestowany na serwerze (a testowana jest nie tylko poprawność ale i czas działania). Sewer nie zapewnia jednak środowiska programistycznego, piszemy, kompilujemy i testujemy używając własnych narzędzi.
Mamy dużą swobodę - do dyspozycji jest bardzo pokaźna ilość języków programowania, od C++, C#, Javy i Pascala, przez Perla, Pythona, PHP i Ruby, po Haskella, Prolog, Lisp, CAML Smalltalk i parę zupełnie egzotycznych zabawek (z języków, którymi mógłbym chcieć się pobawić, brakuje chyba tylko Erlanga i Scali). Uwaga: niektóre zadania ograniczają paletę języków (ale można listę zadań filtrować i np. poprosić o listę zadań, które można rozwiązywać w Pythonie).
Wybieramy sobie zadanie, rozwiązujemy je (piszemy odpowiedni program lub skrypt), testujemy wdg. własnych pomysłów. Gdy rozwiązanie jest gotowe, przechodzimy do formularza zgłaszania wyniku, wklejamy swój kod (lub uploadujemy plik źródłowy) i wysyłamy.
Zostajemy przekierowani do okna sędziego. Strona kilkakrotnie się odświeża pokazując kolejne fazy weryfikacji zadania (kompilacja, uruchamianie, testy) - na koniec dostajemy informację, czy rozwiązanie zostało przyjęte, czy nie. Sędzia jest jeden, czasami trzeba chwilę poczekać aż skończą się testy kodu zgłoszonego przez kogoś innego.
Niestety - w sytuacji, gdy coś działa źle, nie dostajemy żadnej informacji o szczegółowych przyczynach błędu, trzeba się domyślać samemu. Jako że dane testowe bywają złośliwe, bywa to frustrujące.
Zadania
Zadania są bardzo różnorodne, tak pod względem tematyki, jak poziomu trudności. Spora część pochodzi z różnych konkursów i zawodów. O ile łatwe faktycznie są w większości łatwiutkie, o tyle średnie wymagają już (przynajmniej ode mnie) porządnego zastanowienia, a trudne są autentycznie trudne.
Treść jest miejscami trochę przegadana, a metafory bywają naciągane. Osobiście wolałbym zamiast wieloakapitowych rozważań o dziwnych zwyczajach w Bajtocji przeczytać proste żądanie zoptymalizowania grafu czy wyliczenia maksimum wyrażenia. Cóż - można się przyzwyczaić.
Duża zaleta: zadania można sobie wydrukować (a także ściągnąć jako PDF lub PS) i to nie tylko pojedynczo ale i grupowo (np. wszystkie średnie). Wydrukowałem sobie taką książeczkę i planuję od czasu do czasu wybierać z niej coś do pozastanawiania się.
Wada: przykładowe dane w treści zadań są zwykle szczątkowe a porządne pliki testów nie są publikowane. Trzeba je sobie szykować samemu, co czasem stanowi zauważalny nakład dodatkowej pracy.
Interfejs
Interfejs jest trochę siermiężny - przy czym chodzi mi nawet nie tyle o trącącą nieco myszką estetykę, co o braki nawigacyjne. Podstawowy cykl czytanie zadania, zgłaszanie, testowanie, poprawki na pewno mógłby wymagać mniej klikania.
Bardzo mi brakuje możliwości oglądania i dyskutowania cudzych rozwiązań.
Podsumowanie
Moim ulubionym serwisem ciągle pozostaje ProjectEuler ale na SPOJ także planuję zaglądać - jest tam sporo interesujących algorytmicznych problemów, a konieczność przejścia testów na serwerze wymusza przyzwoite kodowanie.
I jeszcze trzy inne polskie strony z zadaniami algorytmicznymi:
-
Potyczki Algorytmiczne - tegoroczne eliminacje już się zakończyły (próbowałem wziąć udział, niestety dla osoby pracującej i mającej rodzinę wymagane tempo było całkowicie nierealne) ale zadania wiszą i można się nad nimi pozastanawiać,
-
MAIN,
-
SIO.