소개 및 신용
당신이 바텐더라고 가정하십시오. 당신은 대부분의 술집에 많은 행복한 사람들이 있지만, 많은 사람들은 항상 같은 음료를 마시고 취향에 비해 너무 적은 음료수를 마시고 그것을 바꾸고 싶어합니다. 따라서 이미 판매 된 수량에 따라 음료 가격이 변동이 있지만 특정 임계 값보다 높거나 적은 시스템을 소개합니다. 이상한 이유로 당신은 항상 판매 된 모든 음료와 가격을 적절히 추적하는 것을 잊어 버리므로 소비되는 음료의 양이 주어지면 수학을 수행하는 짧은 (= 기억에 남는!) 코드를 생각해야합니다.
이 도전은 이미 2012 년 중학교 시험에서 내 UNI의 기능 프로그래밍 과정에 나타 났으며 교수님이 여기에 게시 할 수 있습니다. 우리는 시험 언어로 예제 솔루션을 제공했습니다.
입력
입력 내용은 공백을 포함하지 않는 문자열 목록이 될 것입니다-판매 된 음료의 이름입니다. 선호하는 일반적으로 사용되는 입력 방법을 사용하여 입력하십시오 .
산출
당신의 산출물은 단일 숫자가 될 것입니다-이것은 당신이 오늘 저녁에 생성 한 소득입니다. 선호하는 일반적으로 허용되는 출력 방법을 사용하여 출력하십시오 .
무엇을해야합니까?
이것은 각 음료에 개별적으로 적용됩니다.
- 시작 가격은 10입니다.
- 음료를 구입할 때마다 다음 구매자의 가격이 1 씩 올라갑니다.
- 최대 가격은 50입니다. 음료를 50로 구매 한 경우 새로운 가격은 다시 10이됩니다.
당신의 임무는 위의 규칙에 주어진 음료의 입력 목록에 의해 생성 된 전체 수입을 찾는 것입니다.
궁금한 경우 : “50 벅은 실제로 음료 비용이 비싸다!”, 이것은 50- 데시 벅, 그래서 50 * 0.1 * 단위이지만 부동 소수점 산술.
누가 이겼어?
이것은 code-golf 이므로 바이트 단위의 가장 짧은 코드가 이깁니다! 표준 규칙이 적용됩니다.
잠재적 인 코너 케이스
입력 목록이 비어 있으면 출력은 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
답변
자바 스크립트 (ES6), 50 바이트
a=>a.map(x=>t+=d[x]=d[x]<50?d[x]+1:10,t=0,d={})&&t
답변
파이썬 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:])
답변
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
답변
젤리 , 14 11 10 바이트
50⁵rṁЀĠSS
어떻게?
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
답변
답변
펄 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
답변
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