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


@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:



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

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

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

To wydaje się krótsze, aby zrobić to u=2*(c>C)-1bezpośrednio.
— xnor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.