限界税計算機を構築する


8

定義された税率(特に米国連邦税率)に依存する税率計算機の問題がいくつかありましたが、任意のリストに対してそれを行ったものはありません。

あなたの仕事は、限界税括弧の任意のリストを取り、所定の課税所得に対して支払われる実効税額を計算するプログラムまたは関数を構築することです。

プログラムは入力として受け取ります。

  • N形式の数値のペア(amt, rate)。それぞれが税の括弧を表します。

    • amtこれを超えると税率が適用され始める課税所得の金額です。これらの金額はすべて整数で、昇順で表示されます。

    • rate 税率で、0から100までの10進数のパーセンテージで表されます。

  • 非負の整数としての課税所得の額。

$ 0のレートが指定されていない場合、レートは0%と見なされます。

あるいは、プログラムは、同じ順序で金額とレートを含む2つのリスト(amt1, amt2, ...)とを入力として受け取ることもできます(rate1, rate2, ...)。

あなたのプログラムは、出力が支払うべき税額、いずれか2つの小数点以下の桁数、または丸いへの意志ダウン最寄り全体通貨単位へ。


入力例(基本的な個人税額控除が適用された、2016年からの最新のカナダの税区分のみ):

11474 15
45282 20.5
90563 26
140388 29
200000 33

393216

そしてそれに対応する出力:

108357.07  or  108357

これを行うためのあらゆる言語での最短のプログラムが勝利します。


[[amt、amt、amt]、[rate、rate、rate]]として入力できますか?それとも[amt、rate]のペアである必要がありますか?
— Emigna

入力できるのは、金額のリスト1つ、レートのリスト1つ、および税所得値(合計3つの入力)です。
— Emigna 2016年

まあ、私は指定しました(amt, rate)が、他のリストを受け入れるように問題を根本的に変えるわけではないので、変更できるように変更します。
— Joe Z.

回答:


2

05AB1E、35 24バイト

vy³ï‚{0è)˜}³ï‚˜¥²ø€PTn/O

説明

vy                         # for each amount
  ³ï‚                      # pair with taxable income
     {0è                   # get min
        )˜}                # add to list
           ³ï‚˜            # add income to the end of the list
               ¥           # get deltas
                ²ø         # zip with tax rates
                  €P       # map product on each pair of [amount in tax bracket,rate]
                    Tn/    # divide by 100
                       O   # sum
                           # implicitly display result

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


人間は実際に05AB1Eコードを読んで理解していますか?
— DavidC 2016年

@DavidC:私はそれのほとんどを理解することを学びました。でも説明を書きます。すでにそれを行っていたはずですが、両方の入力方法が適切かどうかはわかりませんでした。
— Emigna

3

Haskell、67 66バイト

-1バイトのダミアンに感謝します。

このソリューションは、?タイプのインフィックス関数の形式(Integral b, RealFrac r) => [(r, r)] -> r -> bです。ヘルパー関数は#、?IO仕様を処理しながら、必要な計算を行います。

a?b=floor$reverse a#b
((m,p):r)#i|v<-min i m=p/100*(i-v)+r#v
_#_=0

((m,p):r)#i|v<-min i m=p/100*(i-v)+r#v1バイトを保存
— ダミアン

@Damienに感謝!私はあなたがそのようなガードの中に値を割り当てることができることを知りませんでした。
— ankh-morpork 2016年

2

Mathematica 85 82バイト

R のJosh O'Brienのコードから派生。

d_~f~i_:=Tr@Thread[Differences@((i~Min~#&/@d[[All,1]]~Append~∞))d[[All,2]]/100.]

使用法

f[{{11474, 15}, {45282, 20.5}, {90563, 26}, {140388, 29}, {200000, 33}}, 393216]

108357。


したがって、これは以前に尋ねられましたが、この特定のサイトではありません。理にかなっています。
— Joe Z.

1

Matlab、79バイト

我々が取ることができると仮定するamtと、rate別の列ベクトルとして:

function[]=f(a,b,c)
t=sort([0;a;c]);fix(sum(diff(t).*[0;b/100].*(t(2:end)<=c)))

できない場合(およびのa2列の行列)は87バイトです。amtrate

function[]=f(a,c)
t=sort([0;a(:,1);c]);fix(sum(diff(t).*[0;a(:,2)/100].*(t(2:end)<=c)))

説明:

f(a,b,c)           -- takes amt, rate and income
[0;a;c]            -- gives a vector of amounts with 0 and the income amount
t=sort(...)        -- sort this vector
diff(t)            -- gives us amounts to be taxed in every bracket
diff(t).*[0;b/100] -- tax in every bracket
.*(t(2:end)<=c)    -- take only entries lower than the income
sum(...)           -- sum everything
fix(...)           -- round towards 0

1

JavaScript(ES6)、60バイト

(a,n)=>a.map(([b,r])=>{t+=n>b&&(n-b)*(r-p);p=r},p=t=0)|t/100

aバンドとレートの配列の配列です。これは、この[[11474, 15], [45282, 20.5], [90563, 26], [140388, 29], [200000, 33]]例の場合nの収入であり、収入(393216)です。


入力フォーマットに関する詳細情報を提供できますか?
— Joe Z.

0

Swift、61バイト

zip(zip(m+[i],[0]+m).map{$0-$1},[0]+r).map{$0*$1}.reduce(0,+)

テストケースあり、ゴルフなし:

struct TaxContext {
    let marginLowerBound: [Double]
    let rates: [Double]
}

// ungolfed
extension TaxContext {
    func calcAfterTaxIncome(_ income: Double) -> Double {
        //drop first element (0), append income
        let upper = marginLowerBound + [income]
        let lower = [0] + marginLowerBound

        let incomeInEachMargin = zip(upper, lower)
            .map{ upperBound, lowerBound in upperBound - lowerBound }

        let taxInEachMargin = zip(incomeInEachMargin, [0]+rates)
            .map{ incomeInMargin, rate in incomeInMargin * rate }

        let totalTax = taxInEachMargin.reduce(0, +)

        print(upper)
        print(lower)
        print(incomeInEachMargin)
        print(rates)
        print(taxInEachMargin)

        return totalTax    
    }
}

// golfed
extension TaxContext {
    // computed properties to serve as aliases for the golfed version
    var m: [Double] { return self.marginLowerBound }
    var r: [Double] { return self.rates }

    func f(_ i: Double) -> Double {
        return zip(zip(m+[i],[0]+m).map{$0-$1},[0]+r).map{$0*$1}.reduce(0,+)
    }
}

let testCase1 = TaxContext(
    marginLowerBound: [10_000, 20_000, 30_000],
    rates: [0.1, 0.2, 0.3, 0.4]
)
let result1 = testCase1.calcAfterTaxIncome(70_000)
print(result1)


let testCase2 = TaxContext(
    marginLowerBound: [11474 , 45282, 90563, 140388, 200000],
    rates: [0.15, 0.205, 0.26, 0.29, 0.33]
)
let result2 = testCase2.calcAfterTaxIncome(393216)
print(result2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.