Mercado de valores tonto


16

Dada una cadena con datos de inversión de varias personas, averigüe cuánta ganancia / pérdida registraron.

La cadena solo contiene letras mayúsculas y minúsculas, como esta:

AABaBbba

Cada letra representa a una persona: una letra mayúscula significa comprar, una letra minúscula significa vender. El precio de las acciones en las que están invirtiendo (CGLF) comienza en $ 50. Después de que alguien compra, el precio sube un 5%. Después de que alguien vende, el precio baja un 5%. Necesita calcular cuánto dinero ganó / perdió cada persona que participó.

Notas:

  • La cadena siempre será válida, no se venderá sin comprar primero. Además, todos los que compren una acción la venderán eventualmente.
  • Sus cálculos deben tener una precisión de al menos 6 decimales. Sin embargo, las respuestas finales deben redondearse a dos decimales.

Casos de prueba:

Entrada: AABaBbba

  • A: Comprar - $ 50
  • A: Comprar - $ 52.50
  • B: Comprar - $ 55.125
  • a: Venta - $ 57.88125
  • B: Comprar - $ 54.9871875
  • b: Venta - $ 57.736546875
  • b: Venta - $ 54.8497195313
  • a: Venta - $ 52.1072335547
  • 57.88125+52.1072335547-50-52.50=Beneficio de la persona A: 7.4884835547
  • 57.736546875+54.8497195313-55.125-54.9871875=Beneficio de persona B: 2.4740789063

Salida: A:7.49,B:2.47 (el orden no importa, no se requieren separadores)


Entrada: DGdg

  • D: Comprar - $ 50
  • G: Comprar - $ 52.50
  • d: Venta - $ 55.125
  • g: Venta - $ 52.36875
  • 55.125-50=Beneficio de la persona D: 5.125
  • 52.36875-52.50=Beneficio de la persona G: -0.13125

Salida: D:5.13,G:-.13


Entrada: ADJdja

  • A: Comprar - $ 50
  • D: Comprar - $ 52.50
  • J: Comprar - $ 55.125
  • d: Venta - $ 57.88125
  • j: Venta - $ 54.9871875
  • a: Venta - $ 52.237828125
  • 52.237828125-50=Beneficio de persona A: 2.237828125
  • 57.88125-52.50=Beneficio de la persona D: 5.38125
  • Persona J beneficio: 54.9871875-55.125=-0.1378125

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


@ETHproductions Cuando imprime la salida, en realidad no importa cuál sea el tipo de datos, solo necesita transmitir la información correcta.
— geokavel

¿Se puede truncar el resultado final en lugar de redondearlo?
— Mwr247

@Mwr Lo siento, tienes que redondear.
— geokavel

¿Tenemos que dar salida a las personas en orden alfabético?
— PurkkaKoodari

Además, roundlas cosas de Python son raras; 5.125redondea a 5.12por defecto. ¿Esto es aceptado?
— PurkkaKoodari

Respuestas:



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

Sin golf:

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

Gran parte del formato es innecesario. Tener un 0 antes del punto decimal está bien, no son necesarias comas ni dos puntos.
— geokavel

genial, esto reduce significativamente mi recuento de bytes
— ByteBit

La clase no necesita ser pública.
— un spaghetto

¿Es necesario especificar la configuración regional? No me importa si aparece como "3,54".
— geokavel

Guarde su dinero en un float, esto ahorra bytes y podría obtener un beneficio adicional;)
— RobAu

2

JavaScript (ES7), 145 142 bytes

No puedo encontrar una forma más corta de redondear los 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)])

Dato curioso: esto solo sería de 101 bytes si no fuera por el requisito de redondeo:

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 bytes parece mucho ... ¡Estoy seguro de que puedes encontrar una mejor manera!
— 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))

Sin golf

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

Parece más corto simplemente hacerlo u=2*(c>C)-1directamente.
— xnor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.