可变价格收入!


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
关于在发布之前询问您的教授的建议,这是OG的举动。
Magic Octopus Urn

Answers:


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)

@Titus如果d[x]尚未设置,则为undefined; 这会使d[x]<50return 变为false,因此d[x]=d[x]<50?d[x]+1:10将设置d[x]10
ETHproductions 2016年

我忘了JS有undefined。:)
Titus

4

蟒蛇2,79 74 54 48字节

通过重新考虑该问题来增加大量字节数。我想摆脱偏见,int但我的大脑无法正常工作。利用l.pop()以避免两次修剪列表和一些好的旧的lambda递归:)

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

感谢Jonathan Allan节省了6个字节:)

我的旧54字节版本让我感到很骄傲:)

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

...l>[]and 1*~...保存这三个字节,您知道可以。
乔纳森·艾伦

实际上少了1个:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
乔纳森·艾伦,

Oooh和另外两个与:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Jonathan Allan

@JonathanAllan感谢您的提示!我将尽快更新我的帖子:)
Kade 2016年

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则为> 49ie 501否则为其他方式。然后将其添加到打印$\的输出分隔符上-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个字节

作为通过引用参数返回的通用未命名lambda。要求输入是一个容器的string具有push_back一样vector<string>

使用%41+10Kade的Python answer中的技巧。

[](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作为已存储的内容。价格是由计数计算xP

脱胶和用法:

#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的所有整数均分为41z-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

不打高尔夫球

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.