Latar Belakang
Anda semua adalah pedagang untuk perusahaan saham yang sedikit kurang dari yang memiliki reputasi baik. Anda semua adalah bagian dari kelompok pedagang yang hanya fokus pada satu saham tertentu.
Setiap jam, setiap pedagang memiliki kesempatan untuk membeli saham X atau menjual saham X. Ada 50 jam per putaran dan 3 putaran per kompetisi. Pada akhir dari semua putaran, trader dengan nilai rata-rata tertinggi memenangkan perjalanan ke Jamaika!
Gameplay
Ada 3 putaran 50 putaran masing-masing.
Setiap trader memulai putaran dengan $ 5000 dan Sejumlah saham acak antara 20 dan 30 saham. Harga saham dimulai pada angka acak antara 10 dan 150.
Setiap belokan, setiap pedagang dapat Membeli sejumlah saham yang mereka mampu atau Jual sejumlah saham yang mereka miliki, masing-masing dengan harga saat ini per saham.
Harga per saham meningkat dengan angka acak antara 1 dan 5 untuk setiap saham yang dibeli dan berkurang dengan nilai acak antara 2 dan 6 untuk setiap saham yang dijual. Harga minimum adalah $ 1.
Penting untuk dicatat bahwa semua pedagang memproses transaksi mereka pada saat yang sama, artinya setiap pedagang yang membeli / menjual saham tidak akan mempengaruhi harga hingga belokan berikutnya.
Pemain dengan nilai rata-rata tertinggi di akhir 3 putaran menang. Nilai ditentukan dengan mengambil jumlah uang yang tersisa pada akhir putaran dan menambahkan jumlah saham yang dimiliki oleh pedagang * menutup harga pasar.
Argumen
Program Anda akan dijalankan kembali pada setiap awal giliran menerima harga pasar saat ini, jumlah uang pedagang saat ini dan jumlah saham yang dimiliki oleh pedagang itu.
Ex:
120 5000 0
Keluaran
Program pedagang Anda harus mengeluarkan surat yang sesuai dengan tindakan yang ingin diambil diikuti oleh kuantitas.
Ex:
B10 //Buy 10 shares
atau
S3 //Sell 3 shares
Pedagang juga memiliki opsi untuk tidak melakukan apa pun yang berubah. Itu bisa dicapai dengan mengeluarkan W atau perintah lain yang bukan 'B> amnt <' atau 'S> amnt <'
Pengajuan
Program Anda akan berada di dalam direktori 'players /> nama program Anda <':
+-- players
| +-- BotNameFolder
| +-- BotProgram
Harap berikan kode Anda bersama dengan argumen baris perintah untuk menjalankannya dari dalam direktori 'pemain'. Misalnya pedagang Test1 dapat dijalankanjava -cp "Test1" Test1
Aturan tambahan
Silakan, tembak dirimu EmoWolf, Idc.
Tidak main-main dengan apa pun di luar direktori BotNameFolder Anda, jangan ragu untuk membuat file di sana untuk info persisten sepanjang putaran / putaran.
Jangan sengaja membuat program untuk menghentikan simulasi.
Saya akan menerima beberapa entri per pengguna, selama entri tersebut bertindak sebagai entitas yang terpisah (Tidak ada perdagangan orang dalam).
Papan peringkat
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Saya akan mencoba memperbarui leaderboard setidaknya sekali sehari
Pengendali
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;
}
}
Kompilasi ini dengan java Controller.java
dan jalankan dari direktori yang berisi direktori seperti di bawah ini:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
File config
akan terlihat seperti ini:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Angka pertama adalah jumlah putaran, angka kedua adalah putaran per putaran, diikuti oleh perintah untuk menjalankan setiap pemain.
Ganti spasi dengan ampersand! ('&')
~ Beri tahu saya jika saya dapat meningkatkan kata-kata dari posting ini sama sekali, dan selamat berdagang!