Дохід із змінними цінами!


16

Вступ та кредит

Припустимо, що ви бармен. У вашому барі найбільше щасливих людей, але багато хто лише коли-небудь п’є той самий напій і занадто мало для вашого смаку, і ви хочете це змінити. Отже, ви запроваджуєте систему, де ціна напою є різною, залежно від того, скільки вже продано, але ніколи більше або менш дорого, ніж певні пороги. З якоїсь дивної причини ви завжди забуваєте правильно відстежувати всі продані напої та ціни, і, таким чином, вам потрібно придумати короткий (= запам'ятовується!) Фрагмент коду, який відповідає математиці для вас, враховуючи кількість споживаних напоїв.

Цей виклик вже з'явився на середньостроковому іспиті в 2012 році на курсі функціонального програмування в моєму університеті, і я маю на користь свого професора, щоб опублікувати його тут. Нам було запропоновано приклад рішення мовою іспиту.

Вхідні дані

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

Вихідні дані

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

Що робити?

Це стосується кожного напою окремо:

  • Стартова ціна - 10.
  • Щоразу, коли напій купується, його ціна піднімається на 1 для наступного покупця.
  • Максимальна ціна - 50. Якщо напій був куплений за 50, нова ціна знову буде 10.

Ваше завдання - знайти загальний дохід, отриманий вхідним списком напоїв з урахуванням вищезазначених правил.


У випадку, якщо вам цікаво: "50 баксів - це чорт дорого дорогий!", Це 50 баксів, тому 50 * 0,1 * одиниця, але я вирішив піти на 10-50, щоб не виключати мови без Арифметика з плаваючою комою

Хто виграє?

Це , тому найкоротший код у байтах виграє! Діють стандартні правила.

Потенційні випадки кутових справ

Якщо список вводу порожній, вихід має бути 0.
Вихідний список ican не вважається сортованим за напоєм.

Приклади

[] -> 0
["A"] -> 10
["A","B"] -> 20
["A","A","B"] -> 31
["A","B","A"] -> 31
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1240
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"] -> 1304 
["D","A","A","C","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"] -> 1304
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1304

1
Реквізити просити свого професора перед тим, як відправити повідомлення, цілком рухаються в ОГ.
Чарівна урва восьминога

Відповіді:


4

JavaScript (ES6), 50 байт

a=>a.map(x=>t+=d[x]=d[x]<50?d[x]+1:10,t=0,d={})&&t

Де ти починаєш d[x]до 10?
Тит

@Titus Якщо d[x]його не встановлено, це undefined; це робить d[x]<50повернення помилковим, тому d[x]=d[x]<50?d[x]+1:10встановлюється d[x]на 10.
ETHproductions

Я забуваю, що JS є undefined. :)
Тит

4

Пітон 2, 79 74 54 48 байт

Масове збільшення кількості байтів збільшується шляхом переосмислення проблеми. Я хотів би позбутися від intакторської ролі, але мій мозок не працює . Використовуючи, l.pop()щоб уникнути обрізки списку двічі та гарної старої лямбда-рекурсії :)

f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0

дякую Джонатану Аллану за збереження 6 байт :)

Моя стара 54-байтна версія, якою я дуже пишався :)

f=lambda l:int(l>[])and~-l.count(l[0])%41+10+f(l[1:])

...l>[]and 1*~...щоб зберегти 3 байти, які ви знали, що можете.
Джонатан Аллан

Насправді на 1 менше:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
Джонатан Аллан

Ооо та ще двоє з:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Джонатан Аллан

@JonathanAllan дякую за поради! Я скоро оновлю свою посаду :)
Каде

2

Піт, 15 байт

ssm<*lQ}T50/Qd{

Програма, яка приймає введення списку і друкує результат.

Тестовий набір (перший рядок, щоб дозволити кілька входів)

Як це працює

ssm<*lQ}T50/Qd{   Program. Input: Q
ssm<*lQ}T50/Qd{Q  Implicit input fill
              {Q  Deduplicate Q
  m               Map over that with variable d:
       }T50        Yield [10, 11, 12, ..., 48, 49, 50]
    *lQ            Repeat len(Q) times
   <       /Qd     First Q.count(d) elements of that
 s                Flatten
s                 Sum
                  Implicitly print

2

Желе , 14 11 10 байт

50⁵rṁЀĠSS

СпробуйтеItOnline!

Як?

50⁵rṁЀĠSS - Main link: list of drink names                e.g. ['d', 'a', 'b', 'a', 'c']
       Ġ   - group indices by values                       e.g. [[2, 4], [3], [5], [1]]
  ⁵        - 10
50         - 50
   r       - inclusive range, i.e. [10, 11, 12, ..., 48, 49, 50]
    ṁЀ    - mould left (the range) like €ach of right(Ð)  e.g. [[10, 11], [10], [10], [10]]
                 note: moulding wraps, so 42 items becomes [10, 11, 12, ..., 48, 49, 50, 10]
        S  - sum (vectorises)                              e.g. [40, 11]
         S - sum                                           e.g. 51


1

Perl 41 байт

Включає +1 для -p

$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{

Здійснює введення даних у нових рядках.

Збільшує хеш-значення на: 10 якщо це undef, -40якщо це > 49тобто 50, або 1іншим чином. Потім додається до $\вивідного роздільника, який -pдрукується.

Приклад:

$ echo -e 'A\nB\nA' | perl -pe '$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{'
31

1

05AB1E , 13 байт

{.¡€gL<41%T+O

Пояснення

["A","B","A"] використаний як приклад.

{               # sort input
                # STACK: ["A","A","B"]
 .¡             # split on different
                # STACK: [["A","A"],["B"]]
   €g           # length of each sublist
                # STACK: [2,1]
     L          # range [1 ... x] (vectorized)
                # STACK: [1,2,1]
      <         # decrease by 1
                # STACK: [0,1,0]
       41%      # mod 41
                # STACK: [0,1,0]
          T+    # add 10
                # STACK: [10,11,10]
            O   # sum
                # OUTPUT: 31

1

C ++ 14, 105 байт

Як загальна неназвана лямбда, що повертається за допомогою еталонного параметра. Потрібен вхід, щоб бути контейнером, stringякий має push_back, як vector<string>.

Використовуючи %41+10хитрість з відповіді Каде Пітон .

[](auto X,int&r){r=0;decltype(X)P;for(auto x:X){int d=0;for(auto p:P)d+=x==p;r+=d%41+10;P.push_back(x);}}

Створює порожній контейнер Pяк пам'ять того, що вже подано. Ціна обчислюється шляхом підрахунку xв P.

Безголівки та використання:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

auto f=
[](auto X, int& r){
  r = 0;
  decltype(X) P;
  for (auto x:X){
    int d = 0;
    for (auto p:P)
      d += x==p;
    r += d % 41 + 10;
    P.push_back(x);
  }
}
;

int main(){
 int r;
 vector<string> V;
 f(V,r);cout << r << endl;
 V={"A"};
 f(V,r);cout << r << endl;
 V={"A","B"};
 f(V,r);cout << r << endl;
 V={"A","B","C"};
 f(V,r);cout << r << endl;
 V={"A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"};
 f(V,r);cout << r << endl;
}

0

Математика, 64 байти

Відчуває, що він повинен бути коротшим.

Tr[(19+#)#/2&/@(Length/@Gather@#//.z_/;z>41:>Sequence[41,z-41])]&

Length/@Gather@#підраховує повторення кожного напою. //.z_/;z>41:>Sequence[41,z-41]розбиває в цьому будь-яке ціле число, що zперевищує 41, 41і z-41відображає падіння ціни. Потім кожен з підрахунків підключається до формули (19+#)#/2, яка становить загальну вартість #напоїв до тих пір, #поки не перевищує 41. Нарешті, Trпідсумовує ці витрати.


0

k, 22 байти

Аргументом може бути будь-який список - рядки, цифри тощо.

{+/,/10+(#:'=x)#\:!41}

qПереклад легше читати:

{sum raze 10+(count each group x)#\:til 41}

0

C #, 193 байт + 33

Додаткові 33 байти для using System.Collections.Generic;

void m(string[]a){int t=0;Dictionary<string,int>v=new Dictionary<string,int>();foreach(string s in a){if(v.ContainsKey(s)){v[s]=v[s]==50?10:v[s]+1;}else{v.Add(s,10);}t+=v[s];}Console.WriteLine(t);}

Я впевнений, що це може бути полегшене до забуття, Словники, безумовно, не найкращий спосіб зробити це, і я, мабуть, міг би попрацювати на своєму поколінні. Крім цього я думаю, що це нормально!

Приклади:

a = {"A", "A", "A", "B", "B", "C"};
//output = 64

a = {"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A",, "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A" "A" ,"A", "A" ,"A", "B", "B", "C"};
//output 727

Безумовно

void m(string[] a)
{
    int t=0;
    Dictionary<string,int> v = new Dictionary<string,int>();
    foreach(string s in a)
    {
        if(v.ContainsKey(s))
        {
            v[s]=v[s]==50?10:v[s]+1;
        }
        else
        {
            v.Add(s,10);
        }
        t+=v[s];
    }
    Console.Write(t);
}

0

Clojure, 79 байт

#(apply +(mapcat(fn[l](for[i(range l)](+(mod i 41)10)))(vals(frequencies %)))))

Підраховує частоти напоїв, а потім обчислює базову ціну як 10 + (i % 41). mapcatз'єднує їх і apply +обчислює суму.


0

PHP, 47 байт

while($k=$argv[++$i])$s+=10+$p[$k]++%41;echo$s;

приймає дані з аргументів командного рядка; бігати з -r.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.