Büyüleyici Para ile Bileşik Faiz…


15

Gringotts sadece bir kasa değil, aynı zamanda saygın bir finans kurumu ve sihirbazın da krediye ihtiyacı var. Gringotts goblinleri tarafından batırılmak istemediğiniz için, faiz hesaplamak için bir program yazmanın iyi bir fikir olacağına karar verdiniz. Faiz yıllık olarak artmaktadır.

Göreviniz, ana para, faiz oranı ve zaman (tüm yıllar) göz önüne alındığında, en yakın Knut'a kadar yuvarlanarak, sihirbaz parasının tüm mezheplerinde faaliyet gösteren faiz sonrası toplam borç miktarını hesaplamaktır. Gümüş Orakta 29 Bronz Bıçak ve Altın Kalyonda 17 Orak vardır.

Misal

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

Total owed after interest:
 24 Knuts
  4 Sickles
128 Galleons

Notlar ve Kurallar

  • Giriş ve çıkış herhangi bir uygun biçimde olabilir. Knuts, Oraklar, Galleonlar, faiz oranı ve zamanı almalısınız. Faiz hariç tümü tam sayı olacaktır. Faiz oranı% 0.125'lik artışlarla.
  • Giriş parasının kanonik olduğu garanti edilmez (yani 29 veya daha fazla Knuts ve 17 veya daha fazla Orak olabilir.)
  • Çıktı kanonik temsil olmalıdır. (yani 29 Knut'tan az ve 17 Oraktan az)
  • Toplam 1.000 Galleon'a kadar olan borçlar, keyfi hassas hesaplamalarla karşılaştırıldığında yılda 1 Knut'a kadar doğru olmalıdır.
    • İlgilenilen her yılın sonunda veya yalnızca sonunda yuvarlayabilirsiniz. Referans hesaplamaları, doğruluk kontrolleri için bunu dikkate alabilir.

Mutlu golf!


4
Faiz oranını yüzde yerine ondalık sayı olarak alabilir miyiz? (ör. 0.0725yerine 7.25)
Shaggy

@Shaggy Bunu da bilmek isterim
senox13

Kredi tam olarak 1 Knut ve faiz% 99 ise ve vade 1 yıl ise, sonuç "1 Knut" veya "2 Knuts" olmalı mı?
Chas Brown

Başka bir deyişle, lütfen cümlenin matematiksel anlamını açıklığa kavuşturunrounding down
senox13

1
@ChasBrown: 1 Knut. En yakın Knut'un tamamına kesme / döşeme fonksiyonu.
Beefster

Yanıtlar:


6

R , 70 62 bayt

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

Çevrimiçi deneyin!

Girişi d olarak alır: knuts, oraklar, kalyonlarda birikinti; i: ondalık olarak faiz oranı; y: yıl. Knuts, orak, kalyonlarda son depozito üretir. @Giuseppe sayesinde bazı baytları kaydetmek için matris çarpımını kullandığınız için teşekkürler


R bilmiyorum; onların etrafına sarılmasının seni kazanması ne?
dfeuer

@ dfeuer onlar mod 1e99 alınır, bu yüzden kalyonlarınız o kadar yükselirse sıfıra düşecekler
Nick Kennedy

Merak ettiğim şey, onları mod 1e99 alarak elde ettiğiniz şeydir.
dfeuer

Çoğu R işlevi vektörleştirilmiştir. Bu durumda çıktıyı %%mod olan fonksiyondan geçiriyorum. İdeal olarak, galleonları yalnız bırakmak istiyorum, ancak bir sayı mod sonsuzluğu almak NaN döndürür ve bu yüzden sadece çok büyük bir sayı kullandım (ancak bayt olarak küçük bir tane). Geldiğim alternatifler daha uzun (örneğin [ tio.run/##JYrLCsIwEEV/… Çevrimiçi deneyin!])
Nick Kennedy

@NickKennedy sen de yapabilirsin 9e99... Ayrıca, 63 bayt
Giuseppe

4

Python 3.8 (ön sürüm) , 75 74 71 bayt

@EmbodimentofIgnorance sayesinde -1 bayt @xnor
sayesinde -3 bayt

Bu Knuts, Oraklar ve Galleons'u ints, float (ondalık, yüzde değil) olarak ilgi ve int olarak yıl olarak alır. Knuts, Orak ve Galleonların ilgisini çeken sayıyı içeren bir demet döndürür.

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

Kullanımı:

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

Çevrimiçi deneyin!


İyi yakalama. Yanıt güncelleniyor
senox13

Soru söylüyor operating in whole denominations of wizard money, rounding down. Demek rounding downistediğim chop off everything after the decimal point., başlığı kullanmak kesinlikle daha kolay bir yol gibi geliyor. Bunu gelecekteki gönderiler için yapacağım, teşekkürler
senox13

Bu, "yuvarlama" dan çok "kısalma" gibi geliyor; ama OP'den açıklama istedim (çünkü nit toplama burada PPCG'de oyunun adıdır :)).
Chas Brown

Seninle aynı fikirde değilim, sadece aşağı yuvarlamak için her zaman gördüğüm anlam budur, çünkü her zaman sonucun altındaki tamsayıya yuvarlarsın. Aksi takdirde normal yuvarlamadır. OP karar vermek iyi bir fikir
senox13

TIO'da anonim işlevleri test edilebilir kılmak için yararlı bir numara olan FYI, I\=başlığı bu şekilde koymaktır . Ayrıca, k//29//17olabilir gibi görünüyor k//493.
xnor

3

APL + WIN, 37 28 26 bayt

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

Lirtosiast sayesinde 2 bayt kaydedildi

Çevrimiçi deneyin! Dyalog Classic'in izniyle

Açıklama:

(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 için?
lirtosiast

@lirtosiast Teşekkürler ama korkuyorum ki eski APL + WIN yorumcumun ⍨ işlevi yok. Elbette bunu kendi APL çözümünüz olarak gönderin.
Graham

@lirtosiast Tekrar teşekkürler a. atamasından kaynaklanan 2 bayt aldım.
Graham

3

Perl 6 , 47 bayt

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

Çevrimiçi deneyin!

Ne olursa olsun lambda ne olursa olsun bu anonim almak başardı şaşırdım! Özellikle *her şeyden daha fazla olduğu kısım . Girişi farklı alır interest rate (e.g. 0.0725), years, [Knuts, Sickles, Galleons]ve aynı sırayla para birimlerinin listesini döndürür.

Açıklama:

 (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

Ayrıca Knuts / Oraklar / Galleonlar sayısını da ne olursa olsun sığdırmak için bir yol ile gelmedi şaşırdım. O zaman, sadece ************************* ;-)
user0721090601

(Ben para girişi bölünmüş olsa @guifa whatevers girişler olduğu için, yalnızca gerçekten 3 tanesi olabilir biraz daha *s ama daha byte). S'nin geri kalanı *çarpma ( *) ve üslü değerlerden ( **)
Jo King

Demek istediğim, dönüşüm oranlarını (29/17 sayı) da aldınız. Ama elbette bu bir şakaydı çünkü bu sayıları birden fazla kullanmanız gerekiyor. Benim mizah geçmedi eğer üzgünüm
user0721090601

2

Jöle , 29 bayt

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

Argümanları kabul eden tam bir program rate:;[Galleons, Sickles, Knuts]; years.
Baskılar [Galleons, Sickles, Knuts].

Çevrimiçi deneyin!

Tüm dönem sonunda katlar.
÷ȷ2oranı yüzde yerine oran olarak kabul edebilirsek kaldırılabilir.

Nasıl?

“¢×ø‘©×\ - 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 düzeneği, 86 bayt

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

Demonte edilmemiş ve belgelendirilmiş:

; 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 (temel olarak bir işlev) olarak uygulanan bu, hesaplama için yalnızca Intel 80x87 FPU / matematik yardımcı işlemcisi kullanan işletim sistemine özgü olmayan makine kodudur.

Çıktı ile örnek test programı:

    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

Çıktı

resim açıklamasını buraya girin



1

Haskell , 73 bayt

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

Çevrimiçi deneyin!

@Laikoni'ye iki bayt için teşekkürler.

Kirli hileler: girişteki jeton sayısı kayan nokta ( Double) iken, çıkıştaki jeton sayısı integraldir ( Integer). Sonuç iç içe bir çifttir((Galleons, Sickles), Knotts) üçe düzleştirmek zorunda kalmamak .

açıklama

-- 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( ... )ve (g#s)k r nyerine iki bayt kaydedin c g s k r n.
Laikoni

@Laikoni, çok teşekkürler!
dfeuer

@Laikoni, eğer zamanınız varsa bana codegolf.stackexchange.com/questions/55960/… ' da birkaç bayt bulabilirseniz çok memnun olurum .
dfeuer

1
Zamanı bulduğumda ona bakacağım. Bu arada, sizi Haskell Monads ve Erkekler sohbet odamıza ve ayrıca Hugs / GHC poliglotlarınız göz önüne alındığında keyif alabileceğiniz bu soruya yönlendirebilirim.
Laikoni


1

TI-BASIC (TI-84), 96 90 Bayt

: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)}

Girdi, Ans5 öğeden oluşan bir listedir: Knuts, Orak, Galleon, Faiz (ondalık) ve Zaman (yıl).
Çıktı girilir Ansve program tamamlandığında otomatik olarak yazdırılır.

Un-golfed:

: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)}

Misal:

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

Açıklama:

:SetUpEditor C
:Ans→∟C

Yeni bir liste, ∟Coluşturulur veAns içinde saklanır.

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

Knuts, Oraklar ve Galleonlar Knuts'a dönüştürülür ve T .

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

Knuts miktarını alır ve ona bileşik faiz uygular.
Faiz burada hesaplanır.

:remainder(iPart(T),493→R

Mağazalar Ben nteger Bölüm ait Tmodülo 493 içineR . Bayt sayısını kısaltmak için kullanılır.

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

Bir listeyi 3 madde ile değerlendirir (Knuts, Orak ve Galleonlar). Liste otomatik olarakAns .


Not: Bayt sayısı, [MEM][2] 'de verilen bayt sayısı alınarak değerlendirilir.[7] 'de (RAM'deki program listesi) ve program adındaki karakter sayısı ve program için kullanılan fazladan 8 bayt çıkarılarak değerlendirilir:

103-5-8 = 90 bayt


0

K, 46 Bayt

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

c temel dönüşüm için listeyi sakla

t toplam tutarı hesaplayan işlevdir

Örnek kullanın:

t[103 16 23;7.25;3]

yazıyor (128;4;24.29209)

Açıklama:

  • c/:x listeyi (kalyon; orak; knuts) kutlara dönüştürmek

  • 1+y%100 faiz oranını hesapla (% 7.25 oranı için örnek 1.0725)

  • lambda {z(y*)\x}işi yapar: interes * main uygulayarak 3 kez tekrarlayın ve final main'u döndürür.

  • c\: kalyon, orak, knuttan knuts üretir

NOT. - bir ad işlevine ihtiyacınız yoksa, 2 bayt tasarruf sağlayan bir lambda kullanabiliriz {c\:{z(y*)/x}[c/:x;1+y%100;z]}inputArgs



0

Toplu, 171 bayt

@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, Orak, Knuts, ilgi, yıl düzeninde komut satırı argümanları olarak girdi alır. Faiz bir yüzdedir ancak% işareti olmadan ifade edilir. Her yıl sonra kesilir. Çıktı Galleons, Orak, Knuts düzenindedir. En az 5000 Galleon destekler. Açıklama:

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

Yığın yalnızca tamsayı aritmetiği vardır. Neyse ki, faiz oranı her zaman katlarıdır 0.125. Ondalık noktaya bölünerek başlıyoruz, böylece ifaiz oranının ve fondalık kesirin tamsayı parçası olur . Bunlar daha sonra 8 ile çarpılır. İlk rakamı fşimdi yüzde faiz oranındaki sekizinci sayısıdır.

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

Bu daha sonra ip dilimleme kullanılarak ekstrakte edilir ve 1 / 800. saniyede bir faiz oranı vermek üzere ilave edilir. Knuts sayısı da hesaplanır.

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

Her yılın faizini hesaplayın ve ekleyin.

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

Dönüştürmek için Galleons ve Orak.


0

05AB1E (eski) , 24 bayt

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

Limanı @JoKing'in Perl 6 cevabı , bu yüzden bu cevabı beğendiyseniz de onu oyladığınızdan emin olun!

Tam sürümlerde £çalışmayan yeni sürümdeki bir hata nedeniyle eski sürümü kullanıyorum , bu nedenle dizeye açık bir döküm§ (ikinci ve 3) arasında (hata düzeltilene kadar) gerekli .

Faizi ondalık sayı olarak alır, bunu yıl takip eder ve ardından [Knuts, Oraklar, Galleonlar] listesi gelir.

Çevrimiçi deneyin.

Açıklama:

>                      # 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)

Neden •1ýÑ•olduğunu anlamak için bu 05AB1E ucuma bakın ( Büyük tamsayılar nasıl sıkıştırılır? Bölümü )119493 .


0

APL (NARS), 37 karakter, 74 bayt

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

Graham kullanıcısı tarafından çok iyi ve çok az bayt APL çözümünün standart girdi yerine bir işlevi kullanan bir çözüme dönüştürülmesi ... test ve nasıl kullanılır:

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

(algoritmayı anladığımı söylemiyorum)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.