Глупый фондовый рынок


16

Имея строку с данными об инвестициях нескольких людей, узнайте, какую прибыль / убыток они записали.

Строка содержит только заглавные и строчные буквы, например:

AABaBbba

Каждая буква представляет человека - заглавная буква означает покупку, строчная буква означает продажу. Цена акции, в которую они инвестируют (CGLF), начинается с 50 долларов. После того, как кто-то покупает, цена повышается на 5%. После того, как кто-то продает, цена снижается на 5%. Вам необходимо выяснить, сколько денег сделал / потерял каждый участник.

Примечания:

  • Строка всегда будет действительной, без продажи без первой покупки. Кроме того, каждый, кто покупает акции, в конечном итоге продаст их.
  • Ваши расчеты должны быть с точностью не менее 6 знаков после запятой. Однако окончательные ответы должны быть округлены до двух десятичных знаков.

Тестовые случаи:

Входные данные: AABaBbba

  • A: Купить - 50 долларов
  • A: Купить - $ 52,50
  • B: купить - $ 55,125
  • a: Продать - $ 57,88125
  • B: Купить - 54,9871875 $
  • б: Продать - $ 57,736546875
  • б: Продать - $ 54,8497195313
  • a: Продать - $ 52.1072335547
  • Персона Прибыль: 57.88125+52.1072335547-50-52.50=7.4884835547
  • Прибыль лица B: 57.736546875+54.8497195313-55.125-54.9871875=2,4740789063

Вывод: A:7.49,B:2.47 (порядок не имеет значения, разделители не требуются)


Входные данные: DGdg

  • D: купить - $ 50
  • G: купить - $ 52,50
  • д: Продать - $ 55,125
  • г: продажа - $ 52,36875
  • Прибыль лица D: 55.125-50=5.125
  • Персона Г прибыль: 52.36875-52.50=-0,13125

Выход: D:5.13,G:-.13


Входные данные: ADJdja

  • A: Купить - 50 долларов
  • D: купить - $ 52,50
  • J: Купить - $ 55,125
  • d: Продать - $ 57,88125
  • j: Продать - $ 54,9871875
  • a: Продать - $ 52.237828125
  • Персона Прибыль: 52.237828125-50=2.237828125
  • Прибыль лица D: 57.88125-52.50=5.38125
  • Персона J прибыль: 54.9871875-55.125=-0.1378125

Выход: A:2.24,D:5.38,J:-.14


@ETHproductions Когда вы печатаете вывод, на самом деле не имеет значения, какой тип данных, просто нужно передать правильную информацию.
геокавель

Можно ли усекать окончательный результат вместо округленного?
Mwr247

@Mwr Извините, вы должны округлить.
геокавель

Нужно ли выводить людей в алфавитном порядке?
PurkkaKoodari

Кроме того, roundвещи Python странные; 5.125округляет до 5.12по умолчанию. Это принято?
PurkkaKoodari

Ответы:



3

Java, 277 байт

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

Большая часть форматирования не нужна. Наличие 0 перед десятичной точкой в ​​порядке, запятые и двоеточия не нужны.
геокавель

здорово, это значительно уменьшает мое количество байтов
ByteBit

Класс не должен быть публичным.
спагетто

Нужно ли указывать локаль? Я не против, если он будет отображаться как «3,54».
геокавель

Храните ваши деньги в float, это экономит байты и может
принести

2

JavaScript (ES7), 145 142 байта

Я не могу найти более короткий способ округлить результаты ...

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

Интересный факт: это было бы только 101 байт, если бы не требование округления:

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 байта, кажется, много .. Я уверен, что вы можете найти лучший способ!
геокавель

2

Python 3, 116 байт

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

Кажется, короче просто сделать u=2*(c>C)-1напрямую.
xnor
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.