Пакетный, 171 байт
: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)}
Принимает входные данные в виде аргументов командной строки в порядке галеонов, сиклей, кнатов, процентов, лет. Проценты представляют собой проценты, но выражаются без знака %. Обрезается после каждого года. Вывод осуществляется в порядке галеонов, сиклей, кнатов. Поддерживает не менее 5000 галеонов. Объяснение:
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
Пакетная обработка поддерживает только целочисленную арифметику. К счастью, процентная ставка всегда кратна ; 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
. We start by splitting on the decimal point, so that 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
становится целой частью процентной ставки и “¢×ø‘©×\ - 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]]
U1¦ - reverse first one = [[G%1, G/1], [S/17, S], [K/17, K]]
Ṫ€ - tail €ach = [G/1, S, K]
Ḟ - floor (vectorises)
the decimal fraction. These are then multiplied by 8. The first digit of ÷ȷ2
теперь это число восьмых в процентной ставке.
[Galleons, Sickles, Knuts]
Затем это извлекается с помощью нарезки строк и добавляется, чтобы получить процентную ставку в 1/800. Также подсчитывается количество кнутов.
years
Рассчитайте и прибавьте проценты за каждый год.
[Galleons, Sickles, Knuts]
Конвертируйте обратно в галеоны и сикли.