2011-10-21 10 views
8

jestem uczestniczących w wielkim konkursie programowania jutro gdzie używam R.Skróty i funkcje w ramach przygotowań do konkursu programowania

Time jest głównym czynnikiem (tylko 2 godziny do 7 kodujących problemy). Problemy są bardzo związane z matematyką.

  1. Chciałbym napisać "f" zamiast "funkcja", gdy zdefiniuję funkcję. To można zrobić i miałem kod, żeby to zrobić, ale zgubiłem go i nie mogę go znaleźć.

  2. Gdzie mogę znaleźć funkcje sin() dla stopni wejściowych, a nie dla radianów?

  3. (opcjonalnie) Czy istnieje widok algorytmu lub biblioteki określonego zadania.

  4. Każda wskazówka do konkursu programistycznego?

przygotowałem następujące Ściągawka dla konkursu: http://pastebin.com/h5xDLhvg

======== EDIT: ==========

Więc ostatecznie mam czas na zapisanie moich lekcji.

Konkurs programistyczny był świetną zabawą, ale niestety nie zaliczyłem zbyt dobrze. Byłem w czołówce 50%, ale moim celem było osiągnięcie najwyższych 25%.

Głównym problemem było to, że było bardzo mało czasu na programowanie, zaledwie 2 godziny w sumie. Ale musiałem przeczytać opisy problemów, a także potrzebowałem trochę czasu, aby wkleić wyniki w formie internetowej itp., Więc było to bardziej jak 90 minut programowania.

Mam nadzieję, że następny konkurs w grudniu będzie dłuższy niż 3-4 godziny. Organizatorzy stwierdzili, że być może tak będzie.

Również na konkursie nie było dostępu do Internetu, a moja mobilna recepcja nie działała.

Główną lekcją dla mnie jest to, że musisz używać języka, który codziennie używasz, aby mieć prawdziwą szansę. Zwłaszcza, jeśli program ma tylko około 90 minut. Ponieważ używam haskell więcej niż R w mojej codziennej pracy, myślę, że R nie był najlepszym wyborem. Podczas zawodów wymieszałem definicje funkcji haskell i R, i stworzyłem zbyt wiele małych literówek, żeby programować wystarczająco szybko.

Co było wspaniałe w konkursie, to, że w sumie około 20 000 nagród pieniężnych w sumie dla około 80 uczestników. Tak więc 25% najlepszych uczestników otrzymało od 500 do 1500 dolarów. Co więcej, uważam, że 15% najlepszych od razu otrzymuje pracę od jednej z sponsorujących firm informatycznych.

To sytuacja korzystna dla wszystkich. Fajnie, a dodatkowo możesz zdobyć nagrodę pieniężną. Co więcej, firmy IT są bardziej niż zadowolone, ponieważ mają dostęp do najlepszych programistów.

Wykorzystałem okazję, aby porozmawiać z decydentami IT. Jeden z nich pochodził z większego banku. Odważnie zasugerowałem, aby rozważyli zmianę na Scalę (przełączanie z Javy). A także rozważyć użycie R i Haskell. Było fajnie, a oni nawet powiedzieli, że już zajrzeli do Scali!

Co ciekawe, jeden z moich najlepszych przyjaciół zdobył bardzo dobre wyniki w konkursie. Ma tylko 19 lat, ale był w najlepszej 20% i otrzymał 500 nagród pieniężnych. Pobił mnie i 6 moich kolegiów, z których wszyscy mają szacowny stopień informatyki. Moje programy znajomych bardziej przypominają styl hakerski, ale był bardzo szybki.

Ludzie w top 10 używanych: 1) Java 2) C# i 3) C++ (Żaden inny język programowania w top 10!). Jedynym innym językiem programowania, który zdobył dobre wyniki, był chyba Ruby.

Do następnego konkursu wybrany język programowania prawdopodobnie będzie haskell. Z jednej przyczyny łatwiej jest znaleźć 2 członków drużyny dla programu haskell niż dla programowania R. A maksymalnie 3 osoby mogą tworzyć zespół.

Mój idealny scenariusz byłby bardzo lekką strukturą, w której mogłem używać wielu języków programowania jednocześnie. W ten sposób główny kod może zostać napisany w haskell (do którego mogą dołączyć wszyscy członkowie zespołu). Niektóre specyficzne funkcje można zaprogramować w języku R lub w języku Mathematica, a nawet w innym języku programowania (np. Python/sage).

To brzmi trochę przesadnie. Ale myślę, że byłoby to bardzo przydatne. Podobnie jak funkcja, która ma macierz jako parametr i zwraca macierz. Następnie ta praca ramowa generuje automatycznie usługę RESTful z kodu R, więc mógłbym wywołać funkcję R z dowolnego języka programowania. Macierz jest przekazywana jako dane JSON (lub inna serializacja). Ok, ale to nie na temat ...

Więc wreszcie niektóre wnioski w postaci listy pocisku:

  • nie przynoszą jedzenie. nie masz czasu na jedzenie, a potem jest bogaty bufet, potem czas jest czynnikiem ograniczającym czas!
  • jeśli NIE programu R dla życia, nie używać R
  • wygląd konkursach, gdzie jest więcej czasu (minimum hourss 3-4!)
  • w sumie, koncepcję konkursu jest wspaniały! Zarówno dla uczestników, jak i sponsorów.

WIELKIE DZIĘKI pomocy "Iteratorowi" na jego stanowisko !!

+0

Powodzenia w konkursie. Wygraj jeden dla R. :) – Iterator

+3

Przykro mi to mówić, ale twoje pytanie nie pasuje do formatu wyjaśnionego w [faq] (http://stackoverflow.com/faq). W przyszłości podziel pytanie na wiele pytań, które będą podlegały odpowiedzialności jeden po drugim. I powodzenia dla ciebie. –

+0

Zgadzam się z Jorisem. Co więcej, możesz uzyskać bardziej odpowiednie odpowiedzi, zamieszczając przykładowe pytania. Osobiście nie użyłbym R, jeśli problemy są bardzo matematyczne - jeśli system algebry komputerowej jest lepiej dopasowany, użyj go. (Np. Mathematica lub jej alternatywy open source.) – Iterator

Odpowiedz

24

Zamierzam odpowiedzieć na powiązane, ale inne pytanie. Bez urazy, ale twoje oryginalne sugestie nie wydają się bardzo mądre w przypadku konkursu programistycznego. Znaczna część czasu spędzonego w takich kontekstach polega na opracowywaniu odpowiedzi i debugowaniu (lub, lepiej, unikaniu potrzeby debugowania).

Zamiast tego odpowiem na to pytanie: "Jakie są kluczowe zasoby w R, które są przydatne do szybkiego prototypowania, ze szczególnym uwzględnieniem możliwości szybkiego znalezienia zasobów, szybkiego debugowania i możliwości zbadania danych szybko?Jeśli trzeba użyć numeryczne metody optymalizacji i systemy algebry, co należy zbadać „

Oto moje odpowiedzi:

  1. Install RStudio lub ewentualnie Revolution Analytics R, w zależności od tego, który interfejs wydaje się bardziej stosowne Oba są dobre, pierwszy ma bardzo gładki interfejs graficzny, ten drugi ma bardziej intensywny interfejs, z większymi możliwościami zarządzania kodem Oba mają kilka fajnych właściwości nad "społecznością" R, jeśli chodzi o możliwość wyszukiwania informacji i nawigowania po nich. szybko uzyskać pomoc biblioteczną:
  2. Zapoznaj się z example(), dowiedz się, gdzie można uzyskać winiety i samouczki (z paczki na stronach CRAN) i krótko przejrzyj demo().
  3. Użyj biblioteki sos i wzorca findFn.
  4. Zobacz widoki zadań na CRAN - upewnij się, że wiesz o narzędziach do obliczeń o wysokiej wydajności (jeśli to ma być powiązane) i narzędziach do optymalizacji - dość często trzeba użyć jakiegoś rozwiązania, i jest a task view for that.
  5. Jeśli twój kod działa powoli podczas prototypowania lub konkurencji, musisz uruchomić Rprof(). Najpierw weź to dla spinu. Możesz także skorzystać z pakietu compiler, jeśli Twój kod zawiera wiele iteracji. W skrócie: Nie chcesz czekać na komputerze. Możesz także spojrzeć na foreach i doSMP lub doMC, jeśli możesz przekazać pracę różnym rdzeniom. Aby zebrać wyniki, zapoznaj się z plyr i metodami takimi jak ldply, a także standardowymi funkcjami *apply, takimi jak lapply i apply; Kolejną dobrą rzeczą jest rapply. (Jeśli masz dużo rzeczy do przetwarzania i zajmuje trochę czasu, spójrz na mclapply lub .parallel argumentem dla funkcji plyr.)
  6. na przepełnienie stosu: przeglądanie JD Long's questions - wiele z tego, co można odkryć, że nie wiem, wolę zapytał go, zanim pomyślałeś o tym. I tam już jest odpowiedź.
  7. Utwórz dla siebie kilka małych szablonów kodu. Funkcje główne, dzięki którym nie musisz się uczyć w pośpiechu. Dowiedz się, jak debugować i przechodzić przez nie, używając debug() i browser().
  8. Jeśli trzeba liczyć rzeczy, nauczyć się korzystać z pakietu hash (podobny do Perl i Python tabelach hash) i nauczyć się korzystać z digest na klucze, które są zbyt długie, aby były wykorzystywane do hash (patrz this question o referencje)
  9. Jeśli będziesz potrzebował kreślić rzeczy, przygotuj podstawowe wykresy przykładowe, używając albo plot lub ggplot2, wraz z hist, boxplot i kilkoma innymi. Jeśli nie wiesz już, ggplot2, odłóż to, ale powinieneś się z tym zapoznać. Jeśli używasz dużej ilości danych, upewnij się, że znasz hexbin. Jeśli będziesz musiał wchodzić w interakcje z danymi, poznaj iplots i interesujące narzędzia, takie jak iplot, ihist i równoległe wykresy współrzędnych (ipcp).
  10. Upewnij się, że wiesz, jak korzystać z list, ramek danych i macierzy, w tym z indeksowania, wyszukiwań wpisów na podstawie indeksów (wierszy, kolumn). (Ponownie, należy sprawdzić plyr w celu przekształcenia i działania na niektórych z tych obiektów.)
  11. Zapoznaj się z data.table() - jest wyjątkowo skuteczny dla wielu rzeczy, które możesz zrobić z ramkami danych i macierzami.
  12. Jeśli potrzebujesz matematyki symbolicznej, upewnij się, że znasz pakiety, lub uzyskaj inne samodzielne narzędzie do symbolicznej matematyki. Ryacas to jeden pakiet, który wydaje się przydatny.
  13. Pobierz plik PDF z literą R w skrócie, aby szybko wyszukać przydatne metody. Inaczej, zdobądź samą książkę. Różne inne książki, takie jak Venables & Ripley, książka kucharska R i inne mogą być przydatne, w zależności od twojego doświadczenia.
  14. Jeśli opanowałeś już dobrego edytora (np. Emacs) lub IDE (np. Eclipse), trzymaj się go i szukaj powiązań z R. W przeciwnym razie prosty, od razu możesz zacząć używać Notepad ++. Możliwość wyboru bloku jest bardzo przydatną właściwością w edytorze. Możliwość przeszukiwania całej hierarchii katalogów przykładów kodu jest kolejną przydatną funkcją.
  15. Jeśli potrzebujesz czegoś, co wymaga danych z bazy danych, możesz chcieć poznać numery RSQLite i sqldf, które mogą nie być odpowiednie dla konkurencji matematycznej.
  16. Otwórz kilka instancji R, aby można było wypróbować różne rzeczy. :) [To jest naprawdę poważne: dzięki uruchomieniu wielu wystąpień można nieco uniknąć opóźnień związanych z sekwencyjnym testowaniem, oczekiwaniem na wyniki, a następnie debugowaniem wyników.]
5

Do (2), można po prostu zrobić:

sindeg <- function(x) sin(x*pi/180) 
+0

dzięki za rozwiązanie! – mrsteve

8

Dla (1), można zrobić coś jak

f <- function(..., body) 
{ 
    dots <- substitute(...) 
    body <- substitute(body) 
    f <- function() 
    formals(f) <- dots 
    body(f) <- body 
    environment(f) <- parent.env(environment()) 
    f 
} 

który pozwala pisać, np g <- f(x, y, body=x+y) ale jestem nie wiem, jak daleko to cię czeka.

+0

Fajnie, ale z pewnością nie warto, na 2 uderzenia klawiszem. – Karl

Powiązane problemy