Hintergrund
Sie sind alle Händler für eine etwas weniger als seriöse Aktiengesellschaft. Sie alle gehören zu einer Gruppe von Händlern, die sich nur auf eine bestimmte Aktie konzentrieren.
Jeder Händler hat stündlich die Möglichkeit, X Aktien zu kaufen oder X Aktien zu verkaufen. Es gibt 50 Stunden pro Runde und 3 Runden pro Wettbewerb. Am Ende aller Runden gewinnt der Trader mit dem höchsten Durchschnittswert eine Reise nach Jamaika!
Gameplay
Es gibt 3 Runden à 50 Runden.
Jeder Händler beginnt die Runde mit 5000 $ und einer zufälligen Anzahl von Aktien zwischen 20 und 30 Aktien. Der Kurs der Aktien beginnt bei einer Zufallszahl zwischen 10 und 150.
In jeder Runde kann jeder Händler eine beliebige Anzahl von Aktien kaufen, die er sich leisten kann, oder eine beliebige Anzahl von Aktien verkaufen, die er derzeit hält, jeweils zum aktuellen Preis pro Aktie.
Der Preis pro Aktie erhöht sich um eine Zufallszahl zwischen 1 und 5 für jede gekaufte Aktie und verringert sich um einen Zufallswert zwischen 2 und 6 für jede verkaufte Aktie. Der Mindestpreis beträgt 1 US-Dollar.
Es ist wichtig zu beachten, dass alle Händler ihre Transaktionen zur gleichen Zeit abwickeln, was bedeutet, dass jeder Händler, der Aktien kauft / verkauft, den Preis erst in der nächsten Runde beeinflusst.
Der Spieler mit dem höchsten Durchschnittswert am Ende der 3 Runden gewinnt. Der Wert wird bestimmt, indem der am Ende der Runde verbleibende Geldbetrag addiert wird und die Anzahl der Aktien addiert wird, die sich im Besitz des Händlers befinden.
Argumente
Ihr Programm wird zu Beginn jeder Runde erneut ausgeführt und erhält den aktuellen Marktpreis, den aktuellen Geldbetrag des Händlers und die Anzahl der Aktien, die dieser Händler besitzt.
Ex:
120 5000 0
Ausgabe
Ihr Händlerprogramm muss einen Brief ausgeben, der der Aktion entspricht, die es ausführen möchte, gefolgt von der Menge.
Ex:
B10 //Buy 10 shares
oder
S3 //Sell 3 shares
Der Händler hat auch die Möglichkeit, in dieser Runde nichts zu tun. Dies kann erreicht werden, indem ein W oder ein anderer Befehl ausgegeben wird, der nicht 'B> amnt <' oder 'S> amnt <' ist.
Einreichungen
Ihr Programm befindet sich in einem Verzeichnis "players /> your program name <":
+-- players
| +-- BotNameFolder
| +-- BotProgram
Bitte geben Sie Ihren Code zusammen mit einem Befehlszeilenargument an, um ihn im Verzeichnis "players" auszuführen. Zum Beispiel könnte der Test1-Händler mit ausgeführt werdenjava -cp "Test1" Test1
Zusätzliche Regeln
Mach weiter, erschieß dich selbst EmoWolf, Idc.
Sie dürfen nichts außerhalb Ihres BotNameFolder-Verzeichnisses ändern. Sie können jedoch auch Dateien darin erstellen, um über Runden / Runden hinweg beständige Informationen zu erhalten.
Erstellen Sie keine Programme, um die Simulation zum Absturz zu bringen.
Ich akzeptiere mehrere Einträge pro Benutzer, solange die Einträge als separate Einheiten fungieren (kein Insiderhandel).
Bestenliste
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Ich werde versuchen, die Bestenliste mindestens einmal am Tag zu aktualisieren
Regler
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Random;
public class Controller {
public static BigInteger marketValue = BigInteger.valueOf(100);
public static BigInteger newValue = BigInteger.valueOf(100);
public static final char BUY = 'B';
public static final char SELL = 'S';
public static final int MARKET_INDEX = 1;
public static final int MONEY_INDEX = 2;
public static final int SHARE_INDEX = 3;
public static int numRunning = 0;
public static final int MAX_RUNNING = 10;
public static void main(String[] args){
try {
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream("resources/config")));
int numRounds = Integer.parseInt(br1.readLine());
int turnsPerRound = Integer.parseInt(br1.readLine());
//Create the array of players
List<String> players = new LinkedList<String>();
String line1 = null;
while((line1 = br1.readLine()) != null){
players.add(line1);
}
BigInteger[] totalVals = new BigInteger[players.size()];
for(int i = 0; i < totalVals.length; i++){
totalVals[i] = BigInteger.valueOf(0);
}
br1.close();
//Begin processing
for(int round = 0; round < numRounds; round++){
//Create players' shares and currency array
Map<String,BigInteger[]> vals = new HashMap<String, BigInteger[]>();
for(int i = 0; i < players.size(); i++){
vals.put(players.get(i), new BigInteger[]{BigInteger.valueOf(5000), BigInteger.valueOf(getRandInt(20,30))});
}
marketValue = BigInteger.valueOf(getRandInt(10,150));
newValue = marketValue;
for(int turn = 0; turn < turnsPerRound; turn++){
marketValue = newValue;
Queue<Object[]> processQueue = new LinkedList<Object[]>();
for(String playerKey : vals.keySet()){
BigInteger[] valSet = vals.get(playerKey);
String[] pkParts = playerKey.split("&");
String[] parts = new String[pkParts.length + 3];
for(int i = 0; i < pkParts.length; i++){
parts[i] = pkParts[i];
}
parts[pkParts.length] = marketValue + "";
parts[pkParts.length + 1] = valSet[0] + "";
parts[pkParts.length + 2] = valSet[1] + "";
processQueue.add(new Object[]{playerKey, parts});
}
while(!processQueue.isEmpty() || numRunning > 0){
if(numRunning < MAX_RUNNING && !processQueue.isEmpty()){
numRunning++;
Object[] o = processQueue.poll();
String pKey = (String)(o[0]);
String[] p = (String[])(o[1]);
try {
Process proc = new ProcessBuilder(p).directory(new File("resources/players").getAbsoluteFile()).start();
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = br.readLine();
br.close();
switch(line.charAt(0)){
case BUY :
BigInteger numShares = new BigInteger(line.substring(1).trim());
if(numShares.multiply(marketValue).compareTo(vals.get(pKey)[0]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].subtract(numShares.multiply(marketValue));
tempVals[1] = tempVals[1].add(numShares);
vals.put(pKey, tempVals);
newValue = newValue.add(numShares.multiply(BigInteger.valueOf(getRandInt(0,2))));
if(newValue.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) >= 1){
newValue = BigInteger.valueOf(Integer.MAX_VALUE - 1);
}
}
break;
case SELL:
BigInteger shares = new BigInteger(line.substring(1).trim());
if(shares.compareTo(vals.get(pKey)[1]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].add(shares.multiply(marketValue));
tempVals[1] = tempVals[1].subtract(shares);
vals.put(pKey, tempVals);
newValue = newValue.subtract(shares.multiply(BigInteger.valueOf(getRandInt(5,10))));
if(newValue.compareTo(BigInteger.valueOf(1)) <= -1){
newValue = BigInteger.valueOf(1);
}
}
break;
}
} catch (Exception e) {
System.err.println("[" + pKey + "] threw error:");
e.printStackTrace();
} finally{
numRunning--;
}
}else{
try{
Thread.sleep(50);
continue;
}catch(InterruptedException e){
continue;
}
}
}
System.out.println("Turn " + turn + " over: " + marketValue);
}
System.out.println("End of round market value is: " + marketValue);
int count = 0;
for(String player : vals.keySet()){
totalVals[count] = totalVals[count].add(vals.get(player)[0].add(vals.get(player)[1].multiply(marketValue)));
count++;
}
newValue = BigInteger.valueOf(100);
}
for(int i = 0; i < players.size(); i++){
System.out.println("[" + players.get(i) + "]:$" + (totalVals[i].divide(BigInteger.valueOf(numRounds))));
}
} catch (Exception e) {
System.err.println("An exception occured while running the controller.");
e.printStackTrace();
}
}
public static Random r = new Random(new Date().getTime());
public static int getRandInt(int min, int max){
return r.nextInt(max - min) + min;
}
}
Kompilieren Sie dies mit java Controller.java
und führen Sie es aus einem Verzeichnis aus, das ein Verzeichnis wie das folgende enthält:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Die Datei config
sollte ungefähr so aussehen:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Die erste Zahl ist die Anzahl der Runden, die zweite Zahl ist die Anzahl der Runden, gefolgt von den Befehlen zum Ausführen der einzelnen Spieler.
Ersetzen Sie Leerzeichen durch Et-Zeichen! ('&')
~ Lass es mich wissen, wenn ich den Wortlaut dieses Beitrags überhaupt verbessern kann und viel Spaß beim Handeln!