愚蠢的股票市场


16

给定一个包含多个人的投资数据的字符串,请找出他们记录了多少利润/亏损。

该字符串仅包含大写和小写字母,如下所示:

AABaBbba

每个字母代表一个人-大写字母表示购买,小写字母表示出售。他们所投资股票的价格(CGLF)从50美元起。有人购买后,价格上涨5%。有人卖出后,价格下跌了5%。您需要弄清楚每个参与者赚了多少钱。

笔记:

  • 该字符串将始终有效,没有先购买就不能出售。同样,每个购买股票的人最终都会出售它。
  • 您的计算结果至少应精确到小数点后6位。但是,最终答案应四舍五入到两位小数。

测试用例:

输入: AABaBbba

  • A:购买-$ 50
  • 一个:购买-$ 52.50
  • B:买-$ 55.125
  • 一个:出售-$ 57.88125
  • B:购买-$ 54.9871875
  • b:出售-$ 57.736546875
  • b:出售-$ 54.8497195313
  • 一个:出售-$ 52.1072335547
  • A人利润:57.88125+52.1072335547-50-52.50=7.4884835547
  • 乙方利润: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
  • 一个:出售-$ 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 '16

@Mwr抱歉,您必须四舍五入。
geokavel

我们是否必须按字母顺序输出人员?
PurkkaKoodari

而且,Python round的东西很奇怪。5.125四舍五入为5.12默认值。这被接受吗?
PurkkaKoodari

Answers:


0

Japt,91 84字节

A=[]J=50¡AhD=Xc %H(X<'_?[AgD ª0 -JJ*=1.05]:[AgD +JJ*=.95] g};A£X©[Y+I d X*L r /L]} f

基于我的JS答案。在线尝试!


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,逗号和冒号不是必需的。
geokavel

极大地减少了我的字节数
ByteBit

该类不需要公开。
意大利面条

是否需要指定语言环境?我不介意它显示为“ 3,54”。
geokavel

将您的钱存储在中float,这可以节省字节并可能为您带来一些额外的利润;)
RobAu 2016年

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字节似乎太多了。我确定您可以找到更好的方法!
geokavel

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.