Głupiutki rynek akcji

16

Biorąc pod uwagę ciąg danych inwestycyjnych wielu osób, dowiedz się, ile zysków / strat odnotowali.

Ciąg zawiera tylko wielkie i małe litery, takie jak to:

AABaBbba

Każda litera reprezentuje osobę - duża litera oznacza kup, mała litera oznacza sprzedaż. Cena akcji, w którą inwestują (CGLF) zaczyna się od 50 USD. Po tym, jak ktoś kupi, cena wzrasta o 5%. Gdy ktoś sprzedaje, cena spada o 5%. Musisz dowiedzieć się, ile pieniędzy każda osoba, która wzięła udział, zarobiła / straciła.

Uwagi:

  • Ciąg będzie zawsze ważny, bez sprzedaży bez pierwszego zakupu. Ponadto, każdy, kto kupi akcje, w końcu je sprzeda.
  • Twoje obliczenia powinny być dokładne z dokładnością do co najmniej 6 miejsc po przecinku. Ostateczne odpowiedzi należy jednak zaokrąglić do dwóch miejsc po przecinku.

Przypadki testowe:

Wejście: AABaBbba

  • Odp .: Kup - 50 USD
  • Odp .: Kup - 52,50 USD
  • B: Kup - 55,125 USD
  • Odp .: Sprzedaj - 57,88125 USD
  • B: Kup - 54,9871875 USD
  • b: sprzedaj - 57,736546875 USD
  • b: Sprzedaj - 54,8497195313 USD
  • Odp .: Sprzedaj - 52,1072335547 $
  • Zysk osoby A: 57.88125+52.1072335547-50-52.50=7,4884835547
  • Zysk osoby B: 57.736546875+54.8497195313-55.125-54.9871875=2,4740789063

Wyjście: A:7.49,B:2.47 (kolejność nie ma znaczenia, separatory nie są wymagane)


Wejście: DGdg

  • D: Kup - 50 USD
  • G: Kup - 52,50 USD
  • d: Sprzedaj - 55,125 USD
  • g: Sprzedaj - 52,366875 USD
  • Zysk osoby D: 55.125-50=5,125
  • Zysk osoby G: 52.36875-52.50=-0,13125

Wynik: D:5.13,G:-.13


Wejście: ADJdja

  • Odp .: Kup - 50 USD
  • D: Kup - 52,50 USD
  • J: Kup - 55,125 USD
  • d: Sprzedaj - 57,88125 USD
  • j: Sprzedaj - 54,9871875 $
  • Odp .: Sprzedaj - 52,237828125 USD
  • Zysk osoby A: 52.237828125-50=2.237828125
  • Zysk osoby D: 57.88125-52.50=5,38125
  • Zysk osoby J: 54.9871875-55.125=-0,1378125

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

geokavel
źródło
@ETHproductions Gdy drukujesz dane wyjściowe, tak naprawdę nie ma znaczenia, jaki jest typ danych, wystarczy przekazać odpowiednie informacje.
geokavel
Czy wynik końcowy można obciąć zamiast zaokrąglić?
Mwr247,
@Mwr Przepraszamy, musisz zaokrąglić.
geokavel
Czy musimy wyprowadzać ludzi w kolejności alfabetycznej?
PurkkaKoodari
Także roundrzeczy Pythona dziwnie; 5.125zaokrągla 5.12domyślnie. Czy to jest akceptowane?
PurkkaKoodari

Odpowiedzi:

0

Japt, 91 84 bajtów

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

Na podstawie mojej odpowiedzi JS. Wypróbuj online!

ETHprodukcje
źródło
3

Java, 277 bajtów

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

Nie golfowany:

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
źródło
Dużo formatowania jest niepotrzebne. Posiadanie 0 przed przecinkiem dziesiętnym jest w porządku, przecinki i dwukropki nie są konieczne.
geokavel
świetnie, to znacznie zmniejsza liczbę moich bajtów
ByteBit
Klasa nie musi być publiczna.
spaghetto
Czy konieczne jest określenie ustawień regionalnych? Nie mam nic przeciwko, jeśli pojawi się jako „3,54”.
geokavel
Przechowuj swoje pieniądze w float, to oszczędza bajty i może przynieść ci dodatkowy zysk;)
RobAu
2

JavaScript (ES7), 145 142 bajtów

Nie mogę znaleźć krótszego sposobu na zaokrąglenie wyników ...

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

Ciekawostka: byłoby to tylko 101 bajtów, gdyby nie wymóg zaokrąglania:

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
ETHprodukcje
źródło
43 bajty wydaje się za dużo ... Jestem pewien, że możesz znaleźć lepszy sposób!
geokavel
2

Python 3, 116 bajtów

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

Nie golfił

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
źródło
To wydaje się krótsze, aby zrobić to u=2*(c>C)-1bezpośrednio.
xnor