複利...ウィザードマネーで


15

Gringottsは単なる保管庫ではありませんが、評判の良い金融機関とウィザードには融資も必要です。Gringottsゴブリンにめちゃ​​くちゃにされたくないので、興味を計算するプログラムを書くことをお勧めします。利息は年に1度だけ複利されます。

あなたのタスクは、元本、金利、時間(全年)を与えられた利息後の合計未払金額を計算することです。シルバー鎌には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

注意事項と規則

  • 入力および出力は、任意の便利な形式にすることができます。ナッツ、鎌、ガレオン船、金利、および時間を摂取する必要があります。金利以外はすべて整数です。利率は0.125%刻みです。
  • 入力されたお金は正規であるとは限りません(つまり、29個以上のKnutsと17個以上のSicklesを持つことができます)。
  • 出力は正規表現でなければなりません。(つまり、29ナッツ未満、17鎌未満)
  • 任意の精度の計算と比較した場合、合計1,000ガロンまでの合計額は、対象の年に1 Knut以内の精度である必要があります。
    • 利息の各年の後、または最後にのみ切り捨てることができます。参照計算では、これを考慮して精度をチェックできます。

ハッピーゴルフ!


4
利率をパーセンテージではなく小数として取ることができますか?(例:の0.0725代わりに7.25
シャギー

@Shaggy私もこれを知りたい
-senox13

ローンが正確に1 Knutで、利子が1年あたり99%で、期間が1年である場合、結果は「1 Knut」または「2 Knuts」ですか?
チャスブラウン

つまり、フレーズの数学的な意味を明確にしてくださいrounding down
senox13

1
@ChasBrown:1ナッツ。最も近いKnut全体に切り捨て/フロア関数。
ビーフスター

回答:


6

R70 62バイト

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

オンラインでお試しください!

入力をdとして受け取ります:ナッツ、鎌、ガレオンの沈殿物。i:小数としての利率。y:年。ナッツ、鎌、ガレオンの最終預金を出力します。行列乗算を使用していくつかのバイトを節約してくれた@Giuseppeに感謝します(1e99でラップする必要性を回避する方法を示します)。


Rがわかりません。それらをラップアラウンドさせることで何が得られますか?
dfeuer

@dfeuerはmod 1e99を使用しているため、ガレオン船がこれほど高くなるとゼロになります
ニックケネディ

私が疑問に思っているのは、mod 1e99を使用することで得られるものです。
dfeuer

ほとんどのR関数はベクトル化されています。この場合、出力を%%modに渡します。理想的には、ガレオンをそのままにしておきたいのですが、無限大のmodを取るとNaNが返されるので、実際には非常に大きな数(ただしバイト数が少ない数)を使用しました。私が思いついた代替案はもっと長い(例えば[ tio.run / ## JYrLCsIwEEV / ...オンラインで試してみてください!])
ニックケネディ

@NickKennedyあなたもできる9e99...また、63バイト
ジュゼッペ

4

Python 3.8(プレリリース)75 74 71バイト

@EmbodimentofIgnoranceのおかげで-1バイト
-3バイト

これは、Knuts、Sickles、およびGalleonsをint、interestをfloat(パーセンテージではなく10進数)、およびintとして受け取ります。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

これは、「丸め」よりも「切り捨て」に似ています。しかし、私はOPに明確化を求めました(ここではPPCGでのnit-pickingがゲームの名前だからです:))。
チャスブラウン

私はあなたに反対しません、それは私がいつもあなたが結果の下の整数に四捨五入するので、切り捨てのためにいつも見た意味です。それ以外の場合は、通常の丸めです。OPを決定させるのは良いアイデアです
senox13

参考までにI\=、TIOで匿名関数をテスト可能にする便利なトリックは、次のようにヘッダーに入れることです。また、次のようにk//29//17なりますk//493
XNOR

3

APL + WIN、37 28 26バイト

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

lirtosiastのおかげで2バイト節約

オンラインでお試しください!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ありがとう。しかし、古代のAPL + WINインタープリターにdoes機能がないのではないかと心配しています。必ず、これを独自のAPLソリューションとして提出してください。
グラハム

@lirtosiast再度ありがとうございます。
グラハム

3

Perl 6、47バイト

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

オンラインでお試しください!

これをなんとか匿名のWhatever lambdaに入れることに驚いた!特に、*それが他の何よりも多い部分。入力を受け取ります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

何にでも合うように、ナッツ/鎌/ガレオンの数も取得する方法を考え出せなかったことに驚いています。それはちょうど***************************のように、ええとなるでしょう
;

@guifa Whateversは入力であるため、実際には3つしか入力できません(ただし、通貨入力をさらに*sに分割できますが、より多くのバイトがあります)。*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 /数値演算コプロセッサーのみを使用したOS固有ではないマシンコードです。

出力付きのテストプログラムの例:

    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に2バイトをありがとう。

汚いトリック:入力内のコインの数は浮動小数点(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
保存と2バイト(truncate$ ... )- > truncate( ... )(g#s)k r nの代わりにc g s k r n
ライコニ

@ライコニ、どうもありがとう!
dfeuer

@Laikoni、時間があれば、codegolf.stackexchange.com / questions / 55960 /…で数バイト見つけてもらえたら本当にありがたいです。
-dfeuer

1
時間を見つけたら調べます。一方、私は私たちのHaskellチャットルームのMonads and Menと、この質問にあなたのHugs / GHCポリグロットを与えて楽しむことができるかもしれません。
ライコニ


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、Knuts、Sickles、Galleons、Interest(10進数)、およびTime(年)の5つの項目を持つリストです。
出力は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、Sickles、およびGalleonsはKnutsに変換され、に保存されTます。

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

Knutsの量を取得し、複利を適用します。
ここで利息が計算されます。

:remainder(iPart(T),493→R

店舗I 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、sickle、knuts)をkutsに変換します

  • 1+y%100 利率を計算します(7.25%率の例1.0725)

  • ラムダ {z(y*)\x}は作業を行います:interes * mainを適用して3回繰り返し、最終的なmainを返します。

  • c\: knutsからガレオン、鎌、knutsを生成します

注-名前機能が必要ない場合は、ラムダを使用して2バイトを節約できます {c\:{z(y*)/x}[c/:x;1+y%100;z]}inputArgs


0

C#(Visual C#Interactive Compiler)、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;

knuts、sickles、およびgalleonsを表す3つの値と、二重(パーセンテージではない)としての金利を持つ、名前付きタプルとしてinoutを使用します。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%

ガレオン、鎌、ナッツ、興味、年の順にコマンドライン引数として入力を受け取ります。関心は割合ですが、%記号なしで表されます。毎年切り捨てられます。出力は、ガレオン、鎌、ナッツの順です。少なくとも5000ガロンをサポートします。説明:

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

バッチには整数演算のみがあります。幸いなことに、金利は常にの倍数です0.125。小数点で分割することから始め、それがi金利とf小数の整数部分になります。次に、これらに8を掛けます。ここで、最初の数字fは、利率の8分の1 の数です。

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

これは、文字列スライシングを使用して抽出され、追加されて1/800分の金利が得られます。ナッツの数も計算されます。

@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%

ガレオン船と鎌に戻す。


0

05AB1E(レガシー)、24 バイト

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

@JoKingのポートのPerl 6回答のです。この回答が気に入った場合は、必ず彼もしてください!

私は£、整数で動作しない新しいバージョンのバグのためにレガシーバージョンを使用しているので、文字列への明示的なキャスト§(2番目のとの3が必要です(バグが修正されるまで)。

利息を10進数として受け取り、その後に年、その後に[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}

Grahamユーザーによる非常に優れた数バイトのAPLソリューションを、標準入力の代わりに1つの関数を使用するソリューションに変換...テストとその使用方法:

  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.