Borsa Borsası Borsa ~ Revize [kapalı]


35

Arka fon

Hepiniz saygın bir hisse senedi şirketine göre biraz daha düşük bir süre için yatırımcılarsınız. Hepiniz sadece belirli bir hisse senedine odaklanan bir grup yatırımcının parçasısınız.

Her tüccarın her saatinde X hisse senedi alma veya X hisse senedi satma şansı vardır. Tur başına 50 saat ve yarışma başına 3 tur vardır. Tüm turların sonunda, en yüksek ortalama değere sahip olan trader, Jamaika'ya bir gezi kazandı!

Oynanış

Her biri 50 tur olan 3 tur vardır.

Her tüccar raund 5000 $ ile başlar ve 20 ile 30 hisse arasında rastgele sayıda hisse. Hisselerin fiyatı 10 ile 150 arasında rastgele bir sayıyla başlar.

Her yatırımcı, her bir hisse başına mevcut fiyat karşılığında, alabilecekleri herhangi bir hisse satın alabilir veya satın alabilecekleri hisse sayısını satabilir.

Hisse başına fiyat, satın alınan her hisse için 1 ile 5 arasında rasgele bir sayı artar ve satılan her hisse için 2 ile 6 arasında rasgele bir değerle azalır. Minimum fiyat 1 $.

Tüm trader'ların işlemlerini aynı anda işleme koyduğunu belirtmek önemlidir; bu, herhangi bir trader alım / satım hissesinin bir sonraki döneme kadar fiyatı etkilemeyeceği anlamına gelir.

3 turun sonunda ortalama değeri en yüksek olan oyuncu kazanır. Değer, turun sonunda kalan para miktarı alınarak ve işlemcinin * kapanış piyasa fiyatına ait hisse sayısı eklenerek belirlenir.

Argümanlar

Programınız, mevcut piyasa fiyatını, işlemcinin mevcut para miktarını ve bu işlemcinin sahip olduğu hisse sayısını alan her bir dönüşte yeniden başlatılacaktır.

Ör:

120 5000 0

Çıktı

Yatırımcı programınız, takip etmek istediği harekete karşılık gelen ve ardından miktarın yazdığı bir harf vermelidir.

Ör:

B10 //Buy 10 shares

veya

S3 //Sell 3 shares

Tüccar ayrıca dönüşen hiçbir şey yapmama seçeneğine de sahiptir. Bu, bir W veya 'B> amnt <' veya 'S> amnt <' olmayan başka bir komutun çıkarılmasıyla gerçekleştirilebilir.

gönderimler

Programınız bir 'oynatıcılar /> program adınızın <' dizini içinde olacak:

+-- players
|   +-- BotNameFolder
|       +-- BotProgram   

Lütfen kodunuzu 'oyuncular' dizini içinden çalıştırmak için bir komut satırı argümanı ile birlikte sağlayın. Örneğin Test1 tüccar ile çalıştırılabilirjava -cp "Test1" Test1

Ek Kurallar

Devam et, kendini vur EmoWolf, Idc.

BotNameFolder dizininizin dışındaki hiçbir şeyle uğraşmak yok, ancak tur / dönüşlerde sürekli bilgi almak için dosya oluşturmaktan çekinmeyin.

Kasıtlı olarak simülasyonu çökertecek programlar oluşturmayın.

Girişler ayrı varlıklar gibi davrandığı sürece kullanıcı başına birden fazla giriş kabul edeceğim (İçeriden bilgi alışverişi yok).

Liderler Sıralaması

[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453

Afiş günde en az bir kez güncellemeye çalışacağım

kontrolör

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;
    }
}

Bunu ile derleyin java Controller.javave aşağıdaki gibi bir dizini içeren bir dizinden çalıştırın:

+-- resources
|   +-- config
|   +-- players
|       +-- Player1Folder
|           +-- Player1Program
|       +-- Player2Folder
|           +-- Player2Program

Dosya configşunun gibi görünmelidir:

3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader

İlk sayı tur sayısı, ikinci sayı tur başına tur ve ardından her oyuncuyu çalıştırmak için verilen komutlar.

Boşlukları ve işaretleriyle değiştirin! ( '&')

~ Bu yazının anlatımını hiç geliştirebilirsem ve mutlu bir ticaret yapabilir miyim?


4
Meşgul bir pazardaki uzun vadeli eğilimin, payın negatif bir değere sahip olduğunu göreceksiniz.
Peter Taylor

6
Kontrol ünitenizi Github gibi bir şeye koyabilir ve evde test edebilmemiz için bir link ekleyebilir misiniz?
Peter Taylor

6
Büyük tahtaya baktığımda, oyunun şu anda kusurlu olduğunu düşünüyorum. Örneğin, $ 14 / sh'dan başlayın, 357'yi satın alın (kendi 357, bankada 0 $). Rasgele sayıyı seçin (3). Fiyat 3 * 357 artarak 1085 $ / s'e yükseldi. Bir sonraki turda. 357 hissenin tümünü satabilirsiniz (kendi bankasında 0, 387.345 dolar) Rasgele sayıyı seçin (3). Fiyat 3 * 357'ye düşerek 14 $ / s'e düştü. Bir sonraki turda. İki turdan sonra, fiyat değişmedi ve bankanız 77 kat arttı (benzer ancak daha az çarpıcı sonuçlar diğer rasgele değişkenlerle başlayabilir). Daha makul değerler için her hisse yerine her işlem için değişiklik yapmayı öneriyorum .

4
Ya da sadece gerçek bir sipariş kitabı oluşturun.
'.

3
Niçin rasgele sayıda hisse ile başlamak?
Averroes

Yanıtlar:


18

Her zaman uykuda olan ve bir şey almayı veya satmayı unutan 'hayalperest' i sunuyorum. Diğer oyuncuların net bir zararı olacağını umuyor. Python kodu:

if __name__ == "__main__":
    print "W"

python daydreamer\daydreamer.py 120 5000 0İstediğiniz herhangi bir değer veya ile çalıştırın .

Daha sonra daha ciddi bir cevap vereceğim, bu sadece topu yuvarlamak için :)


3
Bunun işe yarayacağını sanmıyorum - izini girmeniz gerekiyor.
isaacg,

6
Uzun vadede hisse senedi fiyatlarının düşme eğiliminde olduğu göz önüne alındığında, ticaret değil mükemmel bir strateji olabilir.

5
Tuhaf bir oyun: tek kazanan hamle oynamak değil. Güzel bir satranç oyununa ne dersin?
Tim S.

13

DayTrader

21/20 / 20'de yapılan kural değişikliği için güncellendi, burada oyuncular artık 20-30 hisse ile başlıyor.

Mümkün olduğunca satın alır, sonra da mümkün olduğunca satar.

Felsefe

Umarız aşağıdaki model tekrar tekrar kendini tekrar eder. Bu desene sadık kalarak, buna da katkıda bulunduğumuzu unutmayın.

  • Herkes sadece bir tur satın alabilir veya bekletebilir. Değer sadece artabilir, o yüzden satın alırız.
  • Herkes ikinci turda daha fazla satın alabilir, alabilir veya satabilir. Çok fazla oyuncunun ikinci turda satın almasını beklemiyoruz, bu yüzden satıyoruz.

Desen başında kristal berraklığında. Değer edecek bir tur sonra artar. İkinci raunttan sonra düşmelidir. Bunun ötesinde, çıkıntılar bulanıklaşıyor. Piyasa dengede olmadan önce, ilk turlarda iyi bir performans göstermesini bekliyorum.

import java.math.BigInteger;

/**
 * Submission for http://codegolf.stackexchange.com/q/36515/18487
 * @author Rainbolt
 */
public class DayTrader {

    /**
     * @param args the command line arguments containing the current 
     * market value, our current money, and our current shares
     */
    public static void main(String[] args) {
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);

        // If we have less than or equal to 30 shares, buy as much as possible
        if (myShares.compareTo(new BigInteger("30")) <= 0) {
            System.out.println("B" + myMoney.divide(marketValue).toString());
        // Otherwise, sell as much as possible
        } else {
            System.out.println("S" + myShares.toString());
        }
    }

}

İle derleyin javac DayTrader.java. İle koş java -cp "DayTrader" DayTrader.


1
Yay java! Koşmamı kolaylaştırıyor.
spocot

6
Botunuz pazar tam sayılar için maksimum sayının ötesine geçti, ben de BigIntegers'ı koda uyguladım. Herkesin kod int'leri kullanılan bu yana, hemen hemen herkesin bot daydreamer için cept çöktü
spocot

@spocot BigInteger kullanmak için uygulamamı değiştirdim. Umarım bu yardımcı olur.
Rainbolt

5
Bunun kurallardaki doğal bir problem olduğunu düşünüyorum. Bir tüccar 140 hisse alsa pazarı kendi başına kontrol edebilir. İki turda, her biri için 10'ar tane hisse satın alabilir ve her birini 140'ına satabilir ve bunun% 1300'ünü kazanmasına neden olabilir (kimsenin tersi olmadığını varsayar). Bu, 5000 * 13 ^ 25 gibi bir şeye yükselecektir, ki bu büyük bir yoldur.
Optokopper

2
@spocot Ben sadece ping yapmak istedim çünkü son kural değişikliğinden sonra gönderimimi değiştirdim.
Rainbolt

9

Walt Disney - Python 3

Walt, hisseleri dibe vuruncaya kadar bekler ve parasının izin verdiği kadar satın alır. Sonra fiyat yükseldiğinde hepsini satar.

Disney'in Wall Street Crash'i ile “hayatta kaldığı” stratejisine dayanarak. Maalesef programım tema parkları kuramıyor ... Eğer sadece ...

Çalıştırmak:

python3 waltdisney.py

Kod:

from sys import argv
import os

price=int(argv[1])
money=int(argv[2])
share=int(argv[3])

if os.path.exists('./buyingprice.txt'):
    f = open('buyingprice.txt', 'r')
    buyingprice=int(f.read())
    f.close()
else:
    buyingprice=0

if share > 0:
    if price > buyingprice*10:
        print('S'+str(share))
    else:
        print('W')
elif money > 0:
    if buyingprice==0:
        print('B10')
        m=open('buyingprice.txt', 'w')
        m.write(str(price))
        m.close()
    elif price <= buyingprice:
        print('B'+str(int(money/price)))
        g=open('buyingprice.txt', 'w')
        g.write(str(price))
        g.close()
    else:
        print('W')

İlk baskı hattınızda kapanış parantezi eksik.
supersam654

@ supersam654 Oh evet, teşekkürler
Beta Decay

Walt Disney'in gerçekte bu stratejiyi kullandığı iddiası için bir kaynağa işaret edebilir misiniz? Borsada Walt Disney Co adında bir firma olduğu göz önüne alındığında arama yapmak zordur ve Walt'ın wikipedia sayfası bundan bahsetmez.
Michael,


@Michael Başlangıçta tarih öğretmenimden bilgi aldım, kaynak biraz zayıfsa özür dilerim.
Beta

8

mehmetçik

Sadece sahip olduğu şeyleri bilir ama piyasadaki her şeyi riske atmaya kararlı. Alabilirse satın alacak. Yapamazsa, sahip olduğu her şeyi satar, böylece bir sonraki dönüş yapacaktır. (Bu, DayTrader gibi aşırı uçlarla iyi çalışır, ancak değeri arttığını düşündüğünde değer düşerse otomatik olarak düzeltilir.)

import java.math.BigInteger;

public class Tommy {
    public static void main(String[] args) {
        BigInteger Value = new BigInteger(args[0]);
        BigInteger Money = new BigInteger(args[1]);
        BigInteger Shares = new BigInteger(args[2]);

       if (Money.compareTo(Value)<1) {
           System.out.print("S" + Shares.toString());
       } else {
           System.out.print("B" + Money.divide(Value).toString());
       }
    }

}

Golfscript

Bu aynı koddur, fakat eğer tercih ederse. BigInteger olayına ihtiyaç duyulması halinde java'yı yazdım. Kolay olanı kullanın.

2$2$>{@@;;"S"\}{;\/"B"\} if

Gelecekte referans olması için, GS'deki tüm sayılar büyük tamsayılardır.
Peter Taylor

Sanırım endişelenmeden orijinali gönderebilirdim! İyi haberler.
kaine

Başlangıçta bu daytrader kopyası olduğunu düşünmüş, ama sonra davranış sırf koşulların aynı olduğunu ve onlar fark yorumunu olabilir diğer koşullarda sapmak. Birini kırdıysam özür dilerim. Birlikte zengin olalım!
Rainbolt

@Rainbolt GolfScript yazdım, göndermeden önce sizinkini arayanları okudum ve Java versiyonunu yazmak için kodunuzu kullandım. Çekirdek kısım bir kopya değildir (ya da göndermedim), ancak bu gönüllü pazarlarda aynıdır. Küçülmedim ama eğer çok yakın olduğunu düşünüyorsanız diskalifiye edilmesini isteyeceğim (ama kod kalır, onu yazmanın tamamı olan bir şey öğrendim). Önceliğiniz olduğuna göre, bu durumda bile rahatsız olmazdım. Not Depremler neredeyse sizinkiyle aynıdır ancak farklıdır (dosyaya kaydeder).
kaine

@kaine Hayır, silmeyin. Dediğim gibi, kopya olduklarını düşündüm , ama kesinlikle değil . Davranışta sadece şartlar nedeniyle benzerler. Sizlerin ne yaptığını tam olarak anlamadan önce, kopya olduklarını iddia eden bir yorum göndermek yanlıştı.
Rainbolt

6

SatınAlHold - C

#include <stdio.h>
#include <stdlib.h>

/* BuyAndHold
 * Code revised from OptoKopper's WaitForCrash.c
 */
int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);

    if (money >= share_price) {
        printf("B%lld\n", money / share_price);
    } else {
        printf("W\n");
    }

    return 0;
}

İle derleyin: gcc buyandhold.c -o buyandhold

./Buyandhold FİYAT PARA PAYI PAYLARI ile çalıştırın.


1
Haha Birinin DayTrader'ı bir BuyAndHold ile tamamlayacağını umuyordum. Aferin!
Rainbolt

6

Alfred Pennyworth - Python 2

Bir gece devriyeye çıkarken, Alfred haberi olmadan bir hisse senedi alım satım programı oluşturmaya çalıştı. Benden saklayabileceğini düşündü ama ben buldum ve ne yaptığını anladım. Çünkü ben batman'ım. Şimdi ona bir ders vermek için yarışmaya girmeye karar verdim.

Para Alfred’in hiçbir nesnesi değil, çünkü ben gerçekten zenginim ama hala ticareti konusunda akıllı. Hisse dışı kaldığında, piyasa fiyatından bağımsız olarak alabileceği kadar satın alıyor. Ardından, piyasa fiyatı, satın alındığı fiyattan daha yüksek olduğu her seferde 10 (veya tüm kalan) hisse satışı yapar.

import argparse

parser = argparse.ArgumentParser(description="This is a private matter, Master Bruce. Learn how to make your own bed and I will tell you.")
parser.add_argument("Stuff", type=int, nargs='+', help="You don't need to know, Master Bruce.")

args=parser.parse_args()
vals=[]
for x in args:
    vals.append(x)

a=vals[0]
b=vals[1]
c=vals[2]

if c==0:
    x=1
    while x*a<b:
        x+=1
    print "B"+str(x)
    with open("lastval.txt", w) as f:
        f.write(a)

else:
    lastval=next(open("lastval.txt"))
    if a>lastval:print "S10" if c>10 else "S"+str(c)
    else:print 'W'

Çalıştır: python GoAwayMasterBruce.py <args>


AttributeError: 'ArgumentParser' object has no attribute 'parseargs'Python'un hangi sürümüne ihtiyacı var?
Peter Taylor,

Benim hatam, alt çizgi var. parse_args()
RageCage

5

NaiveBot

NaiveBot tüm bu "borsa" hooplah'ında yeni. Sadece fiyat yükseldiğinde alması gerektiğini ve fiyatın düşmesi durumunda satması gerektiğini varsayıyor. Ama o sap değil, kolunu kandırıyor! Sahip olduğu paranın yarısını ancak satın alıyor ve sahip olduğu paranın yarısını satıyor.

NaiveBot'a giden otoyolun altındaki bir kutuda yaşamaya gerek yok!

<?php
$cur = array('price' => $argv[1], 'funds' => $argv[2], 'shares' => $argv[3]);

$cachefile = 'cache.json';
if( ! file_exists($cachefile) ) { $cache = array(); }
else { $cache = json_decode(file_get_contents($cachefile), true); }

// determine action
if( empty($cache) ) {
    $action = 'buy'; // always buy on first turn
} else if( $cur['price'] > $cache[count($cache)-1]['price'] ) {
    $action = 'buy';
} else if( $cur['price'] < $cache[count($cache)-1]['price'] ) {
    $action = 'sell';
} else {
    $action = 'hold';
}

// determine volume
if( $action == 'hold' ) {
    $volume = 0;
} else if( $action == 'buy' ) {
    // spend half my money on shares!
    $volume = floor(($cur['funds']/2)/$cur['price']);
} else if( $action == 'sell' ) {
    // sell half my shares!
    $volume = floor($cur['shares']/2);
}

// do a thing!
if( $action == 'hold' ) { echo 'W'; }
else if( $action == 'buy' ) { echo "B $volume"; }
else { echo "S $volume"; }
echo "\n";

$cache[] = $cur;
if( count($cache) == 50 ) { unlink($cachefile); } // wipe cache on last turn
else { file_put_contents($cachefile,json_encode($cache)); } // write cache

Çalıştır , geçerli klasöründe php Naivebot.php $1 $2 $3bir yapar cache.json.


5

Kar - Haskell

  1. Fiyat 1 / maxValue olana kadar bekleyin
  2. Her şeyi al / sat
  3. ????
  4. KAR !!!

import System.Environment (getArgs)

main = putStrLn . trade . map read =<< getArgs

trade :: [Integer] -> String
trade [p,m,s] -- not intended
  | p == 1 = "B" ++ (show m)
  | p == (fromIntegral $ (maxBound::Int) - 1) = "S" ++ (show s)
  | otherwise = "W"

İle derleyin ghc profit.hsve çalıştırın ./profit price money stock.

Yeterince verimli değilse, -O3muhtemelen overkill olmasına rağmen bayrak ekleyin : D


Düzenle:

"optimize edilmiş", şimdi fiyat eşit olduğunda her şeyi satıyor Integer.MAX_VALUE.


Neden olmasın main = putStrLn . trade . map read =<< getArgs? Daha az gürültülü
recursion.ninja

@ awashburn Çünkü monadlarla ilgili pek iyi okumamıştım;)
ThreeFx

Umarım yorumum yeni bir şey öğrenmenize yardımcı oldu!
recursion.ninja

@ThreeFx bunu yapmak için bir program var cabal install pointfree, şimdi herkes kahvaltıda monad yediğinizi düşünecek.
Sean D,

@SeanD Teşekkürler, bir göz
atacağım

4

WaitForCrash

EDIT: kavramdaki sabit hata

EDIT: şimdi uzun uzun int kullanarak

Bu benim ilk denemem. Gerçekten basit davranır ve ilk turda mı yoksa daha sonra mı olduğunu ayırt etmek için bir pay tutar. İlk turda hiçbir şey kaybedilmez, bu yüzden hisse satın alır. Hisse varsa onları satar. Sonunda hisse fiyatları 10'a düşerse, tekrar satın alacaktır.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);
    long long int shares_owned = strtoll(argv[3], NULL, 0);

    if(shares_owned > 1) {
        printf("S%lld\n", shares_owned - 1);
    } else if (shares_owned == 0 || share_price == 10) {
        printf("B%lld\n", money / share_price);
    } else {
        printf("W\n");
    }

    return 0;
}

ile derlemek: gcc waitforcrash.c -o waitforcrash

olarak koş ./waitforcrash PRICE MONEY SHARES


Umarım sakıncası yoksa BuyAndHold çözümünün temeli olarak kullanmak için kodunuzu kaydırdım. Uzun uzun girişli BTW,% d, uyarıları önlemek için% Ld olmalıdır (veya% lld mi? Bana da uyarı vermez).
Glenn Randers-Pehrson

Sorun değil. Evet kodumda% lld vardı, güncellemede onları unutmuş olmalı, Ty.
Optokopper

3

Earthquaker

Her şeyi satın almakla her şeyi satmak (ancak bir tane) arasında geçiş yapar. Gerçekten herkesi rahatsız ettiği kadar kazanmayı hedeflemiyor.

using System;
using System.IO;

namespace Earthquaker
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 3)
                return;

            int stockPrice = int.Parse(args[0]);
            int money = int.Parse(args[1]);
            int stocks = int.Parse(args[2]);

            bool shouldBuy = true;

            if (stocks != 0)
            {
                StreamReader sr = new StreamReader("brain.txt");
                if (sr.ReadLine() == "B")
                    shouldBuy = false;
                else
                    shouldBuy = true;
                sr.Close();
            }

            if (shouldBuy)
                Console.Write("B" + (money / stockPrice));
            else
                Console.Write("S" + (stocks - 1));

            StreamWriter sw = new StreamWriter("brain.txt", false);
            sw.Write(shouldBuy ? 'B' : 'S');
            sw.Close();
        }
    }
}

İle derleyin csc Earthquaker.cs. İle koş Earthquaker.


Net vardır System.IO.File.ReadAllTextve WriteAllText, böylece biraz izlemeyi geçmişini basitleştirebilirsiniz.
Peter Taylor

brain.txtDosyasını bulamazsa bu çöküyor .
Peter Taylor,

3

MonkeyTrader (JAVA'da)

Maymunların iyi bir tüccar olduğu söyleniyor. İspatı yapıyorum. "Al" ve "sat" arasındaki kararlar tamamen rastgeledir.

import java.math.BigInteger;
import java.util.Random;

public class MonkeyTrader {
    /**
     * @param args the command line arguments containing the current 
     * market value, our current money, and our current shares
     */
    public static void main(String[] args) {
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);
        Random random=new Random();

        switch (random.nextInt(2)) {
        case 0:
            System.out.println("B" + myMoney.divide(marketValue));
            break;
        case 1:
            System.out.println("S" + myShares);
            break;
        }
    }
}

3

IntelliTrader

1. rauntta eğer iyi bir fiyatsa, hisselerini satar: 80 $ veya daha fazla. Daha sonra fiyatı, sattığı son fiyattan aynı veya daha yüksekse satış yapar, fiyatı aynı son veya daha düşükse satın alır.

IntelliTrader.java

import java.io.*;
import java.math.BigInteger;
import java.util.Properties;

public class IntelliTrader {

    private static final String ROUND_NUM = "roundNum";
    private static final String LAST_BUY = "lastBuy";
    private static final String LAST_SELL = "lastSell";
    private static final String FILE = "IntelliTrader/memory.txt";

    private Properties memory;
    private int roundNum;

    private IntelliTrader(Properties memory) {
        this.memory = memory;
        roundNum = new Integer(memory.getProperty(ROUND_NUM, "0"));
    }

    public String evaluate(BigInteger market, BigInteger money, BigInteger shares) {
        String command = "W";
        if (roundNum == 0) {
            if (market.intValue() > 80) {
                command = sell(market, shares);
            } else {
                command = buy(market, money);
            }
        } else {
            if (market.compareTo(new BigInteger(memory.getProperty(LAST_SELL, "0"))) >= 0) {
                command = sell(market, shares);
            } else if (market.compareTo(new BigInteger(memory.getProperty(LAST_BUY, "999999999"))) <= 0) {
                command = buy(market, money);
            }
        }
        return command;
    }

    private String buy(BigInteger cost, BigInteger money) {
        memory.setProperty(LAST_BUY, cost.toString());
        return "B" + money.divide(cost).toString();
    }

    private String sell(BigInteger cost, BigInteger shares) {
        memory.setProperty(LAST_SELL, cost.toString());
        return "S"+shares.toString();
    }


    public static void main(String[] args) {    
        BigInteger marketValue = new BigInteger(args[0]);
        BigInteger myMoney = new BigInteger(args[1]);
        BigInteger myShares = new BigInteger(args[2]);

        Properties memory = new Properties();
        try {
            memory.load(new FileReader(FILE));
        } catch (IOException e) {
            //ignore, file probably doesn't exist yet
        }

        int roundNum = new Integer(memory.getProperty(ROUND_NUM, "0"));
        if (roundNum > 49) {
            roundNum = 0;
            memory.setProperty(ROUND_NUM, "0");
            memory.setProperty(LAST_BUY, "0");
            memory.setProperty(LAST_SELL, "0");
        }

        IntelliTrader it = new IntelliTrader(memory);
        String command = it.evaluate(marketValue, myMoney, myShares);
        System.out.println(command);

        roundNum++;
        memory.setProperty(ROUND_NUM, ""+roundNum);
        try {
            memory.store(new FileWriter(FILE), "IntelliTrader memory properties");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Javac IntelliTrader ile derleyin . Java -cp "IntelliTrader" IntelliTrader ile çalıştırın


Testlerimde bu ikinci en iyi tüccar gibi görünüyor.
Peter Taylor

2

theAnswerOfLifeIs42.py

Programım 42 numarayı seviyor

Kural basit: 42 hisse alabilirim veya 42 hisse satabilirim.

import sys
price, money, shares = [int(arg) for arg in sys.argv[1:]]

if money>42*price:
 print "B 42"
else:
 print "S 42"

2

LeesonLearnt v1.1 (Java, muhafazakar)

Kural değişikliği şimdi bazı paylarla başladığımız anlamına geldiğinden, artık garantili bir en iyi ilk hamle kalmadı, bu yüzden ilk dönüş için özel davayı kaldırarak bunu basitleştirdim.

import java.math.BigInteger;

public class LeesonLearnt {
    private static final BigInteger THRESHOLD = new BigInteger("100");

    public static void main(String[] args){
        BigInteger price = new BigInteger(args[0]);
        BigInteger capital = new BigInteger(args[1]);
        BigInteger shareholding = new BigInteger(args[2]);

        BigInteger affordable = capital.divide(price);

        // In the long run, the shares will probably lose all their value.
        // But if they're cheap, buying them will pump them and they can be sold at a profit.
        // The target amount of our value held in shares varies exponentially with their price.
        BigInteger targetShareholding = price.compareTo(THRESHOLD) > 0
            ? BigInteger.ZERO
            : affordable.add(shareholding).shiftRight(price.intValue() - 1);
        if (targetShareholding.compareTo(shareholding) <= 0) {
            System.out.println("S" + shareholding.subtract(targetShareholding));
        }
        else {
            BigInteger diff = targetShareholding.subtract(shareholding);
            System.out.println("B" + diff.min(affordable));
        }
    }
}

Olarak çağır

java -cp LeesonLearnt LeesonLearnt <price> <capital> <shareholding>

1

Dolar Maliyet Ortalama - Python 3

Bu strateji, sabit bir miktarda para (keyfi olarak 150'ye ayarlanmış, böylece muhtemelen sonuna kadar parasının çoğunu kullanacak şekilde) satın alarak dolar maliyetinin ortalamasını kullanmaya çalışır.

import sys
price, money, shares = [int(arg) for arg in sys.argv[1:]]
target_per_day = 150
buy = round(min(target_per_day, money) / price)
if buy * price > money:
    buy -= 1
if buy > 0:
    print("B" + str(buy))
else:
    print("W")

1

Nakit Kraldır - Python 2 veya 3

Bu adam borsa hakkında çok karamsar. Parasını yatağının altında güvende tutacağı parayı tutmayı tercih ederdi.

import sys
shares = int(sys.argv[3])
if shares > 0:
    print("S" + str(shares))
else:
    print("W")

1

Yavaş ve istikrarlı

Parası olduğu sürece, 165 dolar değerinde hisse satın alır. Aksi halde, tüm hisselerini daha fazla para elde etmek, daha fazla hisse satın almak için satar. 50'nci turda tüm hisseleri satmayı garanti ediyor, çünkü sonunda para istiyoruz.

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Paths;

public class SlowAndSteady{
    public static void main(String[] args) {
        BigInteger price = new BigInteger(args[0]);
        BigInteger cash= new BigInteger(args[1]);
        long shares= Long.parseLong(args[2]);
        BigInteger number = new BigInteger("165");
        String count = "0";


        try {
            count = new String(Files.readAllBytes(Paths.get("counter.txt")));
        } catch (IOException e) {

        }

        int c = Integer.parseInt(count)+1;

        if (c >= 50)
        {
            System.out.println("S" + shares);
            c=0;
        }

        else if(cash.compareTo(number) > 0)     System.out.println("B" + (number.divide(price)));

        else System.out.println("S" + shares);


        try {
            Writer wr = new FileWriter("counter.txt");
            wr.write(Integer.toString(c));
            wr.close();
        } catch (IOException e) {
        }
   }
}

Java SlowAndSteady.java ile derleyin. Java -cp "SlowAndSteady" SlowAndSteady ile çalıştırın. Sayaç mermi arasında sıfırlanmalıdır, ancak dosya silinirse de çalışır.


1

BuyHighSellLow

Piyasa geçmişini takip eder ve fiyatı düşük olduğunda satın alır ve yüksek olduğunda satar.

import sys

storage = 'BuyHighSellLow'
turn = 0
turns = 50
max_start_price = 150
limit = 0.25

price = int(sys.argv[1])
money = int(sys.argv[2])
shares = int(sys.argv[3])

# Calculate average price
with open(storage+'/history', mode='a') as f:
            pass # Create file if it doesn't exist
with open(storage+'/history', mode='r') as f:
    values = list((int(line) for line in f))
    turn = len(values) + 1
    if turn > turns: turn = 1
    if turn == 1:
            average = max_start_price + 1
            turn = 1
    else:
            average = sum((value / turn for value in values))

# Buy low and sell high
if price < average:
    print('B' + str(int(limit * money / price)))
elif price > average:
    print('S' + str(int(limit * shares)))
else:
    print('W')

# Save history
if turn == 1: mode='w'
else: mode = 'a'
with open(storage+'/history', mode=mode) as f:
    print(price, file=f)

Çalıştır:

python3 BuyHighSellLow/buyhighselllow.py

1

Zaman Doğru - Python 3

Sıkıldım ve başka bir katılımcı yazdım ...

Bu genç girişimci hayatını saate kadar yaşıyor. Zamanı gelince karar verir. Ayrıca sinir bozucu bir şekilde Fransızca bağlam dışını kullanıyor ...;)

Çalıştırmak:

python3 timeisright.py [arg1] [arg2] [arg3]

Kod:

import sys, time

price = int(sys.argv[1])
money = int(sys.argv[2])
shares = int(sys.argv[3])

lheure = int(time.time())

if lheure % 3 == 0:
    print('S'+str(int(shares/4)))
elif lheure % 3 == 1:
    print('B'+str(int(money/4*price)))
else:
    print('W')

1

Ol 'Timer - Fortran 77

Bu yaşlı adam, altmış yıl boyunca büro memuru olarak çalıştıktan sonra emekli aylığını boşa harcayacak. Bununla birlikte, yaşlanırken, oldukça kör oldu, bu yüzden sadece her bir tartışmanın ilk sayısını görebiliyordu, bu yüzden fiyatı tahmin ediyor. Ol 'Timer'ın biraz daha dikkatsiz olması dışında, yöntemi Walt'unkine benzer.

Fortran baskısındaki sorunlardan dolayı yardımcı olacak bir Python programı yazdım. Program verilen argümanları alır ve bunları Fortran programına aktarır. Ardından, Python programı çıktıyı beklenen formatta yeniden biçimlendirir.

Derleme:

gfortran oltimer.for -o oltimer.exe

Çalıştırmak:

python3 assistant.py [arg1] [arg2] [arg3]

Python Yardımcısı Kodu:

from subprocess import Popen, PIPE
import sys, re

ret = Popen('./oltimer.exe '+sys.argv[1]+' '+sys.argv[2]+' '+sys.argv[3], stdout=PIPE, shell=True).communicate()[0].decode('utf-8')
value=re.findall(r'\d+',ret)

if 'W' in ret:
     print('W')

elif 'B' in ret:
     print('B'+str(value[0]))

elif 'S' in ret:
     print('S'+str(value[0]))

FORTRAN Ana Kodu:

      PROGRAM OLTIMER
C DEFINE VARIABLES
          INTEGER :: PRICE
          INTEGER :: STOCK
          INTEGER :: MONEY
          INTEGER :: INTBUFFER
          CHARACTER :: BUFFER
C GET CMD ARGUMENTS & CONVERT TO INT
          CALL getarg(1, BUFFER)
          READ (BUFFER, '(i10)') PRICE
          CALL getarg(2, BUFFER)
          READ (BUFFER, '(i10)') MONEY
          CALL getarg(3, BUFFER)
          READ (BUFFER, '(i10)') STOCK
C EVALUATE SITUTATION AND MAKE DECISION
          IF (PRICE.LT.5) THEN
            IF (MONEY.GT.0) THEN
                INTBUFFER=(MONEY*50)/(5-PRICE)
                PRINT*,'B',INTBUFFER
            ELSE
                PRINT*,'W'
            END IF
          ELSE
            IF (PRICE.GT.9) THEN
                IF (STOCK.GT.0) THEN
                    INTBUFFER=STOCK/(PRICE-9)
                    PRINT*,'S',INTBUFFER
                ELSE
                    PRINT*,'W'
                END IF
            ELSE
                PRINT*,'W'
            END IF
          END IF      
      END PROGRAM

1
Yine de Python'a ihtiyacınız olduğunu ve Python'da başka cevapların olduğunu ancak Fortran'da hiçbirinin olmadığını dikkate alarak, her şeyi Python'da uygulamanın ve OP'nin kurması gereken derleyicilerin yükünü azaltmanın mantıklı olacağını düşünmüyor musunuz?
Peter Taylor

@Peter yapardım ama tamamen farklı bir dile sahip olmanın ve nasıl bir performans gösterdiğini öğrenmenin eğlenceli olacağını düşündüm.
Beta Çürüğü

0

Test1 Trader

public class Test1 {

    public static void main(String[] args){
        int marketValue = Integer.parseInt(args[0]);
        int myMoney = Integer.parseInt(args[1]);
        int myShares = Integer.parseInt(args[2]);

        //Buy 10 if we don't have any.
        if(myShares <= 0){
            System.out.println("B10");
        }else{
            System.out.println("S1");
        }
    }
}

İle derlemek javac Test1.javavadede ilejava -cp "Test1" Test1


0

Kirpi - python2.7

Bu çoğunlukla ismi ayırmak içindir.

from __future__ import print_function
from sys import argv

storage = 'prices.txt'
price,cash,shares = map(long, argv[1:])
turn = 1
buy = lambda x: print('B%d' % long(x))
sell = lambda x: print('S%d' % long(x))
cashtoshares = lambda c: long(c/price)
TURN,PRICE,CASH,SHARES=range(4)

try:   
    data = [map(long, line.split()) for line in open(storage)]
    if data:
        turn = data[-1][TURN] + 1
except IOError:
    pass
with open(storage, 'a') as pricelist:
    pricelist.write('%d %d %d %d\n' % (turn, price, cash, shares))

if turn == 1:
    buy(cashtoshares(cash)) # convert all cash into shares
elif price == 1:
    buy(cashtoshares(cash)) # cannot buy at a better deal
elif price < 10:
    buy(cashtoshares(cash/2))
elif shares < 10:
    buy(cashtoshares(cash/2))
else:
    sell(shares/2)

Olarak çalıştırmak

python hedgehog.py PRICE CASH SHARES

0

BuyAndSell - C

Benzer ama Tommy'nin kopyası değil. Panik alımını mümkün olduğu kadar satın almakla her şeyi satmak arasında geçiş yapıyor. BuyAndSell tüm hisseleri satarken, neredeyse bir hissesini elinde tutan bir Deprem kopyası. BuyAndSell satılacak hissesi yoksa ancak bir pay alacak kadar parası olmadığında işlem yapmaz.

/* BuyAndSell
 * Code revised from OptoKopper's WaitForCrash.c and my BuyAndHold.c
 * Alternates between buying as many shares as possible and selling everything
 * Run it as ./buyandsell PRICE MONEY SHARES
 */
int main(int argc, char *argv[]) {
    long long int share_price = strtoll(argv[1], NULL, 0);
    long long int money = strtoll(argv[2], NULL, 0);
    long long int shares = strtoll(argv[3], NULL, 0);

    if (money >= share_price) {
        printf("B%lld\n", money / share_price);
    } else {
        if (money == 0) {
            printf("S%lld\n", shares);
        } else {
            printf("W\n");
        }
    }

    return 0;
}

"Gcc buyandsell.c -o buyandsell" ile derleyin

"./Buyandsell FİYAT PARA PAYI PAYLARI olarak çalıştır


0

Gorge Soros

price = ARGV.shift
money = ARGV.shift
stock = ARGV.shift
if price*10<money
  puts "B10"
else
  puts "S#{stock}"
end

Piyasayı çökertmek için her şeyi satan yerine yavaş satın alır.

Çalıştır:Soros.rb price money stock


1
Açıkça soru metninde yazılıDo not intentionally create programs to crash the simulation.
Beta Decay

@ BetaDecay Ben denetleyici çökmesine çalışmayın demek istemedim. Piyasayı çökertmeye çalışmak oyunun bir parçası.
spocot

@spocot Ah, piyasayı çökertecek programlar oluşturmak istemediğinizi düşünmüştüm. Daha fazla kafa karışıklığını önlemek için farklı ifade etmelisiniz.
Beta Decay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.