Bourse idiote

16

Étant donné une chaîne avec les données d'investissement de plusieurs personnes, découvrez combien de profits / pertes ils ont enregistrés.

La chaîne contient uniquement des majuscules et des minuscules, comme ceci:

AABaBbba

Chaque lettre représente une personne - une lettre majuscule signifie acheter, une lettre minuscule signifie vendre. Le prix des actions dans lesquelles ils investissent (CGLF) commence à 50 $. Après que quelqu'un achète, le prix augmente de 5%. Après que quelqu'un a vendu, le prix baisse de 5%. Vous devez déterminer combien d'argent chaque personne qui a participé a gagné / perdu.

Remarques:

  • La chaîne sera toujours valide, pas de vente sans premier achat. En outre, tous ceux qui achètent un stock le revendent éventuellement.
  • Vos calculs doivent être précis à au moins 6 décimales. Cependant, les réponses finales doivent être arrondies à deux décimales.

Cas de test:

Contribution: AABaBbba

  • A: acheter - 50 $
  • A: acheter - 52,50 $
  • B: acheter - 55,125 $
  • a: Vendre - 57,88125 $
  • B: acheter - 54,9871875 $
  • b: Vendre - 57,736546875 $
  • b: Vente - 54,8497195313 $
  • a: Vendre - 52,1072335547 $
  • Bénéfice de la personne A: 57.88125+52.1072335547-50-52.50=7.4884835547
  • Bénéfice de la personne B: 57.736546875+54.8497195313-55.125-54.9871875=2,4740789063

Sortie: A:7.49,B:2.47 (l'ordre n'a pas d'importance, les séparateurs ne sont pas nécessaires)


Contribution: DGdg

  • D: acheter - 50 $
  • G: Acheter - 52,50 $
  • d: Vendre - 55,125 $
  • g: Vendre - 52,36875 $
  • Bénéfice de la personne D: 55.125-50=5.125
  • Bénéfice de la personne G: 52.36875-52.50=-0,13125

Production: D:5.13,G:-.13


Contribution: ADJdja

  • A: acheter - 50 $
  • D: acheter - 52,50 $
  • J: Acheter - 55,125 $
  • d: Vendre - 57,88125 $
  • j: Vendre - 54,9871875 $
  • a: Vendre - 52,237828125 $
  • Bénéfice de la personne A: 52.237828125-50=2.237828125
  • Bénéfice de la personne D: 57.88125-52.50=5.38125
  • Bénéfice de la personne J: 54.9871875-55.125=-0.1378125

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

geokavel
la source
@ETHproductions Lorsque vous imprimez une sortie, peu importe le type de données, il suffit de transmettre les bonnes informations.
geokavel
Le résultat final peut-il être tronqué au lieu d'être arrondi?
Mwr247
@Mwr Désolé, vous devez arrondir.
geokavel
Faut-il afficher les personnes par ordre alphabétique?
PurkkaKoodari
De plus, roundles trucs de Python sont étrangement; 5.125arrondit à 5.12par défaut. Est-ce accepté?
PurkkaKoodari

Réponses:

0

Japt, 91 84 octets

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

Basé sur ma réponse JS. Essayez-le en ligne!

ETHproductions
la source
3

Java, 277 octets

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

Non 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++;
        }
    }
}
ByteBit
la source
Une grande partie du formatage est inutile. Avoir un 0 avant le point décimal est correct, les virgules et les deux-points ne sont pas nécessaires.
geokavel
génial, cela réduit considérablement le nombre d'octets
ByteBit
La classe n'a pas besoin d'être publique.
un spaghetto du
La spécification des paramètres régionaux est-elle nécessaire? Cela ne me dérange pas si elle apparaît comme "3,54".
geokavel
Stockez votre argent dans un float, cela économise des octets et pourrait vous faire un bénéfice supplémentaire;)
RobAu
2

JavaScript (ES7), 145 142 octets

Je ne trouve pas de moyen plus court pour arrondir les résultats ...

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

Fait amusant: ce ne serait que de 101 octets si ce n'était pour l'exigence d'arrondi:

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
ETHproductions
la source
43 octets semble beaucoup .. Je suis sûr que vous pouvez trouver une meilleure façon!
geokavel
2

Python 3, 116 octets

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

Non 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))
PurkkaKoodari
la source
Il semble plus court de le faire u=2*(c>C)-1directement.
xnor