Дурний фондовий ринок


16

Давши рядок із даними про інвестування кількох людей, з’ясуйте, скільки прибутку / збитку вони зафіксували.

Рядок містить лише великі і малі літери, наприклад:

AABaBbba

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

Примітки:

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

Випробування:

Вхід: AABaBbba

  • A: Купуйте - 50 доларів
  • A: Купити - $ 52,50
  • Б: Купівля - 55,125 дол
  • а: Продам - ​​57,88125 дол
  • Б: Купити - 54,9871875 доларів
  • б: Продам - ​​57,736546875 дол
  • б: Продам - ​​54,8497195313 доларів
  • а: Продам - ​​52,1072335547 дол
  • Особа А прибуток: 57.88125+52.1072335547-50-52.50=7.4884835547
  • Прибуток на особу Б: 57.736546875+54.8497195313-55.125-54.9871875=2,4740789063

Вихід: A:7.49,B:2.47 (замовлення не має значення, роздільники не потрібні)


Вхід: DGdg

  • Д: Купуйте - 50 доларів
  • G: Купівля - 52,50 дол
  • d: Продам - ​​55,125 дол
  • г: Продають - 52,36875 дол
  • Прибуток за особу D: 55.125-50=5.125
  • Особа G прибуток: 52.36875-52.50=-0,13125

Вихід: D:5.13,G:-.13


Вхід: ADJdja

  • A: Купуйте - 50 доларів
  • Д: Купівля - 52,50 дол
  • J: Купівля - 55,125 дол
  • д: Продам - ​​57,88125 дол
  • j: Продам - ​​54,9871875 доларів
  • а: Продам - ​​52,237828125 доларів
  • Особа A прибуток: 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 Коли ви друкуєте вихід, це насправді не має значення, який тип даних, він просто повинен передати потрібну інформацію.
geokavel

Чи можна скоротити кінцевий результат замість округлого?
Mwr247

@Mwr Вибачте, ви повинні обійти.
geokavel

Чи потрібно виводити людей в алфавітному порядку?
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++;}}}

Безголівки:

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 перед десятковою точкою в порядку, коми і колонки не потрібні.
geokavel

чудово, це значно скорочує мій байт
ByteBit

Клас не повинен бути загальнодоступним.
спагето

Чи потрібне вказівку місцевого розташування? Я не проти, якщо він відображається як "3,54".
geokavel

Зберігайте свої гроші в float, це економить байти і може отримати додатковий прибуток;)
RobAu

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 байти здається набагато..Я впевнений, що ви можете знайти кращий спосіб!
geokavel

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

Безумовно

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.