배경
당신은 평판이 좋은 주식 회사보다 약간 적은 거래자입니다. 귀하는 모두 하나의 특정 주식에만 집중하는 거래자 그룹의 일부입니다.
매 시간 각 거래자는 X 주식을 매수하거나 X 주식을 매도 할 수 있습니다. 라운드 당 50 시간, 경기당 3 라운드가 있습니다. 모든 라운드가 끝나면 평균값이 가장 높은 트레이더가 자메이카로 여행을 이깁니다!
게임 플레이
각각 50 회전의 3 라운드가 있습니다.
각 트레이더는 $ 5000과 20에서 30 주 사이의 임의의 주식으로 라운드를 시작합니다 . 주가는 10에서 150 사이의 난수로 시작합니다.
각 거래자는 매 주마다 현재 보유하고있는 주식의 수량을 매수하거나 현재 보유하고있는 주식의 수를 매수할 수 있습니다.
주당 가격은 구입 한 각 주식에 대해 1에서 5 사이의 난수만큼 증가하고 판매 된 각 주식에 대해 2에서 6 사이의 임의의 값만큼 감소합니다. 최소 가격은 $ 1입니다.
모든 트레이더는 동시에 거래를 처리한다는 점에 유의해야합니다. 즉, 트레이더의 매수 / 매도 주식은 다음 차례까지 가격에 영향을 미치지 않습니다.
3 라운드 종료시 평균값이 가장 높은 플레이어가 승리합니다. 가격은 라운드가 끝날 때 남은 금액을 가져와 상인이 소유 한 주식의 수를 추가하여 결정됩니다.
인수
귀하의 프로그램은 현재 시장 가격, 상인의 현재 금액 및 해당 상인이 소유 한 주식의 수를받는 각 턴이 시작될 때마다 재실행됩니다.
전의:
120 5000 0
산출
거래자 프로그램은 수행하고자하는 조치에 해당하는 문자와 수량을 출력해야합니다.
전의:
B10 //Buy 10 shares
또는
S3 //Sell 3 shares
상인은 또한 그 어떤 것도하지 않는 옵션을 가지고 있습니다. 이는 W 또는 'B> amnt <'또는 'S> amnt <'가 아닌 다른 명령을 출력하여 수행 할 수 있습니다.
제출물
프로그램은 'players /> 프로그램 이름 <'디렉토리에 있습니다.
+-- players
| +-- BotNameFolder
| +-- BotProgram
'players'디렉토리에서 코드를 실행하려면 명령 줄 인수와 함께 코드를 제공하십시오. 예를 들어 Test1 트레이더는java -cp "Test1" Test1
추가 규칙
계속해서 EmoWolf, Idc를 쏴라.
BotNameFolder 디렉토리 외부의 항목을 엉망으로 만들지 않고 라운드 / 턴 내내 지속적인 정보를 위해 파일을 자유롭게 만들 수 있습니다.
의도적으로 시뮬레이션을 중단시키는 프로그램을 만들지 마십시오.
항목이 별도 엔티티로 작동하는 한 사용자 당 여러 항목을 허용합니다 (내부자 거래 없음).
리더 보드
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
최소한 하루에 한 번 리더 보드를 업데이트하려고합니다.
제어 장치
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;
}
}
이것을 컴파일 java Controller.java
하고 아래와 같은 디렉토리를 포함하는 디렉토리에서 실행하십시오.
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
파일 config
은 다음과 같아야합니다.
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
첫 번째 숫자는 라운드 수이고, 두 번째 숫자는 라운드 당 회전이며, 각 플레이어를 실행하는 명령이 이어집니다.
앰퍼샌드로 공백을 교체하십시오! ( '&')
~이 게시물의 문구를 개선하고 행복한 거래를 할 수 있는지 알려주세요!