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.