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.