ดอกเบี้ยทบต้น ... ด้วยเงินของพ่อมด


15

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

งานของคุณคือการคำนวณจำนวนเงินที่ค้างชำระทั้งหมดหลังจากดอกเบี้ยที่ได้รับเงินต้นอัตราดอกเบี้ยและเวลา (ทั้งปี) การดำเนินงานในเงินทั้งหมดของตัวช่วยสร้างเงินปัดเศษลงเป็น Knut ทั้งหมดที่ใกล้ที่สุด มีน็อตบรอนซ์ 29 อันในเคียวเงินและ 17 เคียวเกิลในโกลด์กัลเลียน

ตัวอย่าง

Loan taken out:
 23 Knuts
 16 Sickles
103 Galleons
@ 7.250%
For 3 years

Total owed after interest:
 24 Knuts
  4 Sickles
128 Galleons

หมายเหตุและกฎ

  • อินพุตและเอาต์พุตอาจอยู่ในรูปแบบที่สะดวก คุณต้องใช้ Knuts, Sickles, Galleons, อัตราดอกเบี้ยและเวลา ทั้งหมด แต่อัตราดอกเบี้ยจะเป็นจำนวนเต็ม อัตราดอกเบี้ยเพิ่มขึ้น 0.125%
  • ไม่รับประกันว่าท่านจะได้รับเงินอินพุทเป็นที่ยอมรับ (เช่นคุณสามารถมี Knuts ได้ตั้งแต่ 29 ขึ้นไปและ 17 Sickles หรือมากกว่า)
  • ผลลัพธ์จะต้องเป็นรูปแบบบัญญัติ (เช่นน้อยกว่า 29 Knuts และน้อยกว่า 17 Sickles)
  • ยอดรวมที่ค้างชำระมากถึง 1,000 Galleons ควรถูกต้องภายใน 1 Knut ต่อปีที่น่าสนใจเมื่อเปรียบเทียบกับการคำนวณความแม่นยำโดยพลการ
    • คุณสามารถปัดเศษลงหลังจากปีที่สนใจหรือสิ้นสุดเท่านั้น การคำนวณอ้างอิงสามารถนำมาพิจารณาในการตรวจสอบความถูกต้องได้

มีความสุขในการเล่นกอล์ฟ!


4
เราสามารถใช้อัตราดอกเบี้ยเป็นทศนิยมแทนที่จะเป็นเปอร์เซ็นต์ได้หรือไม่? (เช่น0.0725แทน7.25)
Shaggy

@Shaggy ฉันต้องการทราบสิ่งนี้ด้วย
senox13

หากเงินกู้เท่ากับ 1 Knut และดอกเบี้ย 99% ต่อปีและระยะเวลา 1 ปีผลลัพธ์ควรเป็น "1 Knut" หรือ "2 Knuts"
Chas Brown

โปรดอธิบายความหมายทางคณิตศาสตร์ของวลีrounding down
senox13

1
@ChasBrown: 1 Knut ตัดส่วน / ฟังก์ชั่นพื้นไปที่ Knut ทั้งหมดที่ใกล้ที่สุด
Beefster

คำตอบ:


6

R , 70 62 ไบต์

function(d,i,y)(x=d%*%(a=c(1,29,493))*(1+i)^y)%/%a%%c(29,17,x)

ลองออนไลน์!

รับอินพุตเป็น d: ฝากเงินใน knuts, เคียว, เกลเลียน; i: อัตราดอกเบี้ยเป็นทศนิยม y: ปี เอาท์พุทฝากขั้นสุดท้ายใน knuts, เคียว, เกลเลียน ขอบคุณ @Giuseppe สำหรับการใช้การคูณเมทริกซ์เพื่อบันทึกไบต์จำนวนหนึ่ง (และชี้ให้เห็นวิธีหลีกเลี่ยงความต้องการห่อที่ 1e99)


ฉันไม่รู้จัก R; สิ่งที่พวกเขาห่อรอบชนะคุณ?
dfeuer

@dfeuer พวกเขาได้รับ mod 1e99 ดังนั้นถ้าเกลเลียนของคุณสูงมากพวกเขาจะลดลงเหลือศูนย์
Nick Kennedy

สิ่งที่ฉันสงสัยคือสิ่งที่คุณได้รับจากการทำ mod 1e99
dfeuer

ฟังก์ชั่น R ส่วนใหญ่เป็น vectorised ในกรณีนี้ฉันกำลังส่งเอาต์พุตผ่าน%%ฟังก์ชั่นซึ่งก็คือ mod เป็นการดีที่ฉันต้องการออกจากเกลเลียนเพียงอย่างเดียว แต่การใช้จำนวนอินฟินิตี้ mod ส่งคืน NaN และดังนั้นฉันจึงใช้จำนวนมากจริงๆ (แต่อันที่มีหน่วยเป็นไบต์) ทางเลือกที่ฉันใช้มานานกว่านั้น (เช่น [ tio.run/##JYrLCsIwEEV/ …ลองออนไลน์!])
Nick Kennedy

@NickKennedy คุณสามารถทำได้9e99เช่นกัน ... นอกจากนี้คุณยังสามารถเล่นกอล์ฟได้ถึง63 ไบต์
Giuseppe

4

Python 3.8 (เผยแพร่ล่วงหน้า) , 75 74 71 ไบต์

-1 ไบต์ขอบคุณ @EmbodimentofIgnorance
-3 ไบต์ขอบคุณ @xnor

สิ่งนี้ใช้เวลาเป็น Knuts, Sickles และ Galleons เป็นดอกเบี้ยดอกเบี้ยลอยตัว (ทศนิยมไม่ใช่เปอร์เซ็นต์) และปีเป็น int ส่งคืน tuple ที่มีจำนวนหลังจากดอกเบี้ยของ Knuts, Sickles และ Galleons ตามลำดับ

lambda K,S,G,R,Y:((k:=int((K+G*493+S*29)*(1+R)**Y))%29,k//29%17,k//493)

การใช้งาน:

>>> print(I(23,16,103,0.0725,3))
(24, 4, 128)

ลองออนไลน์!


จับดี. อัปเดตคำตอบ
senox13

operating in whole denominations of wizard money, rounding downคำถามที่ว่า ฉันrounding downหมายถึงchop off everything after the decimal point.การใช้ส่วนหัวดูเหมือนจะเป็นวิธีที่ง่ายกว่าในการทำสิ่งต่าง ๆ ฉันจะทำเพื่อโพสต์ในอนาคตขอบคุณ
senox13

ฟังดูคล้ายกับ "truncating" มากกว่า "การปัดเศษ" มากกว่า แต่ฉันได้ขอ OP เพื่อความกระจ่าง (เพราะ nit-picking เป็นชื่อของเกมที่นี่ที่ PPCG :))
Chas Brown

ฉันไม่เห็นด้วยกับคุณนั่นเป็นเพียงความหมายที่ฉันเห็นเสมอสำหรับการปัดเศษเพราะคุณมักปัดเศษเป็นจำนวนเต็มต่ำกว่าผลลัพธ์ของคุณ มิฉะนั้นมันเป็นเพียงการปัดเศษปกติ ให้ OP ตัดสินใจว่าเป็นความคิดที่ดี
senox13

FYI, เคล็ดลับที่มีประโยชน์เพื่อให้ฟังก์ชั่นที่ไม่ระบุชื่อทดสอบใน TIO คือการใส่I\=ในส่วนหัวเช่นนี้ นอกจากนี้ก็ดูเหมือนว่าจะสามารถk//29//17 k//493
xnor

3

APL + WIN, 37 28 26 ไบต์

⌊a⊤((a←0 17 29)⊥⎕)×(1+⎕)*⎕

บันทึก 2 ไบต์ขอบคุณ lirtosiast

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

(1+⎕)*⎕ prompts for years followed by decimal interest rate and calculates
         compounding multiplier

((a←0 17 29)⊥⎕) prompts for Galleons, Sickles and Knuts and converts to Knuts

⌊a⊤ converts back to Galleons, Sickles and Knuts and floor 
    after applying compound interest. 

⌊a⊤(⎕⊥⍨a←0 17 29)×⎕*⍨1+⎕สำหรับ 24
lirtosiast

@loslosiast ขอบคุณ แต่ฉันกลัวล่าม APL + WIN โบราณของฉันไม่มีฟังก์ชัน⍨ โดยทั้งหมดส่งสิ่งนี้เป็นโซลูชัน APL ของคุณเอง
เกรแฮม

@lirtosiast ขอบคุณอีกครั้งฉันได้รับ 2 ไบต์เป็นผลมาจากการกำหนดให้
เกรแฮม

3

Perl 6 , 47 ไบต์

((1+*)*** *(*Z*1,29,493).sum+|0).polymod(29,17)

ลองออนไลน์!

ฉันประหลาดใจที่ฉันสามารถทำให้สิ่งนี้เป็นนิรนามไม่ว่าอะไรก็ตามแลมบ์ดา! โดยเฉพาะอย่างยิ่งส่วนที่มัน*มากกว่าสิ่งอื่นใด รับอินพุตinterest rate (e.g. 0.0725), years, [Knuts, Sickles, Galleons]และส่งคืนรายการสกุลเงินในลำดับเดียวกัน

คำอธิบาย:

 (1+*)           # Add one to the interest rate
      ***        # Raise to the power of the year
          *      # And multiply by
           (*Z*1,29,493).sum      # The number of Knuts in the input
                            +|0   # And floor it
(                              ).polymod(29,17)   # Get the modulos after divmoding by 29 and 17

ฉันประหลาดใจที่คุณไม่ได้คิดวิธีที่จะทำให้ได้จำนวน Knuts / Sickles / Galleons เพื่อให้เข้ากับผู้เล่น จากนั้นมันก็จะเป็นเอ๊ะเช่น ************************* ;-)
user0721090601

@ guifa The Whatevers เป็นอินพุตดังนั้นสามารถมีได้เพียง 3 ตัวเท่านั้น (แม้ว่าฉันจะสามารถแยกอินพุตสกุลเงินสำหรับs เพิ่มเติม*ได้แต่ไบต์มากกว่า) ส่วนที่เหลือ*นั้นมาจากการคูณ ( *) และเลขชี้กำลัง ( **)
โจคิง

ฉันหมายถึงถ้าคุณได้รับอัตราการแปลง (หมายเลข 29/17) เข้ามาด้วย แต่แน่นอนว่ามันเป็นเรื่องตลกเพราะคุณต้องใช้ตัวเลขเหล่านั้นมากกว่าหนึ่งครั้ง ขออภัยถ้าอารมณ์ขันของฉันไม่ผ่าน
user0721090601

2

เยลลี่ 29 ไบต์

“¢×ø‘©×\
÷ȷ2‘*⁵×÷¢S×¢d®U1¦Ṫ€Ḟ

โปรแกรมเต็มรูปแบบที่รับอาร์กิวเมนต์: rate; [Galleons, Sickles, Knuts]; years. พิมพ์
[Galleons, Sickles, Knuts]

ลองออนไลน์!

ชั้นเมื่อสิ้นสุดระยะเวลาทั้งหมด
÷ȷ2อาจถูกลบออกถ้าเราอาจยอมรับอัตราเป็นอัตราส่วนแทนที่จะเป็นเปอร์เซ็นต์

อย่างไร?

“¢×ø‘©×\ - Link 1 multipliers: no arguments
“¢×ø‘    - list of code-age indices = [1,17,29]
     ©   - (copy this to the register for later use)
       \ - reduce by:
      ×  -   multiplication  = [1,17,493]

÷ȷ2‘*⁵×÷¢S×¢d®U1¦Ṫ€Ḟ - Main Link
 ȷ2                  - 10^2 = 100
÷                    - divide = rate/100
   ‘                 - increment = 1+rate/100
     ⁵               - 5th command line argument (3rd input) = years
    *                - exponentiate = (1+rate/100)^years --i.e. multiplicand
      ×              - multiply (by the borrowed amounts)
        ¢            - call last Link as a nilad
       ÷             - divide (all amounts in Galleons)
         S           - sum (total Galleons owed)
           ¢         - call last Link as a nilad
          ×          - multiply (total owed in each of Galleons, Sickles, Knuts)
             ®       - recall from register = [1,17,29]
            d        - divmod (vectorises) = [[G/1, G%1], [S/17, S^17], [K/17, K%17]]
              U1¦    - reverse first one = [[G%1, G/1], [S/17, S%17], [K/17, K%17]]
                 Ṫ€  - tail €ach = [G/1, S%17, K%17]
                   Ḟ - floor (vectorises)

2

ชุดประกอบ Intel 8087 FPU ขนาด 86 ไบต์

d9e8 d906 7f01 dec1 8b0e 8301 d9e8 d8c9 e2fc df06 7901 df06 8701 df06
7b01 df06 8501 df06 7d01 dec9 dec1 dec9 dec1 dec9 9bd9 2e89 01df 0687
01df 0685 01d9 c1de c9d9 c2d9 f8d8 f2df 1e7b 01d8 fadf 1e7d 01d9 c9d9
f8df 1e79 01

ไม่ได้ประกอบและจัดทำเอกสาร:

; calculate P+I of loan from wizard
; input:
;   G: number of Galleons (mem16)
;   S: number of Sickles (mem16)
;   K: number of Knuts (mem16)
;   R: interest rate (float)
;   T: time in years (mem16)
;   GS: Galleons to Sickles exchange rate (mem16)
;   SK: Sickles to Knuts exchange rate (mem16)
; output:
;   G: number of Galleons (mem16)
;   S: number of Sickles (mem16)
;   K: number of Knuts (mem16)
WIZ_INT_CALC    MACRO   G, S, K, R, T, GS, SK
                LOCAL   LOOP_EXP
                    ; - calculate interet rate factor
    FLD1            ; load 1
    FLD   R         ; load interest rate
    FADD            ; ST = rate + 1
    MOV   CX, T     ; Exponent is count for loop
    FLD1            ; load 1 into ST as initial exponent value
LOOP_EXP:           ; loop calculate exponent
    FMUL  ST,ST(1)  ; multiply ST = ST * ST(1)
    LOOP  LOOP_EXP
                    ; - convert demonimations to Knuts
    FILD  K         ; load existing Knuts
    FILD  SK        ; load Sickles to Knuts rate 
    FILD  S         ; load existing Sickles
    FILD  GS        ; load Galleons-to-Sickles exchange rate
    FILD  G         ; load existing Galleons
    FMUL            ; multiply galleons to get sickles
    FADD            ; add existing sickles
    FMUL            ; multiply sickles to get knuts
    FADD            ; add existing knuts
    FMUL            ; calculate P+I (P in Knuts * Interest factor)
                    ; - redistribute demonimations to canonical form
    FLDCW  FRD      ; put FPU in round-down mode
    FILD   SK       ; load Sickles to Knuts rate
    FILD   GS       ; load Galleons-to-Sickles exchange rate
    FLD    ST(1)    ; copy Galleons-to-Sickles exchange rate to stack for later
    FMUL            ; multiply to get Galleons-to-Knuts rate
    FLD    ST(2)    ; push original total Knuts from ST(2) into ST (lost by FPREM)
    FPREM           ; get remainder
    FDIV   ST,ST(2) ; divide remainder to get number of Sickles
    FISTP  S        ; store Sickles to S
    FDIVR  ST,ST(2) ; divide to get number of Galleons
    FISTP  G        ; store Galleons to G
    FXCH            ; swap ST, ST(1) for FPREM
    FPREM           ; get remainder to get number of Knuts
    FISTP  K        ; store Knuts to K
        ENDM

ใช้งานเป็น MACRO (โดยทั่วไปเป็นฟังก์ชั่น) นี่เป็นรหัสเครื่องที่ไม่ใช่ระบบปฏิบัติการโดยใช้เฉพาะโปรเซสเซอร์ Intel 80x87 FPU / คณิตศาสตร์สำหรับการคำนวณ

ตัวอย่างโปรแกรมทดสอบที่มีเอาต์พุต:

    FINIT           ; reset FPU

    WIZ_INT_CALC    G,S,K,R,T,GS,SK     ; do the "Wizardy"

    MOV  AX, K      ; display Knuts
    CALL OUTDEC     ; generic decimal output routine
    CALL NL         ; CRLF

    MOV  AX, S      ; display Sickles
    CALL OUTDEC     ; generic decimal output routine
    CALL NL         ; CRLF

    MOV  AX, G      ; display Galleons
    CALL OUTDEC     ; generic decimal output routine
    CALL NL         ; CRLF

    RET             ; return to DOS

K   DW  23          ; initial Kunts
S   DW  16          ; initial Sickles
G   DW  103         ; initial Galleons
R   DD  0.0725      ; interest rate
T   DW  3           ; time (years)
GS  DW  17          ; Galleons to Sickles exchange rate
SK  DW  29          ; Sickles to Knuts exchange rate
FRD DW  177FH       ; 8087 control word to round down

เอาท์พุต

ป้อนคำอธิบายรูปภาพที่นี่



1

Haskell , 73 ไบต์

(g#s)k r n|(x,y)<-truncate((493*g+29*s+k)*(1+r)^n)%29=(x%17,y)
(%)=divMod

ลองออนไลน์!

ขอบคุณ @Laikoni สำหรับสองไบต์

ลูกเล่นสกปรก: จำนวนเหรียญในอินพุทคือทศนิยม ( Double) ในขณะที่จำนวนเหรียญในเอาท์พุทนั้นเป็นส่วนประกอบ ( Integer) ผลที่ได้คือคู่ที่ซ้อนกัน((Galleons, Sickles), Knotts)เพื่อหลีกเลี่ยงการแบนเป็นสาม

คำอธิบาย

-- Define a binary operator # that
-- takes the number of Galleons
-- and Slivers and produces a
-- function taking the number of
-- Knots, the rate, and the
-- number of years and producing
-- the result.
(g#s) k r n
   -- Calculate the initial value
   -- in Knotts, calculate the
   -- final value in Knotts,
   -- and divide to get the number
   -- of Galleons and the
   -- remainder.
  |(x,y)<-truncate((493*g+29*s+k)*(1+r)^n)%29
  -- Calculate the number of Slivers
  -- and remaining Knotts.
  =(x%17,y)
(%)=divMod

1
บันทึกไบต์ที่สองกับ(truncate$ ... )-> truncate( ... )และแทน(g#s)k r n c g s k r n
Laikoni

@Laikoni ขอบคุณมาก!
dfeuer

@Laikoni ฉันจะขอบคุณถ้าคุณสามารถหาฉันสองสามไบต์ในcodegolf.stackexchange.com/questions/55960/…ถ้าคุณมีเวลา
dfeuer

1
ฉันจะดูมันเมื่อฉันค้นหาเวลา ในขณะเดียวกันฉันสามารถชี้ให้คุณไปที่ห้องแชท Haskell ของ Monads and Menและไปยังคำถามนี้ซึ่งคุณอาจจะได้รับ Hugs / GHC polyglots ของคุณ
Laikoni


1

TI-BASIC (TI-84), 96 90 ไบต์

:SetUpEditor C:Ans→∟C:∟C(1)+29∟C(2)+493∟C(3)→T:T(1+∟C(4))^∟C(5)→T:remainder(iPart(T),493→R:{remainder(R,29),iPart(R/29),iPart(T/493)}

อินพุตคือAnsรายการที่มี 5 รายการ: Knuts, Sickles, Galleons, ดอกเบี้ย (ฐานสิบ) และเวลา (ปี)
เอาต์พุตอยู่ในAnsและพิมพ์ออกมาโดยอัตโนมัติเมื่อโปรแกรมเสร็จสิ้น

ยกเลิกแข็งแรงเล่นกอล์ฟ:

:SetUpEditor C 
:Ans→∟C
:∟C(1)+29∟C(2)+493∟C(3)→T
:T(1+∟C(4))^∟C(5)→T
:remainder(iPart(T),493→R
:{remainder(R,29),iPart(R/29),iPart(T/493)}

ตัวอย่าง:

{32,2,5,0.05,5}
       {32 2 5 .05 5}
prgmCDGF1
            {12 10 6}

คำอธิบาย:

:SetUpEditor C
:Ans→∟C

รายการใหม่∟Cถูกสร้างและAnsเก็บไว้ในรายการ

:∟C(1)+29∟C(2)+493∟C(3)→T

Knuts, ซิกเกิ้ลและเกลเลียนจะถูกแปลงเป็น Knuts Tและเก็บไว้ใน

:T(1+∟C(4))^∟C(5)→T

รับจำนวน Knuts และใช้ดอกเบี้ยทบต้นกับมัน
คำนวณดอกเบี้ยที่นี่

:remainder(iPart(T),493→R

ร้านค้าผม nteger ส่วนของTโมดูโล 493 Rเข้า ใช้เพื่อย่นจำนวนไบต์

:{remainder(R,29),iPart(R/29),iPart(T/493)}

ประเมินรายการที่มี 3 รายการ (Knuts, Sickles และ Galleons) Ansรายการจะถูกเก็บไว้โดยอัตโนมัติใน


หมายเหตุ: การ นับจำนวนไบต์จะถูกประเมินโดยการนับจำนวนไบต์ที่กำหนดใน[MEM][2] [7] (รายการโปรแกรมใน RAM) และลบจำนวนอักขระในชื่อโปรแกรมและ 8 ไบต์พิเศษที่ใช้สำหรับโปรแกรม:

103 - 5 - 8 = 90 ไบต์


0

K, 46 ไบต์

c:1000 17 29
t:{c\:{z(y*)/x}[c/:x;1+y%100;z]}

c เก็บรายการสำหรับการแปลงฐาน

t เป็นฟังก์ชันที่คำนวณยอดรวม

ใช้ตัวอย่าง:

t[103 16 23;7.25;3]

เขียน (128;4;24.29209)

คำอธิบาย:

  • c/:x แปลงรายการ (galleon; เคียว; knuts) เป็น kuts

  • 1+y%100 คำนวณอัตราดอกเบี้ย (ตัวอย่าง 1.0725 สำหรับอัตรา 7.25%)

  • แลมบ์ดา{z(y*)\x}ทำงานได้: ทำซ้ำ 3 ครั้งใช้การแทรกภายในหลักและคืนหลักสุดท้าย

  • c\: สร้างเกลเลียนเคียว knuts จาก Knuts

NOTE.- หากคุณไม่ต้องการชื่อฟังก์ชั่นเราสามารถใช้แลมบ์ดาได้โดยประหยัด 2 ไบต์ {c\:{z(y*)/x}[c/:x;1+y%100;z]}inputArgs


0

C # (Visual C # Interactive คอมไพเลอร์) , 86 ไบต์

(a,b,c)=>((k=(int)((a.a*493+a.b*29+a.c)*Math.Pow(1+b,c)))/493,(k%=493)/29,k%29);int k;

ใช้ inout เป็น tuple ที่มีชื่อโดยมี 3 ค่าที่แสดงถึง knuts, เคียว, และเกลเลียนและอัตราดอกเบี้ยเป็นสองเท่า (ไม่ใช่เปอร์เซ็นต์) ฉันหวังว่า C # จะมีผู้ดำเนินการเลขชี้กำลัง Math.Pow ยาวเกินไป :(

ลองออนไลน์!


0

แบตช์ 171 ไบต์

@set i=%4
@set/af=0,i=8*%i:.=,f=%,f*=8
@set/ai+=%f:~,1%,k=%1*493+%2*29+%3
@for /l %%y in (1,1,%5)do @set/ak+=k*i/800
@set/ag=k/493,s=k/29%%17,k%%=29
@echo %g% %s% %k%

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งตามลำดับ Galleons, Sickles, Knuts, Interest, Years ความสนใจเป็นเปอร์เซ็นต์ แต่แสดงโดยไม่มีเครื่องหมาย% ตัดทอนทุก ๆ ปี เอาต์พุตอยู่ในลำดับ Galleons, Sickles, Knuts รองรับอย่างน้อย 5,000 เกลเลียน คำอธิบาย:

@set i=%4
@set/af=0,i=8*%i:.=,f=%,f*=8

ชุดเท่านั้นมีเลขคณิตจำนวนเต็ม โชคดีที่อัตราดอกเบี้ยมีอยู่หลายเท่า0.125เท่า เราเริ่มต้นด้วยการแยกที่จุดทศนิยมดังนั้นมันiจะกลายเป็นส่วนจำนวนเต็มของอัตราดอกเบี้ยและfเศษทศนิยม เหล่านี้จะถูกคูณด้วย 8 fตอนนี้ตัวเลขตัวแรกของจำนวนแปดในอัตราดอกเบี้ยร้อยละ

@set/ai+=%f:~,1%,k=%1*493+%2*29+%3

สิ่งนี้จะถูกสกัดโดยใช้การแบ่งส่วนของสตริงและเพิ่มเพื่อให้อัตราดอกเบี้ยเป็น 1/800 คำนวณจำนวน Knuts ด้วย

@for /l %%y in (1,1,%5)do @set/ak+=k*i/800

คำนวณและเพิ่มตามความสนใจของแต่ละปี

@set/ag=k/493,s=k/29%%17,k%%=29
@echo %g% %s% %k%

แปลงกลับเป็น Galleons และ Sickles


0

05AB1E (ดั้งเดิม) 24 ไบต์

>Im•1ýÑ•3L£I*O*ï29‰ć17‰ì

พอร์ตของ@JoKingคำตอบ Perl 6ดังนั้นอย่าลืม upvote เขาเช่นกันถ้าคุณชอบคำตอบนี้!

ฉันใช้รุ่นเก่าเนื่องจากข้อผิดพลาดในรุ่นใหม่ที่£ไม่ได้ทำงานกับจำนวนเต็มดังนั้นการโยนสตริงที่ชัดเจน§(ระหว่างที่สอง3จำเป็นต้องและ) (จนกว่าข้อผิดพลาดจะได้รับการแก้ไข)

รับดอกเบี้ยเป็นทศนิยมตามด้วยปีตามด้วยรายการ [Knuts, Sickles, Galleons]

ลองออนไลน์

คำอธิบาย:

>                      # Increase the (implicit) interest decimal by 1
                       #  i.e. 0.0725 → 1.0725
 Im                    # Take this to the power of the year input
                       #  i.e. 1.0725 and 3 → 1.233...
1ýÑ•                  # Push compressed integer 119493
     3L                # Push list [1,2,3]
       £               # Split the integer into parts of that size: [1,19,493]
        I*             # Multiply it with the input-list
                       #  i.e. [1,19,493] * [23,16,103] → [23,464,50779]
          O            # Take the sum of this list
                       #  i.e. [23,464,50779] → 51266
           *           # Multiply it by the earlier calculated number
                       #  i.e. 51266 * 1.233... → 63244.292...
            ï          # Cast to integer, truncating the decimal values
                       #  i.e. 63244.292... → 63244
             29       # Take the divmod 29
                       #  i.e. 63244 → [2180,24]
                ć      # Extract the head; pushing the remainder-list and head separately
                       #  i.e. [2180,24] → [24] and 2180
                 17   # Take the divmod 17 on this head
                       #  i.e. 2180 → [128,4]
                    ì  # And prepend this list in front of the remainder-list
                       #  i.e. [24] and [128,4] → [128,4,24]
                       # (which is output implicitly as result)

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดจำนวนเต็มขนาดใหญ่? )จะเข้าใจว่าทำไมเป็น•1ýÑ•119493


0

APL (NARS), 37 ถ่าน, 74 ไบต์

{(x y z)←⍵⋄⌊¨a⊤(z⊥⍨a←0 17 29)×x*⍨1+y}

การแปลที่ดีมากและน้อยมากไบต์โซลูชั่น APL โดยผู้ใช้เกรแฮมเป็นโซลูชั่นที่ใช้ฟังก์ชั่นเดียวแทนการป้อนข้อมูลมาตรฐาน ... ทดสอบและวิธีการใช้งาน:

  f←{(x y z)←⍵⋄⌊¨a⊤(z⊥⍨a←0 17 29)×x*⍨1+y}
  f 3 0.0725 (103 16 23)
128 4 24

(ฉันไม่ได้บอกว่าฉันเข้าใจอัลกอริทึมแล้ว)


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