프레드 워터 빌


9

프레드는 준 친근한 사람이지만 실제로는 의미가 있습니다.

이 때문에 Fred는 캘리포니아 로스 알토 스의 작은 아파트에 혼자 살고 있습니다. 프레드는 물에 대해 매우 구체적이기 때문에 의미가 있습니다. 따라서 그는 자신의 수도 요금이 무엇인지 파악하는 데 도움이 필요합니다.

당신의 임무는 입력으로 사용 된 물의 양 (항상 정수)을 고려하여 그의 수도 요금을 반환하는 함수 또는 프로그램을 작성하는 것입니다.

물 소비는 계층으로 제공됩니다. 이것은 물의 양에 따라 가격 범위가 있음을 의미합니다.

이들은 계층, 가격 및 해당하는 물의 양입니다.

Tier I
   First 10 Ccf: $3.8476/Ccf
Tier II
   Next 17 Ccf: $4.0932/Ccf
Tier III
   All subsequent water: $4.9118/Ccf

대한 N 입방 피트의 수백 (CCF)이 다음과 같은 추가 요금이 있습니다뿐만 아니라 :

CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n

Tier I, Tier II, Tier III, CPUC, LIRA 및 PBOP 수수료의 합계는 총 수도 요금입니다. 이 합계는 소수점 이하 두 자리로 반올림하거나 콘솔로 인쇄해야합니다.

다음은 두 가지 예입니다.

Input: 15
... Calculations which you do not need to output but here to help explain:
Tier I: 10*3.8476 = 38.476
Tier II: (15-10)*4.0932 = 20.466
Tier III: 0*4.9118 = 0
Tiers sum: 58.942
CPUC: 1.5% of 58.942 = 0.88413
LIRA: 0.047*15 = 0.705
PBOP: 0.004*15 = 0.06
Total sum: 58.942 + 0.88413 + 0.705 + 0.06 = 60.59113
...
Output: 60.59

Input: 100
... Calculations which you do not need to output but here to help explain:
Tier I: 10*3.8476 = 38.476
Tier II: 17*4.0932 = 69.5844
Tier III: (100-10-17)*4.9118 = 358.5614
Tiers sum: 466.6218
CPUC: 1.5% of  = 6.999327
LIRA: 0.047*100 = 4.7
PBOP: 0.004*100 = 0.4
Total sum: 478.721127
...
Output: 478.72

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


내 편집 내용이 귀하의 의도와 일치하는지 확인하십시오.
msh210

예, @ msh210에게 감사합니다. 제가 가진 것보다 훨씬 명확합니다.
Daniel

다운 투표에 대한 명성을 기꺼이 낭비하려는 경우 최소한 이유를 설명해 주시겠습니까?
Daniel

@Dopapp 어떤 사람들은 도전을 좋아하지 않을 수도 있습니다. 당신이 할 수있는 일은 없습니다. 가치있는 것에 대해, 하향 투표 도전 과제는 하향 투표자의 평판에서 차감되지 않으며 답만 있습니다.
Mego

정수가 아닌 것을 처리해야 n합니까?
PurkkaKoodari

답변:


1

Pyth, 55 41 바이트

.R+s*Vv.",9t¬®Ï0NwÝ"lMcUQ,T27*.051Q2

이 코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 xxd16 진수 덤프가 있습니다.

00000000: 2e52 2b73 2a56 762e 222c 3904 1874 c2ac  .R+s*Vv.",9..t..
00000010: c2ae c280 c293 c38f 301c 4e77 c39d 226c  ........0.Nw.."l
00000020: 4d63 5551 2c54 3237 2a2e 3035 3151 32    McUQ,T27*.051Q2

설명

  1. ."…"를 포함하는 압축 문자열입니다 3.8476,4.0932,4.9118.
  2. v그것을 튜플에 평가합니다 (3.8476, 4.0932, 4.9118). CPUC가 추가 된 계층의 가격입니다.
  3. UQ범위를 생성합니다 0n-1.
  4. c,T27범위가 너무 짧은 경우 인덱스 10과 27의 범위를 분할하고 끝에 빈 목록이 추가됩니다.
  5. lM 각 부분의 길이를 찾아 각 계층에 대한 물의 양을 제공합니다.
  6. *V 단계 2의 튜플로 곱하여 계층의 가격을 얻습니다.
  7. s 결과를 합산합니다.
  8. +*Q.051입력에 0.051을 곱한 값, 즉 LIRA + PBOP를 더합니다.
  9. .R2결과를 소수점 2 자리로 반올림합니다.

온라인으로 사용해보십시오.


2

수학, 83 76 69 바이트

1.015{3.8476,.2456(b=Boole)[#>10],.8186b[#>27],51/1015}&~Array~#~Total~2~Round~.01&

첫 번째 열에 3 개의 계층으로 구성된 배열과 네 번째 열에 임의의 정밀 숫자로 표시된 LIRA 및 PBOP를 구성하는 익명 함수. 모든 것이 곱해지고 1.015배열의 모든 요소가 합산되고 반올림됩니다 .01. 51/1015*1.015원하는 0.051것이 출력 이기 때문에 OP의 사양만큼 정확하게 출력이 정확합니다.

Perl 솔루션 아래의 의견에서 제안했듯이 76 바이트 의 짧은 솔루션

{3.956314,.249284(b=Boole)[#>10],.830879b[#>27]}&~Array~#~Total~2~Round~.01&

여기서 1.015시작부터 가격에 반영된 다음 LIRA 및 PBOP가 첫 번째 계층 위에 추가됩니다.

73 바이트 (그러나 이것은 간단한 Perl 솔루션에 매우 가깝기 때문에 바이트 수를 업데이트하는 것을 꺼려합니다) :

69 바이트 -아, 도대체 골프도 약간의 노력을 기울였습니다.

.01Round[395.6314#+{24.9284,83.0879}.(UnitStep[#-1]#&/@{#-10,#-27})]&

부동 소수점 오류에 대한 편집
내 답변의 처음 세 번의 반복은 실제로 십진 표현으로 정확합니다. 왜냐하면 관련된 모든 계수에는 종료 십진수 표현이 있기 때문입니다. 그러나 계수가 명시 적으로 부동 소수점이고 이진으로 저장되고 종료되지 않는 이진 표현을 갖기 때문에 충분히 큰 입력은 이진 표현의 최소 유효 자릿수에 오류를 누적하기 시작합니다. 부동 소수점이 너무 커서 소수점 오른쪽에 3-4 자릿수 만 맞으면 약 1 센트의 오차를 기대할 수 있습니다. 정확한 답변 은 아래를 참조하십시오 .

72 바이트, 다소 부정확 한 부동 면역

.01Round[{3956314,249284,830879}.(UnitStep[#-1]#&)/@(#-{0,10,27})/10^4]&

선행에 의한 곱셈 .01은 마지막 단계에서 수행됩니다. 이 시점까지 모든 계산은 정수로 수행됩니다. 즉,를 .01생략하면 정확한 결과가 있지만 달러가 아닌 센트로 표시됩니다. 물론 float에 의한 곱셈은 전체를 float로 변환하며, 언급 한 것처럼 64 비트에 맞을만큼 작고 여전히 정확해야 .01합니다.


2

05AB1E, 64 58 51 바이트

0T27¹)vy¹‚ï{0è})¥•_ÄÄ™wu24@•2'.:7ô)ø€PO¹"5.1"*+ïTn/

설명

0T27¹)                                               # list of price brackets
      vy¹‚ï{0è})                                     # min of each with input
                ¥                                    # calculate deltas to get amounts within each bracket
                 •_ÄÄ™wu24@•2'.:7ô                   # list of price rates with CPUC included
                                  )ø                 # zip with amounts for each rate
                                    €PO              # multiply amounts by their rates and sum
                                       ¹"5.1"*+      # add LIRA/PBOP
                                               ïTn/  # round to 2 decimals

온라인으로 사용해보십시오


1

펄 5, 73 바이트

확실한 해결책. 72 바이트, -ne대신 1을 더한 값 -e.

printf'%.2f',$_*3.956314+($_-10)*($_>10)*.249284+($_-27)*($_>27)*.830879

LLlAMnYP 덕분에 5 바이트를 절약했습니다 . 감사!


내 이전 의견에서,이 편집은 실제로 원래의 부동 소수점 오류를 제거 하는 것으로 나타났습니다 .
LLlAMnYP

@LLlAMnYP, 모든 근사값은 입력 값이 충분히 높을 때 오류가 있어야합니다. 잘만되면 그 범위는 OP가 신경 쓰지 않을 정도로 충분히 높을 것입니다.
msh210

@ msh210 당신은 Fred의 이야기를 몰라요 !!
고양이

유한 한 십진수로 숫자를 곱하고 더하기 때문입니다. 물론, 그것들을 float로 표현할 때, 그렇게 큰 바이너리 표현이 아닐 수도 있습니다. 부동 소수점 표현이 소수점 오른쪽에 3-4 자릿수 만 허용하면 오류가 발생할 수 있습니다. 내 게시물의 맨 아래에있는 "보너스 답변"은 마지막 단계 (센트를 달러로 변환)까지 정수를 사용하여 이것을 극복합니다. 로 곱셈을 생략 .01하면 정수를 저장할 수있는 한 정확하게 유지됩니다.
LLlAMnYP

1

Oracle SQL 11.2, 151 바이트

SELECT ((DECODE(SIGN(:1-10),1,10,:1)*3.8476)+(DECODE(SIGN(:1-27),1,17,:1-10)*4.0932)+(DECODE(SIGN(:1-27),-1,0,:1-27)*4.9118))*1.015+:1*0.051 FROM DUAL;

언 골프

SELECT ((DECODE(SIGN(:1-10),1,10,:1)*3.8476)+
       (DECODE(SIGN(:1-27),1,17,:1-10)*4.0932)+
       (DECODE(SIGN(:1-27),-1,0,:1-27)*4.9118))*1.015+
       :1*0.051
FROM DUAL

사이의 공간을 제거 SELECT하고 ((DECODE하나의 바이트를 저장합니다. 명명 된 테이블을 사용하여 10 바이트를 더 절약하십시오! 콜론을 제거하고 하나의 char 열 이름에 하나의 char 테이블 이름을 사용하고 3을 사용하여 7을 사용하십시오.
Giacomo Garabello

@Giacomo Garabello : 공간을 제거하면 항상 두꺼비에서 null을 반환하고 SQLDeveloper에서 오류를 반환합니다. 테이블 작성 스크립트는 10 바이트 이상을 추가합니다.
Jeto

작성 스크립트를 추가 할 필요가 없습니다 ... 여기를보십시오
Giacomo Garabello

1

자바 스크립트 ES6, 77 바이트

x=>(x>27?(x-27)*4.985477+109.681:(x>10?(x-10)*4.1546+39.053:x*3.9053))+.051*x

언 골프

f = x => {
  if (x > 27) {
    res = (x - 27) * 4.985477 + 109.681306
  } else if (x > 10) {
    res = (x - 10) * 4.154598 + 39.05314
  } else {
    res = x * 3.905314
  }
  return res + 0.051 * x
}

LIRA 및 PBOP 계수를 고려했습니다. 추가로 1.5 %가 추가됩니다.

아마도 골프 측면에서 가장 효율적인 솔루션은 아니지만 Perl과는 다소 다릅니다.

부동 소수점 오류는 더 큰 숫자로 발생해야하며 각 계수에 1 또는 2 개의 추가 바이트를 추가하여 수정할 수 있습니다.

f=x=>(x>27?(x-27)*4.985477+109.681:(x>10?(x-10)*4.1546+39.053:x*3.9053))+.051*x

console.log(f(15))
console.log(f(100))
console.log(f(200000))


당신은 필요가 없습니다 ()주위에들 x>10?:, ?:동료는 오른쪽에서 왼쪽으로. 또한 (x-10)*4.154598+39.05314equals x*4.154598-41.54598+39.05314equals와 같이 괄호를 곱하여 바이트를 절약 할 수 있다고 생각합니다 x*4.154598-2.49284.
Neil

1

R , 52 바이트

approxfun(c(0,10,27,10^6),c(0,39.56,111.06,5036475))

온라인으로 사용해보십시오!

0,10,27 및 10 ^ 6의 이전 답변 값을 기반으로 선형 근사 함수를 생성합니다. 캐치 : 입력의 상한은 10 ^ 6입니다.

approxfun(와 ecdf, stepfun, splinefun, 등)의 많은 좋은 기능 중 하나입니다 R.


0

VBA, 88 바이트

Function W(V):W=Round(.051*V+.203*(V*19.238-(V-10)*(V>10)*1.228-(V-27)*(V>27)*4.093),2)
 

기본 요율과 더 높은 사용 차등 요율에 5를 곱하고 CPUC 수수료 승수를 5 (0.203)로 나눕니다.

VB 편집기는 End Function라인 을 추가 하므로 터미널 라인 피드가 포함됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.