ค่าน้ำของ Fred


9

เฟร็ดเป็นคนที่เป็นมิตร แต่ในความเป็นจริงแล้วเขาเป็นคนมีความหมาย

ด้วยเหตุนี้เฟร็ดจึงอาศัยอยู่ตามลำพังในอพาร์ตเมนต์เล็ก ๆ ในลอสอัลตอสแคลิฟอร์เนีย เฟร็ดมีความหมายเพราะเขามีความเฉพาะเจาะจงเกี่ยวกับน้ำ ดังนั้นเขาต้องการความช่วยเหลือจากคุณในการหาว่าค่าน้ำของเขาคืออะไร

งานของคุณคือการเขียนฟังก์ชั่นหรือโปรแกรมที่คืนค่าน้ำของเขาตามปริมาณน้ำที่ใช้เป็นอินพุต (ซึ่งมักจะเป็นจำนวนเต็ม)

ปริมาณการใช้น้ำมาในระดับ ซึ่งหมายความว่ามีช่วงราคาขึ้นอยู่กับปริมาณน้ำ

นี่คือระดับราคาและปริมาณน้ำที่พวกเขาสอดคล้องกับ:

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

ยอดรวมของเงินกองทุนชั้นที่ 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 บางคนอาจไม่ชอบความท้าทาย คุณไม่สามารถทำอะไรได้ที่นั่น สำหรับสิ่งที่คุ้มค่าความท้าทายในการ Downvoting ไม่ได้เป็นการลบชื่อเสียงของผู้ลงคะแนน - เพียงคำตอบเท่านั้น
Mego

เราต้องจัดการไม่ใช่จำนวนเต็มnหรือไม่?
PurkkaKoodari

คำตอบ:


1

Pyth, 55 41 ไบต์

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

รหัสมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือxxdhexdump

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)tuple นี่คือราคาของระดับที่คูณด้วย CPUC ที่เพิ่ม
  3. UQสร้างช่วง0n-1.
  4. c,T27แยกช่วงที่ดัชนีที่ 10 และ 27 ด้วยรายการว่างพิเศษในท้ายที่สุดถ้าช่วงสั้นเกินไป
  5. lM ค้นหาความยาวของแต่ละส่วนให้ปริมาณน้ำสำหรับแต่ละชั้น
  6. *V คูณด้วย tuple จากขั้นตอนที่ 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&

ฟังก์ชั่นไม่ระบุชื่อที่สร้างอาเรย์ของสามระดับในคอลัมน์แรกรวมทั้ง LIRA และ PBOP ที่แสดงเป็นจำนวนความแม่นยำโดยพลการในคอลัมน์ที่สี่ สิ่งที่ทั้งถูกคูณด้วยและองค์ประกอบทั้งหมดของอาร์เรย์จะสรุปและโค้งมนไป1.015 .01เนื่องจาก51/1015*1.015จะเป็นไปตามที่ต้องการ0.051เอาต์พุตจึงมีความแม่นยำตรงตามข้อกำหนดใน OP

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

{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ถูกละไว้จะมีผลลัพธ์ที่แน่นอนแต่แสดงเป็นเซ็นต์แทนที่จะเป็นดอลลาร์ แน่นอนคูณโดยลอยแปลงสิ่งทั้งหมดที่จะลอยและดังกล่าวจะต้องมีขนาดเล็กพอที่จะใส่ลงไปใน 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

Perl 5, 73 ไบต์

ทางออกที่ชัดเจน 72 ไบต์บวก 1 แทน-ne-e

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

ที่บันทึกไว้ 5 ไบต์ขอบคุณที่LLlAMnYP ขอบคุณ!


จากความคิดเห็นก่อนหน้าของฉันการแก้ไขนี้กลับกลายเป็นการกำจัดข้อผิดพลาดจุดลอยตัวที่คุณมีในต้นฉบับ
LLlAMnYP

@LLAMNYP แน่นอนการประมาณใด ๆ จะต้องมีข้อผิดพลาดสำหรับค่าที่สูงพอของอินพุต หวังว่าขอบเขตจะสูงพอที่ OP จะไม่สนใจ (เพราะมันเป็นปริมาณน้ำที่ไม่สมเหตุสมผลสำหรับบ้านของคนเดียว)
msh210

@ msh210 คุณไม่รู้เรื่องราวของเฟร็ด !!
แมว

ไม่เพราะคุณกำลังทวีคูณและเพิ่มตัวเลขด้วยการแทนทศนิยมที่ จำกัด แน่นอนว่าเมื่อคุณแทนพวกมันว่าเป็นแบบลอยตัวพวกมันอาจมีการแสดงเลขฐานสองที่ไม่ดีนัก จากนั้นคุณสามารถคาดหวังข้อผิดพลาดเมื่อการแสดงทศนิยมอนุญาตให้มีเพียง 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 ไบต์โดยใช้ตารางชื่อ! 7 โดยการลบเครื่องหมายโคลอนและใช้ชื่อคอลัมน์ถ่านหนึ่งตัวและอีกสามตัวใช้ชื่อถ่านหนึ่งตัว
Giacomo Garabello

@Giacomo Garabello: การลบช่องว่างส่งคืน null ด้วยคางคกเสมอและส่งคืนข้อผิดพลาดกับ SQLDeveloper สคริปต์สร้างตารางเพิ่มมากกว่า 10 ไบต์
Jeto

คุณไม่ต้องเพิ่มสคริปต์การสร้าง ... ดูที่นี่
Giacomo Garabello

1

JavaScript 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.05314เท่ากับเท่ากับx*4.154598-41.54598+39.05314 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.