Mercado de ações parvo

16

Dada uma sequência com dados de investimento de várias pessoas, descubra quanto lucro / perda eles registraram.

A sequência contém apenas letras maiúsculas e minúsculas, assim:

AABaBbba

Cada letra representa uma pessoa - uma letra maiúscula significa comprar, uma letra minúscula significa vender. O preço das ações em que estão investindo (CGLF) começa em US $ 50. Depois que alguém compra, o preço sobe 5%. Depois que alguém vende, o preço cai 5%. Você precisa descobrir quanto dinheiro cada pessoa que participou ganhou / perdeu.

Notas:

  • A string sempre será válida, sem venda sem a primeira compra. Além disso, todo mundo que comprar uma ação a venderá eventualmente.
  • Seus cálculos devem ser precisos com pelo menos 6 casas decimais. No entanto, as respostas finais devem ser arredondadas para duas casas decimais.

Casos de teste:

Entrada: AABaBbba

  • A: Comprar - US $ 50
  • A: Comprar - $ 52,50
  • B: Comprar - $ 55,125
  • a: Vender - $ 57,88125
  • B: Comprar - $ 54,9871875
  • b: Venda - $ 57.736546875
  • b: Vender - $ 54,8497195313
  • a: Vender - $ 52,1072335547
  • Pessoa A lucro: 57.88125+52.1072335547-50-52.50= 7.4884835547
  • Lucro da pessoa B: 57.736546875+54.8497195313-55.125-54.9871875=2,4740789063

Saída: A:7.49,B:2.47 (o pedido não importa, separadores não são necessários)


Entrada: DGdg

  • D: Comprar - US $ 50
  • G: Comprar - $ 52,50
  • d: Vender - $ 55,125
  • g: Vender - $ 52,36875
  • Pessoa D lucro: 55.125-50= 5.125
  • Pessoa G lucro: 52.36875-52.50=-0.13125

Resultado: D:5.13,G:-.13


Entrada: ADJdja

  • A: Comprar - US $ 50
  • D: Comprar - $ 52,50
  • J: Comprar - $ 55,125
  • d: Vender - $ 57,88125
  • j: Vender - $ 54,9871875
  • a: Vender - $ 52,237828125
  • Pessoa A lucro: 52.237828125-50= 2.237828125
  • Pessoa D lucro: 57.88125-52.50= 5.38125
  • Lucro da pessoa J: 54.9871875-55.125=-0.1378125

Resultado: A:2.24,D:5.38,J:-.14

geokavel
fonte
@ETHproductions Quando você imprime a saída, não importa realmente qual é o tipo de dados, apenas precisa transmitir as informações corretas.
precisa saber é
O resultado final pode ser truncado em vez de arredondado?
precisa saber é o seguinte
@ Wrm Desculpe, você tem que arredondar.
geokavel
Temos que produzir as pessoas em ordem alfabética?
precisa saber é o seguinte
Além disso, roundas coisas do Python são estranhamente; 5.125arredonda para 5.12por padrão. Isso é aceito?
precisa saber é o seguinte

Respostas:

0

Japt, 91 84 bytes

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

Com base na minha resposta JS. Experimente online!

ETHproductions
fonte
3

Java, 277 bytes

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

Ungolfed:

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++;
        }
    }
}
ByteBit
fonte
Muita formatação é desnecessária. Ter um 0 antes do ponto decimal é bom, vírgulas e dois pontos não são necessários.
precisa saber é
ótimo isso reduz significativamente a minha contagem de bytes #
228
A turma não precisa ser pública.
a spaghetto
É necessário especificar a localidade? Não me importo se aparecer como "3,54".
geokavel
Guarde o seu dinheiro em um float, isso poupa bytes e você pode obter algum lucro extra;)
Robau
2

JavaScript (ES7), 145 142 bytes

Não consigo encontrar uma maneira mais curta de arredondar os resultados ...

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)])

Curiosidade: isso seria apenas 101 bytes, se não fosse o requisito de arredondamento:

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
ETHproductions
fonte
43 bytes parece muito ... Tenho certeza que você pode encontrar uma maneira melhor!
geokavel
2

Python 3, 116 bytes

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))

Ungolfed

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))
PurkkaKoodari
fonte
Parece mais curto para fazer u=2*(c>C)-1diretamente.
Xnor