Contexte
Vous êtes tous des commerçants pour une société d’achat peu réputée. Vous faites tous partie d'un groupe de commerçants qui se concentrent uniquement sur un stock spécifique.
Chaque heure, chaque opérateur a la possibilité d'acheter X actions ou de vendre X actions. Il y a 50 heures par tour et 3 tours par compétition. À la fin de tous les tours, le commerçant avec la valeur moyenne la plus élevée gagne un voyage en Jamaïque!
Gameplay
Il y a 3 tours de 50 tours chacun.
Chaque opérateur commence le tour avec 5000 $ et un nombre aléatoire d’actions entre 20 et 30 actions. Le prix des actions commence à un nombre aléatoire compris entre 10 et 150.
Chaque tour, chaque opérateur peut acheter n'importe quel nombre d'actions qu'il peut se permettre ou vendre n'importe quel nombre d'actions qu'il détient actuellement, chacun pour le prix actuel par action.
Le prix par action augmente d'un nombre aléatoire entre 1 et 5 pour chaque action achetée et diminue d'une valeur aléatoire entre 2 et 6 pour chaque action vendue. Le prix minimum est de 1 $.
Il est important de noter que tous les traders traitent leurs transactions en même temps, ce qui signifie que tout trader achetant / vendant des actions n'aura aucune incidence sur le prix jusqu'au prochain tour.
Le joueur avec la valeur moyenne la plus élevée à la fin des 3 tours gagne. La valeur est déterminée en prenant le montant restant à la fin du tour et en ajoutant le nombre d’actions possédées par le trader *.
Arguments
Votre programme sera relancé au début de chaque tour et recevra le prix du marché actuel, le montant actuel de l'argent du trader et le nombre d'actions qu'il possède.
Ex:
120 5000 0
Sortie
Votre programme de commerçant doit générer une lettre correspondant à l'action qu'il souhaite entreprendre, suivie de la quantité.
Ex:
B10 //Buy 10 shares
ou
S3 //Sell 3 shares
Le commerçant a également la possibilité de ne rien faire à son tour. Cela peut être accompli en émettant un W ou toute autre commande qui n'est pas 'B> amnt <' ou 'S> amnt <'
Les soumissions
Votre programme sera dans un répertoire 'players /> votre nom de programme <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Veuillez fournir votre code avec un argument de ligne de commande pour l'exécuter à partir du répertoire "players". Par exemple, le commerçant Test1 pourrait être exécuté avecjava -cp "Test1" Test1
Règles additionnelles
Allez-y, tirez vous-même EmoWolf, Idc.
Pas de problème avec quoi que ce soit en dehors de votre répertoire BotNameFolder, n'hésitez pas à créer des fichiers là-bas pour des informations persistantes tout au long des tours.
Ne créez pas intentionnellement de programmes pour bloquer la simulation.
J'accepterai plusieurs entrées par utilisateur, à condition qu'elles agissent comme des entités distinctes (pas de délit d'initié).
Classement
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Je vais essayer de mettre à jour le classement au moins une fois par jour
Manette
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;
}
}
Compilez ceci avec java Controller.java
et lancez-le depuis un répertoire contenant un répertoire comme ci-dessous:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Le fichier config
devrait ressembler à ceci:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Le premier nombre est le nombre de tours, le second nombre est le nombre de tours par tour, suivi des commandes pour exécuter chaque joueur.
Remplacez les espaces par des esperluettes! ('&')
~ Faites-moi savoir si je peux améliorer la formulation de ce post du tout, et bon négoce!