Codegolf - Сложные Проценты... С Wizard Money

  • Автор темы Dress32lisd
  • Обновлено
  • 22, Oct 2024
  • #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 или более кнатов и 17 или более сиклей).
  • Выходные данные должны быть каноническим представлением. (т.е. менее 29 кнатов и менее 17 сиклей)
  • Общая сумма задолженности, до 1000 галеонов, должна быть с точностью до 1 кнута в год по сравнению с произвольными точными расчетами.
    • Вы можете округлить в меньшую сторону после каждого года интереса или только в конце. Справочные расчеты могут принять это во внимание для проверки точности.

Удачной игры в гольф!

#код-гольф #математика

Dress32lisd


Рег
04 Jul, 2012

Тем
64

Постов
194

Баллов
534
  • 26, Oct 2024
  • #2

Р, 70 62 байта

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 $,=$";say 0|($_=(<>+<>*29+<>*493)*(1+<>)**<>)/493,0|($_%=493)/29,$_%29
 

Попробуйте онлайн!

Принимает входные данные как d: депозит в кнатах, сиклях, галеонах; i: процентная ставка в десятичном формате; у: лет. Выводит окончательный депозит в кнатах, сиклях, галеонах. Спасибо @Giuseppe за использование матричного умножения для экономии нескольких байтов (и указание, как избежать необходимости переноса на 1e99).

 

LoccyUA


Рег
07 Dec, 2020

Тем
70

Постов
214

Баллов
604
  • 26, Oct 2024
  • #3

Python 3.8 (предварительная версия), 75 74 71 байт

-1 байт благодаря @EmbodimentofIgnorance
-3 байта благодаря @xnor

При этом кнуты, сиклы и галеоны принимаются в виде целых чисел, проценты — в виде числа с плавающей запятой (десятичное, а не процентное число) и годы — в виде целого числа. Он возвращает кортеж, содержащий число после процентов Кнатса, Сикла и Галеона соответственно.

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

Использование:

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

Попробуйте онлайн!

 

Ya Sam


Рег
09 Aug, 2012

Тем
72

Постов
220

Баллов
610
  • 26, Oct 2024
  • #4

APL+WIN, 37 28 26 байт

119493

2 байта сэкономлено благодаря lirtosiast

Попробуйте онлайн! С разрешения Диалог Классик

Объяснение:

•1ýÑ• ||answer||

Перл 6, 47 байт

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

Попробуйте онлайн!

Я удивлен, что мне удалось передать это в анонимную лямбду «Как бы то ни было!» Особенно та часть, где это больше 3 s than anything else. Takes input as и возвращает список валют в том же порядке.

Объяснение:

§ ||answer||

Желе, 29 байты

£

Полная программа, принимающая аргументы: >Im•1ýÑ•3L£I*O*ï29‰ć17‰ì ; @set/ag=k/493,s=k/29%,k%%=29 @echo %g% %s% %k% ; @for /l %%y in (1,1,%5)do @set/ak+=k*i/800 .
Принты @set/ai+=%f:~,1%,k=%1*493+%2*29+%3 .

Попробуйте онлайн!

Полы в конце всего срока.
f may be removed if we may accept the rate as a ratio rather than a percentage.

Как?

f ||answer||

Сборка FPU Intel 8087, 86 байт

i

В разобранном виде и задокументировано:

0.125

Реализованный как МАКРОС (по сути, функция), это машинный код, не зависящий от ОС, использующий для вычислений только FPU/математический сопроцессор Intel 80x87.

Пример тестовой программы с выводом:

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

Выход

 

Rolg


Рег
16 Feb, 2012

Тем
63

Постов
202

Баллов
527
  • 26, Oct 2024
  • #5

TI-BASIC (TI-84), 96 90 байт

@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%,k%%=29 @echo %g% %s% %k%

Ввод (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; , a list with 5 items: Knuts, Sickles, Galleons, Interest (decimal), and Time (years).
Выход в {c\:{z(y*)/x}[c/:x;1+y0;z]}inputArgs and is automatically printed out when the program completes.

Без игры в гольф:

c\:

Пример:

{z(y*)\x}

Объяснение:

1+y0

Новый список, c/:x , is created and (128;4;24.29209) хранится в нем.

t[103 16 23;7.25;3]

Кнатсы, сикли и галеоны конвертируются в кнатсы и хранятся в t .

c

Берет сумму Кнатсов и применяет к ней сложные проценты.
Проценты рассчитываются здесь.

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

Хранит яцелое число Часть из knuts sickles galleons modulo 493 into interest years knuts sickles galleons . Используется для сокращения количества байтов.

»♀(╪M╢ú!!«ε◘÷╛SI►U/)-f!ö

Оценивает список из 3 предметов (кнатс, сикль и галеон). Список автоматически сохраняется в -- 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,y) (%)=divMod .


Примечание: Количество байтов оценивается путем взятия количества байтов, указанного в [МЕМ][2][7] (список программ в оперативной памяти) и вычитая количество символов в названии программы и дополнительные 8 байт, используемые для программы:

103 – 5 – 8 = 90 байт

 

Avtor04011981


Рег
07 Jan, 2009

Тем
72

Постов
183

Баллов
583
  • 26, Oct 2024
  • #6

Джапт, 48 байт

((Galleons, Sickles), Knotts)

Моя первая попытка в Japt, гонка за наградой @Shaggy! Излишне говорить, что это не очень-то по-гольфийски :(

Попробуйте онлайн!

 

Марина1363


Рег
15 Nov, 2011

Тем
74

Постов
177

Баллов
567
  • 26, Oct 2024
  • #7

Хаскелл, 73 байта

Integer

Попробуйте онлайн!

Спасибо @Laikoni за два байта.

Грязные трюки: количество монет во входных данных — с плавающей запятой ( Double ), while the number of coins in the output is integral ( (g#s)k r n|(x,y)<-truncate((493*g+29*s+k)*(1+r)^n)%29=(x,y) (%)=divMod ). Результатом является вложенная пара XÄ pY *(U*493+V*29+W)f Uu493 [Uz493 ,Vz29 ,Vu29] to avoid having to flatten to a triple.

Объяснение

Ans ||answer||

Стакс, 24 байты

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

Запустите и отладьте его

Ввод представляет собой значения, разделенные пробелами. R

Вывод отделяется новой строкой.

T ||answer||

К, 46 байт

:remainder(iPart(T),493→R

:T(1+∟C(4))^∟C(5)→T store the list for base-conversion

T is the function that calculates total amount

Используйте пример:

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

пишет Ans

Объяснение:

  • ∟C transform the list (galleon; sickle; knuts) to kuts

  • :SetUpEditor C :Ans→∟C calculate rate of interest (example 1.0725 for 7.25% rate)

  • лямбда {32,2,5,0.05,5} {32 2 5 .05 5} prgmCDGF1 {12 10 6} does the work: iterate 3 times, applying interes*main, and returns final main.

  • :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)} generates galleon, sickles, knuts from knuts

ПРИМЕЧАНИЕ. Если вам не нужна функция имен, мы можем использовать лямбду, сэкономив 2 байта. Ans

 

Dey18


Рег
24 Nov, 2007

Тем
66

Постов
165

Баллов
535
  • 26, Oct 2024
  • #8

C# (интерактивный компилятор Visual C#), 86 байт

Ans

Принимает inout как именованный кортеж с тремя значениями, представляющими кнуты, серпы и галеоны, а процентную ставку — как двойную (не процентную). Мне бы очень хотелось, чтобы в C# был оператор возведения в степень. Math.Pow слишком длинный :(

Попробуйте онлайн!

 

Ele0703


Рег
10 Feb, 2008

Тем
80

Постов
190

Баллов
610
  • 26, Oct 2024
  • #9

Пакетный, 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]

Конвертируйте обратно в галеоны и сикли.

 

LeanderEL


Рег
14 Apr, 2015

Тем
71

Постов
169

Баллов
564
  • 26, Oct 2024
  • #10

05AB1E (устаревший), 24 байты

rate

Порт @JoKingPerl 6 ответ, так что обязательно проголосуйте за него, если вам нравится этот ответ!

Я использую устаревшую версию из-за ошибки в новой версии, из-за которой “¢×ø‘©×\ ÷ȷ2‘*⁵×÷¢S×¢d®U1¦Ṫ€Ḟ doesn't work on integers, so an explicit cast to string (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 (между вторым interest rate (e.g. 0.0725), years, [Knuts, Sickles, Galleons] and * ) требуется (пока ошибка не будет исправлена).

Принимает проценты в десятичном формате, за которыми следует год, а затем список [кнатов, сиклей, галеонов].

Попробуйте онлайн.

Объяснение:

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

См. мой совет по 05AB1E (раздел Как сжать большие целые числа?) чтобы понять, почему (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. is ⌊a⊤((a←0 17 29)⊥⎕)×(1+⎕)*⎕ .

 

TrafficTornado


Рег
19 Jul, 2017

Тем
74

Постов
206

Баллов
586
  • 26, Oct 2024
  • #11

APL(NARS), 37 символов, 74 байта

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

перевод очень хорошего и очень малобайтового решения APL от пользователя Graham

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

к решению, которое использует одну функцию вместо стандартного ввода...

тест и как его использовать:

(я не говорю, что понял алгоритм)

 

KrolikAlkogolik


Рег
16 Mar, 2014

Тем
55

Постов
201

Баллов
476
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно