Każdy gracz ma numer. Czy twój może być najdalszy od nich wszystkich?
Wymagania
Napisz nazwaną funkcję Java, Python 2 lub Ruby, choose()
która akceptuje trzy argumenty:
- liczba całkowita - liczba już ukończonych rund
- liczba całkowita - liczba graczy
- tablica ciągów - wyniki każdej poprzedniej rundy
- każdy ciąg jest oddzieloną spacjami listą liczb całkowitych, posortowaną od najniższej do najwyższej
Na przykład choose(2, 4, ["4 93 93 174", "1 84 234 555"])
oznacza:
- były już dwie rundy (jest to trzecia runda)
- w sumie jest czterech graczy
- w pierwszej rundzie wybrano 4, 93, 93, 174
- w drugiej rundzie wybrano 1, 84, 234, 555
Musisz zwrócić liczbę całkowitą od 1 do 999 (włącznie).
Dla każdego innego gracza twój wynik jest pierwiastkiem kwadratowym odległości między twoim numerem a jego. Twój wynik w rundzie jest sumą wszystkich tych wyników.
Rozegranych zostanie 100 rund. Najwyższy łączny wynik wygrywa!
Zasady
- Twój kod nie może wykorzystywać żadnych wejść / wyjść, w tym konsoli, plików, sieci itp.
- Nie możesz ingerować w program kontroli lub innych graczy.
- Programy, które wyglądają, jakby naruszały powyższe zasady, zostaną wykluczone.
- Każde wywołanie funkcji powinno zająć na moim komputerze mniej niż pięć sekund (Intel Core i5 2450M z 8 GB pamięci RAM).
- Jeśli program zgłosi wyjątek lub zwróci nieprawidłową wartość, zostanie potraktowany tak, jakby zwrócił 1.
- Każdy użytkownik może zgłosić maksymalnie jeden program.
Różne
- Program sterujący znajduje się na GitHub .
- Istnieją trzy wbudowane odtwarzacze. Można je znaleźć w tej odpowiedzi .
- Zwycięzca zostanie wybrany 28 stycznia.
Tabela liderów
Zwycięzcą zostaje Konserwator .
Wyróżnienie dla Gustava , gracza o najwyższym wyniku z niestałą strategią.
- Konserwator - 36226
- Wysoka - 36115
- FloorHugger - 35880
- NumberOne - 35791
- Overestimator - 35791
- Gustav - 35484
- Historyk - 35201
- Próbnik - 34960
- Inkrementator - 34351
- JumpRightIn - 34074
- Vickrey - 34020
- Nastolatek - 33907
- Randu - 33891
- Sztangista - 33682
- Pośrednik - 33647
- BounceInwards - 33529
- Nasty Matematyk - 33292
- Zworka - 33244
- Copycat - 33049
Pełne wyniki można znaleźć tutaj . (Zalecam wyłączenie zawijania tekstu).
king-of-the-hill
Ypnypn
źródło
źródło
Odpowiedzi:
Python, konserwator
Ponieważ każdy wyjątek wyrzuca 1, pozostaje jak najdalej od niego. Robi fortunę kosztem słabych.
Ciekawostka: myślałem o jej ulepszeniu, ale nie mogłem znaleźć lepszego sposobu niż tylko ukrywanie się w kącie.
źródło
Numer jeden, Java
Nazwa wyjaśnia to całkowicie.
źródło
Python, AncientHistorian
Mocno wierzy, że przyszłość będzie dokładnie taka, jak przeszłość, ale wierzy, że ostatnia runda jest zbyt niedawna, by być histiryną, więc po prostu przechodzi przez 1 - 999 i wybiera to, co byłoby najlepsze w poprzednich rundach oprócz ostatniej. Pierwsza 2 runda zwraca 500.
źródło
Python, Vickrey
Tworzy listę często granych liczb, zakłada, że wszyscy inni będą grać optymalnie i wybiera drugi najlepszy wybór na tej liście.
Na przykład, jeśli najczęściej występującymi liczbami są
[1, 990, 999]
, to Vickrey wstawia optymalną grę 200, aby dać[1, 200, 990, 999]
, a następnie wybiera najlepszą opcję dla nowej tablicy (czyli 556).źródło
Java, Overestimator
Jak sama nazwa wskazuje, ten program zakłada, że wszystkie inne programy będą próbowały grać „dobrze”, wybierając najlepszą odpowiedź na podstawie ostatniej rundy - więc ten „przeważnik” zawsze wybiera najgorszą możliwą pozycję na podstawie poprzedniej rundy.
źródło
Java - sztangista
Pętle od 1 do 999, aby dowiedzieć się, który byłby najlepszy dla każdej rundy. Waży je zgodnie z aktualnością (ostatnie rundy mają większą wagę) i zwraca swoje najlepsze ogólne przypuszczenie. Mam nadzieję, że jeśli w późniejszej rundzie pojawią się wzory, będzie w stanie to odebrać.
Edycja: teraz z + Inf% większą rekurencją! Brak możliwości zapisywania / zapisywania / sprawdzania tego, co wybrałeś w poprzednich rundach, jest utrapieniem. Biorąc pod uwagę własne dane wejściowe, nie możesz się doczekać, kiedy spróbujesz dowiedzieć się, co zrobią inni . Obliczmy to! To teraz powróci, aby dowiedzieć się, co wybrał w poprzedniej rundzie i zignoruje to podczas obliczania następnego ruchu.
Zauważ, że tak naprawdę ignoruje tylko swój własny wkład z ostatniej tury, ale ponieważ ta jest ważona najwyżej, wydaje się, że działa dobrze. Można to naprawić przy odrobinie pracy, ale poczekam, aż tablica wyników sprawdzi, czy jest potrzebna.
źródło
Ruby, naśladowca
Po prostu zwraca dowolną liczbę wygraną ostatnim razem.
źródło
Ruby, JumpRightIn
To chyba najprostsza strategia. Znajduje największą lukę w ostatniej rundzie i wybiera liczbę dokładnie na środku tej luki.
źródło
Gustav (Python 2)
Jest to dość prosta strategia meta, bezwstydnie skopiowana z jednej z moich starych odpowiedzi w podobnym wyzwaniu KotH. Bierze pod uwagę kilka prostych strategii, wygląda, jak by się sprawdziły we wszystkich poprzednich rundach, a następnie podąża za najlepszą w następnej rundzie.
Teraz zdaję sobie sprawę, że algorytm wciąż ma pewne wady. Np. Może „gonić się”, ponieważ nie odróżnia własnych ruchów od ruchów przeciwników. Jednak na razie zostawię to w ten sposób.
źródło
Python, Randu
Liczby wybrane przez najbardziej nieprzemyślany generator liczb losowych w historii .
źródło
Wbudowane są następujące trzy programy.
Wysoki (rubinowy)
Incrementer (Java)
FloorHugger (Python)
źródło
Python, Sampler
Z listy miejsc wybierz tę, która jest najbardziej oddalona od ostatnio używanych liczb, ignorując poprzednią kolejkę.
źródło
Java, BounceInwards
Począwszy od 1, stopniowo zbliża się do 500, odbijając się między wyższą i niższą opcją.
źródło
NastyMathematician (Java)
Sprawdza dwie ostatnie rundy (jeśli najlepszymi liczbami były 70 i 80, wyświetli 90). Jest to paskudne, ponieważ stara się zdobyć jak najwięcej liczb, aby wygrać z przeciwnikami.
źródło
Python - nie chcę wymyślić imienia ...
Jeśli średnia liczb wybranych w poprzednich rundach jest mniejsza niż 500, wybiera 999. W przeciwnym razie wybiera 1.
źródło
Python, Middleman (na podstawie konserwatora autorstwa @clabacchio)
Po tym, jak zauważyłem, że górna krawędź osiąga wysokie wyniki (i przewyższa dolną krawędź), zastanawiałem się, czy może być coś gorszego niż po prostu złapanie się na środku.
źródło
Sweter (Rubinowy)
Przełącza między dolnym, środkowym i górnym. (5500,995)
źródło