简单的州营业税计算器


10

至少可以说,美国的营业税很复杂。通常,有州销售税(有几个州不收取州销售税),但也可能有县级销售税,学区销售税,市政(市)销售税或大都市地区营业税。在城市的不同地区甚至可能会有不同的营业税。但是,出于这一挑战的目的,我们将只关注州销售税。

给定美元金额大于零(精确到小数点后两位)和状态(全名或两个字母的缩写,则选择,大小写无关紧要),并使用下面的销售税百分比表,输出该特定销售所需收取的相应州营业税,准确并截短至两位小数。请指定您的代码如何处理舍入。

编辑:华盛顿的缩写被错误地列出为WS而不是WA。答案可以使用任何一种缩写,因为那是我的愚蠢。

State          Abbr   %
Alabama         AL  4.00%
Alaska          AK  0.00%
Arizona         AZ  5.60%
Arkansas        AR  6.50%
California      CA  6.00%
Colorado        CO  2.90%
Connecticut     CT  6.35%
Delaware        DE  0.00%
Florida         FL  6.00%
Georgia         GA  4.00%
Hawaii          HI  4.00%
Idaho           ID  6.00%
Illinois        IL  6.25%
Indiana         IN  7.00%
Iowa            IA  6.00%
Kansas          KS  6.50%
Kentucky        KY  6.00%
Louisiana       LA  5.00%
Maine           ME  5.50%
Maryland        MD  6.00%
Massachusetts   MA  6.25%
Michigan        MI  6.00%
Minnesota       MN  6.875%
Mississippi     MS  7.00%
Missouri        MO  4.23%
Montana         MT  0.00%
Nebraska        NE  5.50%
Nevada          NV  4.60%
New Hampshire   NH  0.00%
New Jersey      NJ  6.88%
New Mexico      NM  5.13%
New York        NY  4.00%
North Carolina  NC  4.75%
North Dakota    ND  5.00%
Ohio            OH  5.75%
Oklahoma        OK  4.50%
Oregon          OR  0.00%
Pennsylvania    PA  6.00%
Rhode Island    RI  7.00%
South Carolina  SC  6.00%
South Dakota    SD  4.50%
Tennessee       TN  7.00%
Texas           TX  6.25%
Utah            UT  4.70%
Vermont         VT  6.00%
Virginia        VA  4.30%
Washington      WA  6.50%
West Virginia   WV  6.00%
Wisconsin       WI  5.00%
Wyoming         WY  4.00%

加利福尼亚州征收6%营业税的示例-

CA
1025.00

61.50

明尼苏达州6.875%的示例-

MN
123.45

8.49

14
内置inb4 Mathematica。
詹姆斯

Minnesota MN 6.875%-因为.005%实际上很多。
Magic Octopus Urn'Sep

1
啊...对...这不是所得税。
Magic Octopus Urn'Sep

2
@Shaggy不,大小写无关紧要。
AdmBorkBork's

2
Pedantry:华盛顿州的缩写是WA,而不是WS。
Michael Seifert

Answers:


15

Mathematica,112 103 77 76 66字节

Mathematica内置了所有功能

NumberForm[Interpreter["USState"][#]@"StateSalesTaxRate"#2,{9,2}]&

带有州名(任何格式;缩写或全名)和美元金额。

在Wolfram Sandbox上尝试

用法

f = NumberForm[Interpreter["USState"][#]@"StateSalesTaxRate"#2,{9,2}]&

 

f["CA", 1025.00]

61.50

f["miNnNesToA", 123.45]

8.49

说明

Interpreter["USState"][#]

将输入解释为美国州名,并生成一个Entity

... @"StateSalesTaxRate"

获取营业税率。

... #2

乘以第二个输入。

NumberForm[..., {9,2}]

将结果格式化为一个数字,该数字在小数点左侧为9位,在其右侧为2位。


6
Mathematica。当然...
Ven

8
现在真傻了!
毛茸茸的

为什么只要使用字符串即可获得142nd属性,就需要使用API​​?
尼尔于2009年

11
这里有一个半严肃的学点。鉴于Mathematica从不断更新的数据存储中获取实词数据,当特定州的税率发生变化时会发生什么?相对于问题中给出的规格,此答案是否就变得无效了?
ymbirtt

4
@metmbirtt在这个元讨论中应该没问题
JungHwan Min'9

5

R219212字节

function(S,m)sprintf("%.2f",c(4,0,5.6,6.5,6,2.9,6.35,0,6,4,4,6,6.25,7,6,6.5,6,5,5.5,6,6.25,6,6.875,7,4.23,0,5.5,4.6,0,6.88,5.13,4,4.75,5,5.75,4.5,0,6,7,6,4.5,7,6.25,4.7,6,4.3,6.5,6,5,4)[match(S,state.abb)]*m/100)

将状态作为缩写(全部大写)。

state.abb 是内置的R数据,带有国家缩写,按字母顺序排列,因此它对营业税进行硬编码,查找状态的索引,计算营业税,并格式化为2个小数位(以字符串形式输出)。

在线尝试!


5

05AB1E,134字节

.•2=Šλ₁ÙH ’€9¿FîβïLT_s€¤Ôтαxì8ÜuK8º'DιÒ—pcλ¯øÒÔ\’þü€ŒβÞéΣŽZê•#.å1kUX0‹i6*т/ëX•Ž½ì∞в’±₃C¸wiα·¥žYÉúžĆƵ˜šŸ‰Ê‡†Σgλ&/ûjDĆв₆•hR„AB„ .‡#è*т/}

在线尝试!


RIP Mathematica获胜。


这一切都是压缩以下字符串:

AKDEMTNHOR CO ALGANYHIWY MO VA SDOK NV UT NC LANDWI NM MENE AZ OH ILMATX CT ARKSWS MN NJ INMSRITN

和:

0 2.9 4 4.23 4.3 4.5 4.6 4.7 4.75 5 5.13 5.5 5.6 5.75 6.25 6.35 6.5 6.875 6.88 7

然后使用输入状态的索引来确定速率的索引,默认为6,因为存在许多状态为6%的状态。


供其他人食用:

AKDEMTNHOR 0
CO         2.9
ALGANYHIWY 4
MO         4.23
VA         4.3
SDOK       4.5
NV         4.6
UT         4.7
NC         4.75
LANDWI     5
NM         5.13
MENE       5.5
AZ         5.6
OH         5.75
CAFLIDIAKYMDMIPASCVTWV 6
ILMATX     6.25
CT         6.35
ARKSWS     6.5
MN         6.875
NJ         6.88

请注意,这仅行得通,因为我对状态进行了排序,以使2个状态的交集不会创建不同的状态EG(OHINcontains,[OH,IN,HI]INOHonly contains [IN,OH]


关于此的大多数想法来自我以前基于状态的条目


TIO链接具有-d标志
H.PWiz

@ H.PWiz用于可视化堆栈。如果删除它,您将看到程序的常规输出。
Xcoder先生17年

@ H.PWiz仅用于可视化目的,逐个命令使用它,并让您查看程序为何运行。
Magic Octopus Urn'Sep

啊,我以为是误记了。
H.PWiz

3

Pyth,270个 258 233 219字节

*c@[6Z5.75K6.25 5.5 5 4Z7 6.5J6 7J6.875 7 4J6.35Z6 7 5 4.75 4 4.23J5J5.13 4.6JJ4J4 4.3 4.5Z5.6J.5 4.7K4.5KZ6.5 6.88 5.5J2.9)xc."AZ-íâFT34r7²¨cK'ÉT?Ú5Ï)}4Që7ËÅÖpuªXTiÖ¶7×ì­Éͨ."2w100

必须像这样传递参数:

1025
CA

说明:

*c@[...)xc."..."2w100
          ."..."       Decompress the string
         c      2      Cut the string in chunks of size 2 (states abbreviations)
        x        w     Get the index of the second parameter in that string
  @[    )              Index into the tax array
 c                100  Generate a percentage
*                      Multiply that with the implicit input at the end
Alas, `.Z` makes this longer. Maybe there's a way to write the array more efficiently, by repeating the keys, but I havn't found one yet.

感谢@ Mr.Xcoder。




我以为只有.Z可用。再次感谢你 ;-)。
2015年

3

的Java(OpenJDK的8) 594 + 19 592 580 575 412个字节

s->a->{float[]r={0};java.util.Arrays.asList("AL4`AK0`AZ5.6`AR6.5`CA6`CO2.9`CT6.35`DE0`FL6`GA4`HI4`ID6`IL6.25`IN7`IA6`KS6.5`KY6`LA5`ME5.5`MD6`MA6.25`MI6`MN6.875`MS7`MO4.23`MT0`NE5.5`NV4.6`NH0`NJ6.88`NM5.13`NY4`NC4.75`ND5`OH5.75`OK4.5`OR0`PA6`RI7`SC6`SD4.5`TN7`TX6.25`UT4.7`VT6`VA4.3`WS6.5`WV6`WI5`WY4".split("`")).forEach(e->{if(e.contains(s))r[0]=a/100*new Float(e.substring(2));});return s.format("%.2f",r[0]);}

在线尝试!


1
您可以通过直接寻址Arraysas java.util.Arrays并摆脱import语句来节省9个字节。我会包含一个TIO链接,但是太长了。:P
完全人类的

您可以通过删除来节省更多的字节final;改变doublefloat; 改变Double.parseDoublenew Float; 并通过使用currying 更改(s,a)->这是TIO链接,了解操作方法。s->a->
凯文·克鲁伊森

1
哦,您还可以删除所有逗号和结尾的零,然后更改substring(3)substring(2)TIO 415 bytes。那比我的Java回答要短..;)
Kevin Cruijssen

3

Java的8,486个 467 309 299 290 289字节

s->a->{float r=6;for(String x:"AKDENHORMT0 CO2.9 ALGANYHIWY4 MO4.23 VA4.3 SDOK4.5 NV4.6 UT4.7 NC4.75 LANDWI5 NM5.13 MENE5.5 AZ5.6 OH5.75 ILMATX6.25 CT6.35 ARKSWS6.5 MN6.875 NJ6.88 MSRINTN7".split(" "))if(x.contains(s))r=new Float(x.replaceAll("[A-Z]",""));return s.format("%.2f",a*r/100);}

@MagicOctopusUrn通过删除分号来获得 -19个字节。

说明:

在这里尝试。

s->a->                    // Method with String and float parameters and String return-type
  float r=6;              //  Float starting at 6 (most states had 6.00 as tax)
  for(String x:"...".split(" "))
                          //  Loop over all states + amounts
    if(x.contains(s))     //   If the input-state is found in String `x`:
      r=new Float(x.replaceAll("[A-Z]",""));
                          //    Set float `r` to the amount of this state
                          //  End of loop (implicit / single-line body)
  return s.format("%.2f", //  Return result rounded to 2 decimal points:
     a*r/100);            //   Float input multiplied by `r` divided by 100
}                         // End of method

1
如果您使用我的答案中的顺序,则可以删除字符串中的所有分号。
Magic Octopus Urn'Sep

HI;NY并且 MT;NH目前是代码中阻止您删除所有分号的唯一内容。颠倒两者的顺序,它可以节省20个字节。
魔术章鱼缸

1
@MagicOctopusUrn谢谢,编辑!顺便说一句,您可能还想将其状态添加7到您的答案中(尽管TN确实会干扰的当前顺序0)。
凯文·克鲁伊森

@MagicOctopusUrn INMSRITN 7.00AKDENHORMT 0.00可能不会与其他任何冲突。
凯文·克鲁伊森

2

Perl 6,341字节

my%a=((<ME NE>X=>5.5),CO=>2.9,MO=>4.23,MN=>6.875,NJ=>6.88,(<LA ND WI>X=>5),(<AK DE MT NH OR>X=>0),(<IN MS RI TN>X=>7),(<AR KS WS>X=>6.5),AZ=>5.6,(<AL GA HI NY WY>X=>4),VA=>4.3,UT=>4.7,(<IL MA TX>X=>6.25),(<CA FL ID IA KY MD MI PA SC VT WV>X=>6),(<OK SD>X=>4.5),NV=>4.6,NM=>5.13,CT=>6.35,OH=>5.75,NC=>4.75).flat;{round $^a*(%a{$^b}/100),0.01}

嗯 我猜这是非常人为的。这使用了Perl 6的元运算符,例如X=>此处,它是X(跨产品)与结合使用的=>

这意味着<ME NE> X=> 5.5(where <ME NE>means ('ME', 'NE'))被=> 5.5应用于数组的每个元素,产生了ME => 5.5, NE => 5.5。括号只是在这里优先。


作为一名高尔夫球手(erm ...),我显然不是手工手写的(实际功能除外)。所以我写了一个元高尔夫球来生成最有效的组合!

my %values;
my %simple;
for lines() {
  my $abb = m/<[A .. Z]> ** 2/.Str;
  my $val = m/\d\.\d+/.Str;
  %values{$val}.push: $abb;
  %simple{$abb} = $val;
}

say "(", (join ',', do for %values.kv -> $key, @vals {
  my $int-key = +$key;
  if @vals > 1 {
    "(<{@vals}>X=>$int-key)"
  } else {
    "{@vals}=>$int-key"
  }
}), ").flat";

say();

say join ',', do for %simple.kv -> $key, $val {
  "$key=>" ~ +$val
}

它既生成X=>案例又生成更简单的案例(每个案例都被枚举),我选择了最短的案例(前者)。


2

的JavaScript(ES6),227个 224字节

以currying语法接受输入,(s)(v)其中s是状态,v是数量。使用地板舍入。

s=>v=>(v*(p=s=>parseInt(s,36))('3344bk50k4mo28k4we4tm5eg3uw48s5az39i3js5b43yi3ny4fq3h03mk3bg'.substr(p('k039017k00038f00030022h00g000j00k600k080k707h30706800ba0030305ic0303303930460000e00d2'[p(s)*84%943%85])*3,3))/1e3|0)/100

演示版


1

Kotlin,444字节

val S="0|AK|DE|MT|NH|OR#2.9|CO#4|AL|GA|HI|NY|WY#4.23|MO#4.3|VA#4.5|OK|SD#4.6|NV#4.7|UT#4.75|NC#5|LA|ND|WI#5.13|NM#5.5|ME|NE#5.6|AZ#5.75|OH#6|CA|FL|ID|IA|KY|MD|MI|PA|SC|VT|WV#6.25|IL|MA|TX#6.35|CT#6.5|AR|KS|WS#6.875|MN#6.88|NJ#7|IN|MS|RI|TN"
fun c(t:String,d:Double){
val m=mutableMapOf<String,Double>()
S.split("#").map{val s=it.split("|")
for (item in s.subList(1, s.size))m.put(item, s[0].toDouble())}
System.out.printf("%.2f", m[t]!!*d*.01)}

在线尝试!

美化

// Tax rate followed by states with that rate separated by pipes, with hashes in between
val STATES="0|AK|DE|MT|NH|OR#2.9|CO#4|AL|GA|HI|NY|WY#4.23|MO#4.3|VA#4.5|OK|SD#4.6|NV#4.7|UT#4.75|NC#5|LA|ND|WI#5.13|NM#5.5|ME|NE#5.6|AZ#5.75|OH#6|CA|FL|ID|IA|KY|MD|MI|PA|SC|VT|WV#6.25|IL|MA|TX#6.35|CT#6.5|AR|KS|WS#6.875|MN#6.88|NJ#7|IN|MS|RI|TN"

fun function(targetState: String, amount: Double) {
    // Stores data
    val m = mutableMapOf<String, Double>()
    // For each rate
    STATES.split("#").map {
        // Split the data out
        val rateData = it.split("|")
        // For each state with that rate
        for (stateCode in rateData.subList(1, rateData.size)) {
            // Put it in the dataset
            m.put(stateCode, rateData[0].toDouble())
        }
    }

    // Print out the tax rate
    System.out.printf("%.2f", m[targetState]!! * amount * .01)
}

1

Python 3,303字节

import re
t=re.split("(\d+)","AL4AK0AZ56AR65CA6CO29CT635DE0FL6GA4HI4ID6IL625IN7IA6KS65KY6LA5ME55MD6MA625MI6MN6875MS7MO423MT0NE55NV46NH0NJ688NM513NY4NC475ND5OH575OK45OR0PA6RI7SC6SD45TN7TX625UT47VT6VA43WS65WV6WI5WY4")
f=lambda s,a:"%.2f"%({t[i-1]:float(t[i])/10**-~len(t[i])for i in range(1,len(t),2)}[s]*a)

在线尝试!

非常简单:数据存储为两个字符+数字列表:每个百分比小于10,因此可以将其存储为整数部分(1位)+小数部分(0 -...位)。


1

C# 318个 309字节


数据

  • 输入 String s状态大写字母的2个字母的缩写。
  • 输入 Double v
  • 输出 String要收集的税值四舍五入到小数点后两位

打高尔夫球

(s,v)=>{for(int i=0;i<21;i++)if("NHAKDEMTOR,CO,ALHIGANYWY,MO,VA,SDOK,NV,UT,NC,NDLAWI,NM,MENE,AZ,OH,KYCAFLIDIAMDMIPASCVTWV,ILMATX,CT,ARKSWA,MN,NJ,MSINRITN".Split(',')[i].Contains(s))return $"{v*(new[]{0,2.9,4,4.23,4.3,4.5,4.6,4.7,4.75,5,5.13,5.5,5.6,5.75,6,6.25,6.35,6.5,6.875,6.88,7}[i]/100):F2}";return "";};

不打高尔夫球

( s, v ) => {
    for( int i = 0; i < 21; i++ )
        if( "NHAKDEMTOR,CO,ALHIGANYWY,MO,VA,SDOK,NV,UT,NC,NDLAWI,NM,MENE,AZ,OH,KYCAFLIDIAMDMIPASCVTWV,ILMATX,CT,ARKSWA,MN,NJ,MSINRITN".Split( ',' )[ i ].Contains( s ) )
            return $"{v * ( new[] { 0, 2.9, 4, 4.23, 4.3, 4.5, 4.6, 4.7, 4.75, 5, 5.13, 5.5, 5.6, 5.75, 6, 6.25, 6.35, 6.5, 6.875, 6.88, 7 }[ i ] / 100 ):F2}";
    return "";
};

非高尔夫可读

// Takes a 2 letter abbreviation state ( 's' ) and a value ( 'v' )
( s, v ) => {

    // Cycles through an array with the states grouped by tax value
    for( int i = 0; i < 21; i++ )

        // Checks if the state group at the current index contains the state 's'
        if( "NHAKDEMTOR,CO,ALHIGANYWY,MO,VA,SDOK,NV,UT,NC,NDLAWI,NM,MENE,AZ,OH,KYCAFLIDIAMDMIPASCVTWV,ILMATX,CT,ARKSWA,MN,NJ,MSINRITN".Split( ',' )[ i ].Contains( s ) )

            // Returns the value 'v' * the corresponding state percentage divided by 100
            return $"{v * ( new[] { 0, 2.9, 4, 4.23, 4.3, 4.5, 4.6, 4.7, 4.75, 5, 5.13, 5.5, 5.6, 5.75, 6, 6.25, 6.35, 6.5, 6.875, 6.88, 7 }[ i ] / 100 ):F2}";

    // If the state isn't found, return an empty string
    return "";
};

完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<String, Double, String> f = ( s, v ) => {
            for( int i = 0; i < 21; i++ )
                if( "NHAKDEMTOR,CO,ALHIGANYWY,MO,VA,SDOK,NV,UT,NC,NDLAWI,NM,MENE,AZ,OH,KYCAFLIDIAMDMIPASCVTWV,ILMATX,CT,ARKSWA,MN,NJ,MSINRITN".Split( ',' )[ i ].Contains( s ) )
                    return $"{v * ( new[] { 0, 2.9, 4, 4.23, 4.3, 4.5, 4.6, 4.7, 4.75, 5, 5.13, 5.5, 5.6, 5.75, 6, 6.25, 6.35, 6.5, 6.875, 6.88, 7 }[ i ] / 100 ):F2}";
            return "";
        };

        static void Main( string[] args ) {
            List<KeyValuePair<String, Double>>
                testCases = new List<KeyValuePair<String, Double>>() {
                    new KeyValuePair<String, Double>( "CA", 1025.0d ),
                    new KeyValuePair<String, Double>( "MN", 123.45d ),
                };

            foreach( KeyValuePair<String, Double> testCase in testCases ) {
                Console.WriteLine( $" STATE: {testCase.Key}\n VALUE: {testCase.Value}\nOUTPUT: {f( testCase.Key, testCase.Value )}\n" );
            }

            Console.ReadLine();
        }
    }
}

发布

  • 1.0 - 318 bytes-初始溶液。
  • V1.1 - - 9 bytes-改变了.ToString("F2")在第一回插字符串使用。

笔记

  • 没有

0

AWK,277字节

{split("LANDWI 5 VA 4.3 IACAFLIDKYMDMIPASCVTWV 6 SDOK 4.5 MO 4.23 CO 2.9 NM 5.13 NV 4.6 UT 4.7 NJ 6.88 MENE 5.5 AZ 5.6 ARKSWA 6.5 MN 6.875 MSINRITN 7 ILMATX 6.25 NC 4.75 CT 6.35 ALGANYWYHI 4 OH 5.75 AKDEMTORNH 0",T)
for(i in T)if(T[i]~s=".*"$1".*")printf"%.2f\n",$2*T[i+1]*.01}

在线尝试!

一个可观的分数,但远不及Mathematica。我确实在每次检查后通过换行打印来添加2个字节,但我认为这样更漂亮:)

(希望很明显,输入应该是状态缩写和一行上的值。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.