using Gtt.InterestCalculator;
public static void Main()
var accounts = new Account[]
new Account("Citi", 98.57m, 3566.74m, 16.99m),
new Account("Chase 4128", 92m, 3931.37m, 15.24m),
new Account("Fnbo", 48.02m, 1187.42m, 9.99m),
new Account("Capital One", 54m, 2391.14m, 14.99m),
new Account("Chase 2457", 85m, 4224.76m, 14.99m),
new Account("Syf", 15.78m, 387.66m, 0m),
new Account("UMB Cardcenter", 61m, 3178.06m, 11.15m)
accounts.ProcessAvalanche(1212.85m);
accounts.ProcessAvalanche(1712.85m);
public static class AccountsExtensions
public static void ProcessAvalanche(this Account[] accounts, decimal avalancheAmount, bool printAvalanches = false)
Console.WriteLine("\nProcessing avalance of " + avalancheAmount);
var orderedAccounts = accounts.OrderByDescending(a => a.APR);
foreach (var account in orderedAccounts) { account.RemainingBalance = account.Balance; }
while (accounts.Any(a => a.RemainingBalance > 0))
var monthlyAvalanche = avalancheAmount;
foreach (var account in orderedAccounts)
if (account.RemainingBalance <= 0) continue;
var monthlyPayment = account.Minimum > account.RemainingBalance ? account.RemainingBalance : account.Minimum;
account.RemainingBalance -= monthlyPayment;
decimal interest = Gtt.InterestCalculator.CompoundInterestCalculator.CalculateInterest(account.RemainingBalance, account.APR / 100m, 1d/12d);
account.RemainingBalance += interest;
monthlyAvalanche -= monthlyPayment;
if (account.RemainingBalance <= 0) Console.WriteLine("\tPaid off " + account.Name + " in month " + month);
foreach (var account in orderedAccounts)
if (account.RemainingBalance <= 0) continue;
var avalanchePayment = account.RemainingBalance > monthlyAvalanche ? monthlyAvalanche : account.RemainingBalance;
account.RemainingBalance -= avalanchePayment;
monthlyAvalanche -= avalanchePayment;
if (account.RemainingBalance <= 0) Console.WriteLine("\tPaid off " + account.Name + " in month " + month);
if (monthlyAvalanche <= 0) break;
public string Name { get; set; }
public decimal Minimum { get; set; }
public decimal Balance { get; set; }
public decimal APR { get; set; }
public decimal RemainingBalance { get; set; }
public Account(string name, decimal minimum, decimal balance, decimal apr)