Na giełdzie chodzi o szybkość wiedzy. W przeciwieństwie do poprzednich wyzwań, bieżąca cena akcji nie jest losowa: jest ona określana przez osoby grające w grę. Jeśli potrafisz zidentyfikować akcje po zaniżonych cenach przed kimkolwiek innym, oznacza to, że sam napisałeś program do zarabiania pieniędzy.
Cena odnosi się do tego, za ile ludzie handlują akcjami, a Wartość odnosi się do kwoty, na jaką zapasy są warte na koniec gry.
Każdy gracz zaczyna od 1000 każdego stada i 0 względnej wartości netto. Każdy czas ma tajną wartość, a twój wynik na koniec gry wynosi(stockValue for each ownedStock) + netWorth
. Twoja wartość netto może być ujemna. W grze N-player jest N akcji.
Kroki:
Gra wykonuje następujące kroki:
- Otrzymujesz tajną wartość pojedynczej akcji.
- Składasz ofertę sprzedaży akcji X z Y za $ Z
- Wszyscy gracze otrzymują oferty i każdy może wybrać jedną z nich
- Wszyscy gracze są informowani o zaakceptowanych ofertach
- Wróć do kroku 2
Każdy z kroków podano szczegółowo poniżej:
void secretValue(int stockType, int value)
:- Wartość, której się uczysz, nie jest ujawniana żadnemu innemu graczowi.
- Wartość jest pomiędzy
0
i1000
- Niskie wartości są bardziej podobne do występowania niż wysokie (rozkład równomierny w kwadracie)
Offer makeOffer(List<Stock> currentStock)
- Możesz wrócić,
null
aby nie składać oferty.
- Możesz wrócić,
Offer acceptOffer(List<Offer> offers)
- Możesz wrócić,
null
aby zaakceptować żadną z nich - Jeśli nie ma dostępnych ofert, nie zostanie to wywołane
- Jeśli zaakceptujesz, twoja wartość netto spadnie o $ Z (może spaść) i otrzymasz X Y akcji. Przeciwnie dzieje się ze sprzedawcą.
- Jeśli zaakceptujesz ofertę, wymiana nastąpi natychmiast, a oferta zostanie usunięta, więc dodatkowi gracze nie będą mogli jej zaakceptować.
- Możesz wrócić,
void acceptedOffers(List<Offer> offers)
- Obejmuje również zaakceptowane oferty
Zmienne statyczne lub zapisywanie do plików jest niedozwolone. (Brak trwałych danych z gry do gry) Nie poważni rywale są dozwolone.
Interfejsy:
public final class Stock {
public Stock(int stockType, int amount);
public int getType();
public int getAmount();
public Stock minus(Stock other);
public Stock plus(Stock other);
public Stock minus(int amount);
public Stock plus(int amount);
public Stock setAmount(int amount);
}
public class Offer {
public Offer(Stock offer, int payment);
public Stock getOffer();
public int getPayment();
}
Zgłoszenia inne niż Java:
- Wszystkie połączenia składa się z dwóch linii: Pierwsza linia jest funkcja miano:
SecretValue
,MakeOffer
,AcceptOffer
,AcceptedOffers
,SetRandom
, a drugi wiersz zawierający aktualne dane. - Zapasy są sformatowane przy użyciu
:
separatora:stockType:stockAmount
. - Oferty są formatowane za pomocą
@
separatora:offer@price
- Listy są formatowane za pomocą
;
separatora SecretValue
jest sformatowany za pomocą:
separatora:stockType:value
RandomSeed
służy do deterministycznego przesłania. Jeśli przesłanie odbywa się losowo, użyj wartości całkowitej przekazanej jako ziarno!- Wszystkie wywołania funkcji wymagają odpowiedzi. Jeśli odpowiedź brzmi
null
lubvoid
, zwróć pusty ciąg. - Podaj
command.txt
argument, który podaje argumenty wiersza poleceń, aby uruchomić przesyłanie
Punktacja
Gry składające się z 1000 tur będą rozgrywane wiele razy. Gracze będą punktowani zgodnie z systemem ELO i parowani z graczami o podobnych poziomach umiejętności. Gracz z najwyższym końcowym wynikiem ELO wygrywa! (Zmodyfikowałem system, aby w każdej grze wyniki ELO były aktualizowane dla każdej pary graczy)
Kontroler zawiera autodownloader, więc proszę rozpocząć składanie z nagłówkiem: Name, Language
. Jeśli przesłanie nie odbywa się w Javie, każdy blok kodu powinien zaczynać się od nazwy pliku. (z wyłączeniem pliku poleceń, który powinien być pierwszym blokiem w poście)
Bieganie
Istnieją 2 sposoby uruchomienia tego projektu:
Pobierz kod źródłowy, skompiluj i uruchom. Możesz znaleźć źródło na Github . Biegać
git clone --recursive https://github.com/nathanmerrill/StockExchange.git
Pobierz plik wykonywalny JAR. Zgłoszenia należy umieścić w bieżącym katalogu roboczym w
/submissions
folderze. Możesz pobrać tylko plik JAR , tylko zgłoszenia lub oba
Przekaż, run
aby uruchomić projekt (opcja domyślna), lub przekaż, download
aby pobrać wszystkie przesłane dotychczas odpowiedzi na to pytanie.
Tablica wyników
1. 1308.1220497323848 Cheater
2. 1242.0333695640356 InsideTrader
3. 1158.3662658295411 UncleScrooge
4. 1113.8344000358493 BlackMarket
5. 1051.8370015258993 DartMonkey
6. 983.0545446731494 WarGamer
7. 939.457423938002 Spammer
8. 901.4372529538886 DumbBot
9. 859.0519326039137 ShutUpAndTakeMyMoney
10. 852.9448222849587 VincentKasuga
11. 718.2112067329083 Profiteer
źródło
Odpowiedzi:
Cheater, Java
Próbuje sprzedać nic za pieniądze.
źródło
WarGamer, Java
Po pobieżnym sprawdzeniu zasad zdecydowałem, że głównym zwycięskim ruchem nie jest gra. Każdy, kto oferuje sprzedaż akcji, prawdopodobnie zna cenę i będzie czerpał zyski ze sprzedaży. Można go przełączać, dzięki czemu „żartuje” z ofertą sprzedaży akcji na Integer.MAX_VALUE dolarów w nadziei, że się zamkną i zabiorą moje pieniądze.
źródło
ShutUpAndTakeMyMoney, Java
Akceptuje każdą ofertę.
źródło
DumbBot, Java
Użyj tego bota podczas tworzenia własnego. Oferuje swoje tajne akcje po obniżonej cenie.
źródło
python_starter, Python 3
Użyj tego jako punktu wyjścia dla wszelkich programów w języku Python (lub innym języku)
Akceptuje losową ofertę.
Plik poleceń:
Program:
źródło
Vincent Kasuga, Java
Nie jestem pewien, czy moja Java jest poprawna. Zapoznaj się.
Jak to działa
- jeśli jesteś właścicielem wszystkich akcji, możesz ustawić cenę akcji. Jesteś jedynym sprzedawcą. 1. Kup wszystkie zapasy. 2. Ustaw cenę wszystkich akcji, które będą super wysokie na ostatnim tiku. 3. ZYSK! - Zwykle nie jest to możliwe, ponieważ ...Jak to działa, v2
Bot nie przewiduje - wykorzystuje nieodłączną wadę w strukturze rynku!Do zrobienia
FAQ
P: Kim jest Vincent Kasuga?
Odp .: Kupił wszystkie cebule i kontrakty cebulowe w Stanach Zjednoczonych. (włóż je wszystkie do tajnego magazynu) Trzymaj przemysł na okupie - daj mi X milionów, albo ustawię niebotycznie cenę i wszyscy zbankrutują.
Ale nie poprzestał na tym.
Następnie potajemnie zwarł cebulowy ETF (zakład, że spadnie). Sprzedał wszystkie cebule jednocześnie, fizycznie dostarczając je na tysiące ciężarówek na giełdę. Torba na cebulę kosztuje mniej niż cebula. Znowu zarobił miliony. Krótko mówiąc, rzeka Hudson zalała cebulę.
On jest prawdziwą osobą.
Kod
„Osacziłem Złoty Rynek, panie Bond!”
źródło
for (offer: offers)
->for (Offer offer: offers)
corneredStockType == null
nie jest również ważny.int
nie może byćnull
.Spamer, Java
Spamuj rynek z naprawdę tanimi zapasami i kupuj zapasy tylko wtedy, gdy cena jest mniejsza niż 20. Gdy liczba zapasów spadnie do 1, spróbuje coś kupić.
źródło
DartMonkey, Java
(niekonkurencyjny: to nie wygra, a ja już mam inną odpowiedź)
Dart małpa lubi rzucać rzeczami ... a obok niego jest duży stos spiczastych patyków. Widzi trochę papieru na ścianie. Bam! Bam! Bam! W mgnieniu oka Dart Monkey rzucił 80 rzutkami! Połowa strzałek jest czerwona, a druga połowa niebieska, a na nich są losowe liczby! Dart małpa widzi komputer ... typy rzutki małpa w liczbach. Dart małpa lubi cyfry. Dart małpa zarabia pieniądze ze swoich rzutek ...
Z całą powagą DartMonkey inicjuje tablicę liczb całkowitych o długości dwa razy większej niż liczba zapasów. Przechowuje jeden numer dla ilości towaru, który chce kupić / sprzedać, i jeden numer dla ceny towaru. Następnie na przemian sprzedaje akcje z tablicy i przyjmuje oferty zgodnie z tablicą. Jeśli nie ma akcji z tablicy, nic nie zaoferuje, a jeśli nie otrzyma żadnych ofert z tablicy, niczego nie zaakceptuje.
Ta odpowiedź została zainspirowana przez @TheNumberOne, który wspomniał na czacie małpy lotki
źródło
InsideTrader, Java
InsideTrader tylko się rozejrzał i zobaczył, że wszyscy starają się być kreatywni. Ale zrobił coś kreatywnego: rób to, czego oczekujesz.
Ten bot kupuje, kiedy jest „tego wart”, ponieważ „pożyczył” kilka „wewnętrznych dokumentów”, aby „pokierować” „decyzjami inwestycyjnymi”.
Do zrobienia i jak to działa w kodzie. ;)
Kod"
źródło
Error on line 50: modifier private not allowed here Error on line 54: modifier private not allowed here
. Po prostu usunę te klasy i przedłużęPlayer
WallStreet, Kotlin
Zaczyna się od sprzedaży wysokiej i kupowania niskiej i stopniowo przechodzi do tego, co według niego naprawdę jest cena. Możesz także użyć tego jako szablonu do tworzenia własnych w kotlin.
Uwaga: jest tutaj błąd, którego nie mogę wiarygodnie odtworzyć. Jeśli mój program ulega awarii lub występują problemy, proszę pinguj mnie na czacie i połącz pastę z treścią
submissions/other/WallStreet/log.txt
źródło
command.txt
nie potrzebuje nazwy pliku. Niezły post!$
działa tylko ze zmienną nazwą.${}
wykonuje dowolny kod. Zasadniczo działa tak czy inaczej i wolę bez nawiasów klamrowych.command.txt
:kotlinc
->kotlinc.bat
ikotlin
->kotlin.bat
UncleScrooge, Java
Sprzedawaj akcje po naprawdę wysokiej cenie i kupuj tylko wtedy, gdy cena jest mniejsza niż 100.
źródło
Profiteer, Java
Profiteer ma w sobie pieniądze i zawsze liczy monety. Ostrożnie ocenia, ile pieniędzy ma. Następnie kupi tajne akcje, jeśli są mniejsze niż wartość, lub kupi tanie akcje. Pamięta także, ile zapłacił za wszystko i zawsze składa oferty powyżej ceny akcji. Co więcej, będzie składał wyższe oferty, jeśli będzie miał mniej pieniędzy.
Uwaga: Myślę, że zrobiłem to poprawnie, ale jeśli @NathanMerrill nie miałby nic przeciwko przeglądaniu mojego kodu w poszukiwaniu błędów, byłoby świetnie
źródło
MaxBot, Java
Ten bot próbuje zarobić jak najwięcej na każdej transakcji. Podczas sprzedaży cena nieznanego towaru wynosi 300 USD, przy zakupie 250 USD.
źródło
BlackMarket, Java
Niewiele do powiedzenia na ten temat, ponieważ transakcje te będą ... poza tabelą, można powiedzieć.
źródło
NotQuiteABanksBestFriend, Python 3
Command.txt:
Zawsze stara się sprzedawać ukryte zapasy za więcej niż jest to warte.
źródło