Fondo
Todos ustedes son comerciantes de una empresa de acciones un poco menos confiable. Todos ustedes son parte de un grupo de comerciantes que se enfocan solo en una acción específica.
Cada hora, cada operador tiene la oportunidad de comprar acciones X o vender acciones X. Hay 50 horas por ronda y 3 rondas por competencia. ¡Al final de todas las rondas, el operador con el valor promedio más alto gana un viaje a Jamaica!
Jugabilidad
Hay 3 rondas de 50 turnos cada una.
Cada operador comienza la ronda con $ 5000 y un número aleatorio de acciones entre 20 y 30 acciones. El precio de las acciones comienza en un número aleatorio entre 10 y 150.
Cada turno, cada operador puede comprar cualquier cantidad de acciones que pueda pagar o vender cualquier cantidad de acciones que posea actualmente, cada una por el precio actual por acción.
El precio por acción aumenta en un número aleatorio entre 1 y 5 por cada acción comprada y disminuye en un valor aleatorio entre 2 y 6 por cada acción vendida. El precio mínimo es de $ 1.
Es importante tener en cuenta que todos los comerciantes procesan sus transacciones al mismo tiempo, lo que significa que cualquier comerciante que compre / venda acciones no afectará el precio hasta el próximo turno.
El jugador con el valor promedio más alto al final de las 3 rondas gana. El valor se determina tomando la cantidad de dinero sobrante al final de la ronda y sumando el número de acciones que posee el comerciante * precio de mercado de cierre.
Argumentos
Su programa se volverá a ejecutar al comienzo de cada turno, recibiendo el precio de mercado actual, la cantidad actual de dinero del comerciante y la cantidad de acciones que posee ese comerciante.
Ex:
120 5000 0
Salida
Su programa de operador debe generar una carta correspondiente a la acción que le gustaría realizar, seguida de la cantidad.
Ex:
B10 //Buy 10 shares
o
S3 //Sell 3 shares
El comerciante también tiene la opción de no hacer nada en ese turno. Eso se puede lograr generando una W o cualquier otro comando que no sea 'B> amnt <' o 'S> amnt <'
Envíos
Su programa estará dentro de un directorio 'players /> su nombre de programa <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Proporcione su código junto con un argumento de línea de comando para ejecutarlo desde dentro del directorio 'players'. Por ejemplo, el trader Test1 podría ejecutarse conjava -cp "Test1" Test1
Reglas Adicionales
Adelante, disparate EmoWolf, Idc.
No te metas con nada fuera de tu directorio BotNameFolder, siéntete libre de crear archivos allí para obtener información persistente durante rondas / turnos.
No cree programas intencionalmente para bloquear la simulación.
Aceptaré múltiples entradas por usuario, siempre que las entradas actúen como entidades separadas (sin información privilegiada).
Tabla de clasificación
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Intentaré actualizar la tabla de clasificación al menos una vez al día
Controlador
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;
}
}
Compile esto java Controller.java
y ejecútelo desde un directorio que contenga un directorio como el siguiente:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
El archivo config
debería verse así:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
El primer número es el número de rondas, el segundo número es turnos por ronda, seguido de los comandos para ejecutar a cada jugador.
Reemplazar espacios con símbolos! ('Y')
~ Avísame si puedo mejorar la redacción de esta publicación, ¡y feliz negociación!