愚かな株式市場


16

複数の人の投資データを含む文字列が与えられた場合、彼らが記録した利益/損失を調べてください。

文字列には、次のように大文字と小文字のみが含まれます。

AABaBbba

各文字は人を表します-大文字は購入を意味し、小文字は販売を意味します。彼らが投資している株の価格(CGLF)は50ドルから始まります。誰かが購入すると、価格は5%上がります。誰かが売った後、価格は5%下がります。参加した各人がどれだけのお金を稼いだ/失ったかを把握する必要があります。

ノート:

  • 文字列は常に有効で、最初に購入しないと販売できません。また、株式を買う人は誰でも最終的にそれを売るでしょう。
  • 計算は、少なくとも小数点以下6桁まで正確でなければなりません。ただし、最終的な回答は小数点以下2桁に丸める必要があります。

テストケース:

入力: AABaBbba

  • A:購入-$ 50
  • A:購入-$ 52.50
  • B:購入-$ 55.125
  • a:販売-$ 57.88125
  • B:購入-$ 54.9871875
  • b:販売-$ 57.736546875
  • b:販売-$ 54.8497195313
  • a:販売-$ 52.1072335547
  • 人Aの利益:57.88125+52.1072335547-50-52.50=7.4884835547
  • 人Bの利益:57.736546875+54.8497195313-55.125-54.9871875=2.4740789063

出力:( A:7.49,B:2.47順序は関係なく、セパレータは不要です)


入力: DGdg

  • D:購入-50ドル
  • G:購入-$ 52.50
  • d:販売-$ 55.125
  • g:販売-52.36875ドル
  • 人Dの利益:55.125-50=5.125
  • 人Gの利益:52.36875-52.50=-0.13125

出力: D:5.13,G:-.13


入力: ADJdja

  • A:購入-$ 50
  • D:購入-$ 52.50
  • J:購入-$ 55.125
  • d:販売-$ 57.88125
  • j:販売-$ 54.9871875
  • a:販売-$ 52.237828125
  • 人Aの利益:52.237828125-50=2.237828125
  • 人Dの利益:57.88125-52.50=5.38125
  • 人Jの利益:54.9871875-55.125=-0.1378125

出力: A:2.24,D:5.38,J:-.14


@ETHproductions出力を印刷するとき、データ型が実際に何であるかは問題ではなく、正しい情報を伝える必要があるだけです。
-geokavel

最終結果を丸める代わりに切り捨てることはできますか?
Mwr247

@Mwr申し訳ありませんが、丸める必要があります。
-geokavel

人をアルファベット順に出力する必要がありますか?
PurkkaKoodari

また、Python roundのものは奇妙なものです。デフォルトで5.125丸め5.12ます。これは受け入れられますか?
-PurkkaKoodari

回答:



3

Java、277バイト

class c{public static void main(String[]a){double[]m=new double[26];double s=50;for(byte b:a[0].getBytes()){if(b>=97){m[b-97]+=s;s*=.95;}else{m[b-65]-=s;s*=1.05;}}char g=65;for(double k:m){if(k!=0){System.out.println(g+String.format(java.util.Locale.ENGLISH,"%.2f",k));}g++;}}}

ゴルフをしていない:

class c {
    public static void main(String[]a) {
        double[] m = new double[26];
        double s = 50;
        for(byte b : a[0].getBytes()) {
            if(b>=97) {
                m[b-97]+=s;  
                s*=.95;
            } else {
                m[b-65]-=s;
                s*=1.05;
            }
        }
        char g=65;
        for(double k:m) {
            if(k!=0) {
                System.out.println(g+String.format(java.util.Locale.ENGLISH,"%.2f",k));
            }
            g++;
        }
    }
}

多くの書式設定は不要です。小数点の前に0があれば、カンマとコロンは必要ありません。
ジオカベル

これにより、バイトカウントが大幅に減少します
-ByteBit

クラスはパブリックである必要はありません。
spaghetto

ロケールの指定は必要ですか?「3,54」と表示されてもかまいません。
geokavel

お金をa floatに保存します。これによりバイト数が節約され、余分な利益が得られる可能性があります;)
RobAu

2

JavaScript(ES7)、145 142バイト

結果をまとめる簡単な方法が見つかりません...

x=>[for(c of(i=50,a={},x))(a[d=c.toUpperCase()]=a[d]||0,c<"["?(a[d]-=i,i*=1.05):(a[d]+=i,i*=.95))]&&Object.keys(a).map(k=>[k,a[k].toFixed(2)])

おもしろい事実:丸めの要件が​​ない場合、これは101バイトだけになります。

x=>[for(c of(i=50,a={},x))(a[d=c.toUpperCase()]=a[d]||0,c<"["?(a[d]-=i,i*=1.05):(a[d]+=i,i*=.95))]&&a

43バイトのように思えます。より良い方法を見つけることができると確信しています。
ジオカベル

2

Python 3、116バイト

P=50
M={}
for c in input():C=c.upper();u=c>C;u+=~-u;M[C]=M.get(C,0)+P*u;P*=1-u*.05
for k in M:print(k,round(M[k],2))

非ゴルフ

price = 50
profits = {}
for char in input():
    upper = char.upper()
    direction = 2 * (char > upper) - 1
    profits[upper] = profits.get(upper, 0) + price * direction
    price *= 1 - direction * .05
for key in profits:
    print(key, round(profits[key], 2))

u=2*(c>C)-1直接行う方が短いようです。
-xnor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.