Переменные цены доход!


16

Введение и кредит

Предположим, вы бармен. Чаще всего в вашем баре много счастливых людей, но многие пьют только один и тот же напиток, и слишком мало на ваш вкус, и вы хотите это изменить. Таким образом, вы вводите систему, в которой цена напитка является переменной, в зависимости от того, сколько уже продано, но никогда не более или менее дорого, чем определенные пороги. По какой-то странной причине вы всегда забываете правильно следить за всеми проданными напитками и ценами, и поэтому вам нужно подумать о коротком (= запоминающемся!) Коде, который подсчитывает для вас, учитывая количество выпитых напитков.

Эта проблема уже появилась на промежуточном экзамене в 2012 году на курсе по функциональному программированию в моем университете, и у моего профессора все в порядке, чтобы опубликовать его здесь. Нам предоставили пример решения на языке экзамена.

вход

Ваш ввод будет список строк, которые не содержат пробелов - это названия проданных напитков. Возьмите ввод, используя ваш предпочтительный, общепринятый метод ввода.

Выход

Ваш вывод будет одним числом - это доход, который вы получили этим вечером. Дайте вывод, используя предпочитаемый, общепринятый метод вывода.

Что делать?

Это относится к каждому напитку в отдельности:

  • Начальная цена 10.
  • Каждый раз, когда напиток покупается, его цена увеличивается на 1 для следующего покупателя.
  • Максимальная цена 50. Если напиток был куплен за 50, новая цена снова будет 10.

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


Если вам интересно: «50 баксов - это чертовски дорого для напитка!», Это 50 баксов на деци, то есть 50 * 0,1 * за единицу, но я выбрал 10-50, чтобы не исключать языки без арифметика с плавающей точкой.

Кто выигрывает?

Это , поэтому выигрывает самый короткий код в байтах! Стандартные правила применяются.

Потенциальные Угловые Случаи

Если входной список пуст, выходное значение должно быть 0.
Предполагается, что входной список не отсортирован по напиткам.

Примеры

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

Python 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 спасибо за советы! Скоро обновлю свой пост :)
Kade

2

Pyth, 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

TryItOnline!

Как?

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трюк из ответа Kade's Python .

[](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.

Ungolfed и использование:

#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

Mathematica, 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);}

Я уверен, что это может быть забвением, словари - определенно не лучший способ сделать это, и я мог бы, вероятно, использовать троичный в своем if. Кроме того, я думаю, что все в порядке!

Примеры:

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

Ungolfed

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.