รายได้ตัวแปรราคา!


16

บทนำและเครดิต

สมมติว่าคุณเป็นบาร์เทนเดอร์ คุณมีคนที่มีความสุขมากมายในบาร์ของคุณในเวลาส่วนใหญ่ แต่หลายคนเคยดื่มเครื่องดื่มเดียวกันและน้อยเกินไปสำหรับรสนิยมของคุณและคุณต้องการที่จะเปลี่ยน ดังนั้นคุณแนะนำระบบที่ราคาของเครื่องดื่มแปรผันขึ้นอยู่กับจำนวนที่ขายไปแล้ว แต่ไม่เคยแพงหรือน้อยกว่าเกณฑ์ที่กำหนด ด้วยเหตุผลแปลก ๆ บางอย่างคุณลืมที่จะติดตามเครื่องดื่มและราคาขายที่ถูกต้องเสมอและดังนั้นคุณต้องคิดถึงรหัส (= จดจำ!) สั้น ๆ ที่จะช่วยคุณคำนวณปริมาณเครื่องดื่ม

ความท้าทายนี้ปรากฏในการสอบกลางภาคในปี 2012 ที่หลักสูตรการเขียนโปรแกรมการทำงานที่มหาวิทยาลัยของฉันและฉันก็มีอาจารย์ของฉันตกลงที่จะโพสต์ที่นี่ เราได้จัดทำโซลูชันตัวอย่างในภาษาของการสอบ

อินพุต

ข้อมูลที่คุณป้อนจะเป็นรายการสตริงที่ไม่มีช่องว่าง - นี่คือชื่อของเครื่องดื่มที่ขาย รับอินพุตโดยใช้วิธีการป้อนข้อมูลที่คุณต้องการยอมรับโดยทั่วไป

เอาท์พุต

ผลลัพธ์ของคุณจะเป็นตัวเลขเดียว - นี่คือรายได้ที่คุณสร้างขึ้นในเย็นนี้ ให้การส่งออกโดยใช้ที่ต้องการของคุณวิธีการส่งออกได้รับการยอมรับโดยทั่วไป

จะทำอย่างไร?

สิ่งนี้ใช้สำหรับเครื่องดื่มแต่ละรายการ:

  • ราคาเริ่มต้นคือ 10
  • ทุกครั้งที่ซื้อเครื่องดื่มราคาของมันจะเพิ่มขึ้น 1 ต่อผู้ซื้อรายต่อไป
  • ราคาสูงสุดคือ 50 หากเครื่องดื่มซื้อ 50 ราคาใหม่จะเป็น 10 อีกครั้ง

งานของคุณคือการหารายได้โดยรวมที่สร้างขึ้นจากรายการเครื่องดื่มตามกฎข้างต้น


ในกรณีที่คุณสงสัยว่า: "50 bucks แพงมากสำหรับเครื่องดื่ม!" นี่คือ 50-deci Bucks ดังนั้นหน่วย 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

คำตอบ:


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

undefinedฉันkeeüลืมว่ามี JS :)
ติตัส

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

ขอบคุณ Jonathan Allan ที่ประหยัด 6 ไบต์ :)

รุ่น 54- ไบต์เก่าของฉันฉันภูมิใจมาก :)

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

...l>[]and 1*~...เพื่อบันทึก 3 ไบต์เหล่านี้ที่คุณรู้ว่าทำได้
Jonathan Allan

อันที่จริงแล้วมีน้อยกว่า 1:f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
Jonathan Allan

Oooh และอีกสองคนด้วย:f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Jonathan Allan

@JanathanAllan ขอบคุณสำหรับเคล็ดลับ! ฉันจะอัปเดตโพสต์ของฉันในไม่ช้า :)
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 ของคำตอบหลาม

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

ฉันแน่ใจว่าสิ่งนี้สามารถเล่นกอล์ฟเพื่อให้อภัยได้พจนานุกรมไม่ได้เป็นวิธีที่ดีที่สุดในการทำเช่นนี้ นอกจากนั้นฉันคิดว่ามันโอเค!

ตัวอย่าง:

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ทำงานด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.