Mercato sciocco


16

Data una stringa con i dati di investimento di più persone, scopri quanti profitti / perdite hanno registrato.

La stringa contiene solo lettere maiuscole e minuscole, in questo modo:

AABaBbba

Ogni lettera rappresenta una persona - una lettera maiuscola significa comprare, una lettera minuscola significa vendere. Il prezzo del titolo in cui stanno investendo (CGLF) parte da $ 50. Dopo che qualcuno ha acquistato, il prezzo aumenta del 5%. Dopo che qualcuno vende il prezzo scende del 5%. Devi capire quanti soldi ha guadagnato / perso ogni persona che ha partecipato.

Appunti:

  • La stringa sarà sempre valida, nessuna vendita senza il primo acquisto. Inoltre, chiunque comprerà un titolo alla fine lo venderà.
  • I calcoli devono essere precisi con almeno 6 cifre decimali. Tuttavia, le risposte finali dovrebbero essere arrotondate a due decimali.

Casi test:

Ingresso: AABaBbba

  • A: Acquista - $ 50
  • A: Acquista - $ 52,50
  • B: Acquista - $ 55.125
  • a: Vendi - $ 57.88125
  • B: Acquista - $ 54,9871875
  • b: Vendi - $ 57.736546875
  • b: Vendi - $ 54.8497195313
  • a: Vendi - $ 52,1072335547
  • Profitto persona A: 57.88125+52.1072335547-50-52.50=7.4884835547
  • Profitto persona B: 57.736546875+54.8497195313-55.125-54.9871875=2.4740789063

Output: A:7.49,B:2.47 (l'ordine non ha importanza, i separatori non sono necessari)


Ingresso: DGdg

  • D: Acquista - $ 50
  • G: Acquista - $ 52,50
  • d: Vendi - $ 55.125
  • g: Vendi - $ 52.36875
  • Profitto della persona D: 55.125-50=5.125
  • Profitto persona G: 52.36875-52.50=-0,13125

Produzione: D:5.13,G:-.13


Ingresso: ADJdja

  • A: Acquista - $ 50
  • D: Acquista - $ 52,50
  • J: Acquista - $ 55.125
  • d: Vendi - $ 57.88125
  • j: Vendi - $ 54,9871875
  • a: Vendi - $ 52.237828125
  • Profitto della persona A: 52.237828125-50=2.237828125
  • Profitto della persona D: 57.88125-52.50=5,38125
  • Profitto della persona J: 54.9871875-55.125=-0,1378125

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


@ETHproductions Quando si stampa un output, non importa quale sia il tipo di dati, deve solo trasmettere le informazioni giuste.
geokavel,

Il risultato finale può essere troncato anziché arrotondato?
Mwr247,

@Mwr Siamo spiacenti, devi arrotondare.
geokavel,

Dobbiamo produrre le persone in ordine alfabetico?
PurkkaKoodari,

Inoltre, le roundcose di Python sono stranamente; 5.125arrotonda per 5.12impostazione predefinita. È accettato?
PurkkaKoodari,

Risposte:


0

Japt, 91 84 byte

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

Basato sulla mia risposta JS. Provalo online!


3

Java, 277 byte

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

Gran parte della formattazione non è necessaria. Avere uno 0 prima del punto decimale è ok, virgole e due punti non sono necessari.
geokavel,

ottimo questo riduce significativamente il mio conteggio di byte
ByteBit

La classe non deve essere pubblica.
uno spaghetto il

È necessario specificare le impostazioni internazionali? Non mi dispiace se si presenta come "3,54".
geokavel,

Conserva i tuoi soldi in a float, questo fa risparmiare byte e potrebbe farti guadagnare qualche profitto extra;)
RobAu

2

JavaScript (ES7), 145 142 byte

Non riesco a trovare un modo più breve per completare i risultati ...

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

Curiosità: questo sarebbe solo 101 byte se non per il requisito di arrotondamento:

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 byte sembrano molto ... Sono sicuro che puoi trovare un modo migliore!
geokavel,

2

Python 3, 116 byte

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

Sembra più breve farlo u=2*(c>C)-1direttamente.
xnor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.