가변 가격 수입!


16

소개 및 신용

당신이 바텐더라고 가정하십시오. 당신은 대부분의 술집에 많은 행복한 사람들이 있지만, 많은 사람들은 항상 같은 음료를 마시고 취향에 비해 너무 적은 음료수를 마시고 그것을 바꾸고 싶어합니다. 따라서 이미 판매 된 수량에 따라 음료 가격이 변동이 있지만 특정 임계 값보다 높거나 적은 시스템을 소개합니다. 이상한 이유로 당신은 항상 판매 된 모든 음료와 가격을 적절히 추적하는 것을 잊어 버리므로 소비되는 음료의 양이 주어지면 수학을 수행하는 짧은 (= 기억에 남는!) 코드를 생각해야합니다.

이 도전은 이미 2012 년 중학교 시험에서 내 UNI의 기능 프로그래밍 과정에 나타 났으며 교수님이 여기에 게시 할 수 있습니다. 우리는 시험 언어로 예제 솔루션을 제공했습니다.

입력

입력 내용은 공백을 포함하지 않는 문자열 목록이 될 것입니다-판매 된 음료의 이름입니다. 선호하는 일반적으로 사용되는 입력 방법을 사용하여 입력하십시오 .

산출

당신의 산출물은 단일 숫자가 될 것입니다-이것은 당신이 오늘 저녁에 생성 한 소득입니다. 선호하는 일반적으로 허용되는 출력 방법을 사용하여 출력하십시오 .

무엇을해야합니까?

이것은 각 음료에 개별적으로 적용됩니다.

  • 시작 가격은 10입니다.
  • 음료를 구입할 때마다 다음 구매자의 가격이 1 씩 올라갑니다.
  • 최대 가격은 50입니다. 음료를 50로 구매 한 경우 새로운 가격은 다시 10이됩니다.

당신의 임무는 위의 규칙에 주어진 음료의 입력 목록에 의해 생성 된 전체 수입을 찾는 것입니다.


궁금한 경우 : "50 벅은 실제로 음료 비용이 비싸다!", 이것은 50- 데시 벅, 그래서 50 * 0.1 * 단위이지만 부동 소수점 산술.

누가 이겼어?

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다! 표준 규칙이 적용됩니다.

잠재적 인 코너 케이스

입력 목록이 비어 있으면 출력은 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

자바 스크립트 (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]<50false 를 반환하므로로 d[x]=d[x]<50?d[x]+1:10설정 d[x]됩니다 10.
ETHproductions

나는 JS가 가지고 있다는 것을 잊어 버렸다 undefined. :)
Titus

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 바이트를 절약 해 준 Jonathan Allan에게 감사합니다. :)

내 이전 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

@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

펄 41 바이트

에 +1 포함 -p

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

개행을 입력합니다.

증분 해시 값의 : 10 이 있다면 undef, -40그건 경우 > 4950, 또는 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_backvector<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이미 제공된 것을 빈 컨테이너 를 메모리로 만듭니다 . 가격은에 계산하여 계산 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

Mathematica, 64 바이트

더 짧아야한다고 생각합니다.

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

Length/@Gather@#각 음료의 반복 횟수를 계산합니다. 가격 하락을 반영하기 위해 41을 초과 //.z_/;z>41:>Sequence[41,z-41]하는 정수 z41및 로 나눕니다 z-41. 그런 다음 각 카운트는 최대 41 (19+#)#/2개의 #음료 의 총 비용 인 공식에 연결됩니다. #마지막으로 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

클로저, 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.