Biến giá-Thu nhập!


16

Giới thiệu và tín dụng

Giả sử bạn là một nhân viên pha chế. Bạn có nhiều người hạnh phúc trong quán bar của bạn nhiều lần, nhưng nhiều người chỉ uống cùng một loại đồ uống và quá ít cho khẩu vị của bạn và bạn muốn thay đổi điều đó. Vì vậy, bạn giới thiệu một hệ thống trong đó giá của một loại đồ uống là khác nhau, tùy thuộc vào số lượng đã được bán, nhưng không bao giờ đắt hơn hoặc thấp hơn ngưỡng nhất định. Vì một số lý do kỳ lạ, bạn luôn quên theo dõi đúng tất cả đồ uống và giá bán và do đó bạn cần nghĩ ra một đoạn mã ngắn (= đáng nhớ!) Để tính toán cho bạn lượng thức uống được tiêu thụ.

Thử thách này đã xuất hiện trong kỳ thi giữa kỳ năm 2012 tại khóa học lập trình chức năng tại trường đại học của tôi và tôi đã được giáo sư của mình chấp nhận để đăng bài ở đây. Chúng tôi đã được cung cấp một giải pháp ví dụ trong ngôn ngữ của kỳ thi.

Đầu vào

Đầu vào của bạn sẽ là một danh sách các chuỗi không chứa khoảng trắng - đây là tên của đồ uống được bán. Lấy đầu vào bằng phương thức nhập được ưu tiên, thường được chấp nhận của bạn .

Đầu ra

Đầu ra của bạn sẽ là một con số duy nhất - đây là thu nhập bạn đã tạo ra tối nay. Đưa ra đầu ra bằng phương pháp đầu ra ưa thích, thường được chấp nhận.

Phải làm sao

Điều này áp dụng cho từng loại đồ uống riêng biệt:

  • Giá khởi điểm là 10.
  • Mỗi lần đồ uống được mua, giá của nó sẽ tăng thêm 1 cho người mua tiếp theo.
  • Giá tối đa là 50. Nếu đồ uống đã được mua với giá 50 thì giá mới sẽ là 10 lần nữa.

Nhiệm vụ của bạn là tìm thu nhập tổng thể, được tạo ra bởi danh sách đồ uống đầu vào theo các quy tắc trên.


Trong trường hợp bạn đang tự hỏi: "50 đô la thực sự rất tốn kém cho đồ uống!", Đây là Bucks 50 deci, vì vậy Đơn vị 50 * 0,1 *, nhưng tôi đã chọn đi 10-50 để không loại trừ ngôn ngữ mà không có ngôn ngữ số học dấu phẩy động.

Ai thắng?

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng! Quy tắc tiêu chuẩn áp dụng.

Trường hợp góc tiềm năng

Nếu danh sách đầu vào trống, đầu ra sẽ là 0.
Danh sách đầu vào icannot được giả sử được sắp xếp theo đồ uống.

Ví dụ

[] -> 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
Đạo cụ hỏi giáo sư của bạn trước khi đăng, khá di chuyển OG.
Bạch tuộc ma thuật Urn

Câu trả lời:


4

JavaScript (ES6), 50 byte

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

Bạn d[x]bắt đầu từ 10 đến đâu?
Tít

@Titus Nếu d[x]chưa được đặt, nó undefined; Điều này làm cho d[x]<50trả về false, vì vậy d[x]=d[x]<50?d[x]+1:10thiết lập d[x]thành 10.
Sản xuất ETH

Tôi keeü quên rằng JS có undefined. :)
Tít

4

Python 2, 79 74 54 48 byte

Số lượng byte lớn tăng lên bằng cách xem xét lại vấn đề. Tôi muốn thoát khỏi intdàn diễn viên nhưng bộ não của tôi không hoạt động . Sử dụng l.pop()để tránh cắt xén danh sách hai lần và một số đệ quy lambda cũ tốt :)

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

cảm ơn Jonathan Allan vì đã tiết kiệm 6 byte :)

Phiên bản 54 byte cũ của tôi, tôi khá tự hào về :)

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

...l>[]and 1*~...để lưu 3 byte mà bạn biết bạn có thể.
Jonathan Allan

Trong thực tế 1 ít hơn với:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
Jonathan Allan

Oooh và hai người khác với:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Jonathan Allan

@Jonathan ALLan cảm ơn vì lời khuyên! Tôi sẽ cập nhật bài viết của mình sớm :)
Kade

2

Bình thường, 15 byte

ssm<*lQ}T50/Qd{

Một chương trình lấy đầu vào của một danh sách và in kết quả.

Bộ kiểm tra (Dòng đầu tiên cho phép nhiều đầu vào)

Làm thế nào nó hoạt động

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

Thạch , 14 11 10 byte

50⁵rṁЀĠSS

Dùng thử trực tuyến!

Làm sao?

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 byte

Bao gồm +1 cho -p

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

Đưa đầu vào trên dòng mới.

Tăng giá trị băm bằng cách: 10 nếu nó undef, -40nếu đó > 4950, hoặc 1nếu không. Điều này sau đó được thêm vào $\, dấu tách đầu ra, mà -pin.

Thí dụ:

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

1

05AB1E , 13 byte

{.¡€gL<41%T+O

Giải trình

["A","B","A"] dùng làm ví dụ.

{               # 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 byte

Như lambda không tên chung trở lại thông qua tham số tham chiếu. Yêu cầu đầu vào phải là một thùng chứa stringpush_back, như thế vector<string>.

Sử dụng %41+10mẹo từ câu trả lời Python của Kade .

[](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);}}

Tạo một container rỗng Pnhư bộ nhớ những gì đã được phục vụ. Giá được tính bằng cách tính xtrong P.

Ungolfed và cách sử dụng:

#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

Toán học, 64 byte

Cảm thấy như nó nên ngắn hơn.

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

Length/@Gather@#đếm sự lặp lại của mỗi thức uống. //.z_/;z>41:>Sequence[41,z-41]chia bất kỳ số nguyên nàoz vượt quá 41 trong số này thành 41z-41, để phản ánh sự giảm giá. Sau đó, mỗi tổng số được cắm vào công thức (19+#)#/2, đó là tổng chi phí #đồ uống miễn #là nhiều nhất là 41. Cuối cùng, Trtổng hợp các chi phí đó.


0

k, 22 byte

Đối số có thể là bất kỳ danh sách - chuỗi, số, v.v.

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

Bản qdịch dễ đọc hơn:

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

0

C #, 193 byte + 33

Thêm 33 byte cho 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);}

Tôi chắc chắn rằng điều này có thể bị đánh vào quên lãng, Từ điển chắc chắn không phải là cách tốt nhất để làm điều này và tôi có thể có thể làm việc một ternary vào nếu tôi. Ngoài ra, tôi nghĩ rằng nó ổn!

Ví dụ:

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

Bị đánh cắp

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 byte

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

Đếm tần số đồ uống, sau đó tính giá cơ sở là 10 + (i % 41). mapcatnối chúng và apply +tính tổng.


0

PHP, 47 byte

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

lấy đầu vào từ các đối số dòng lệnh; chạy với -r.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.