Prosty państwowy kalkulator podatku od sprzedaży


10

Podatki od sprzedaży w Stanach Zjednoczonych są co najmniej skomplikowane. Zasadniczo istnieje państwowy podatek od sprzedaży (istnieje kilka stanów, które nie pobierają państwowego podatku od sprzedaży), ale może również istnieć powiatowy podatek od sprzedaży, szkolny podatek od sprzedaży, miejski podatek od sprzedaży (miejski) lub podatek od sprzedaży podatek od sprzedaży w obszarze metropolitalnym. W różnych częściach miasta mogą istnieć nawet różne podatki od sprzedaży. Na potrzeby tego wyzwania skupimy się jednak tylko na stanowym podatku od sprzedaży.

Biorąc pod uwagę kwotę dolara amerykańskiego większą niż zero (z dokładnością do dwóch miejsc po przecinku) i stan (albo pełna nazwa, albo dwuliterowy skrót, twój wybór, wielkość liter nie ma znaczenia) i korzystając z poniższego wykresu procentowego podatku od sprzedaży, generują odpowiedni stanowy podatek od sprzedaży wymagany do tej konkretnej sprzedaży, dokładny i obcięty z dokładnością do dwóch miejsc po przecinku. Podaj, jak Twój kod obsługuje zaokrąglanie.

Edycja: skrót dla Waszyngtonu został niepoprawnie wymieniony jako WS zamiast WA. W odpowiedziach można użyć dowolnego skrótu, ponieważ to był mój głupek.

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%

Przykład dla Kalifornii z 6% stanowym podatkiem od sprzedaży -

CA
1025.00

61.50

Przykład dla Minnesoty na 6,875% -

MN
123.45

8.49

14
wbudowana inb4 Mathematica.
James

Minnesota MN 6.875%- ponieważ 0,005% to właściwie dużo.
Magic Octopus Urn

1
Ahhh ... racja ... to nie jest podatek dochodowy.
Magic Octopus Urn

2
@Shaggy Nie, sprawa nie ma znaczenia.
AdmBorkBork

2
Pedanteria: skrótem stanu dla Waszyngtonu jest WA, a nie WS.
Michael Seifert,

Odpowiedzi:


15

Mathematica, 112 103 77 76 66 bajtów

Mathematica ma wbudowane wszystko

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

Pobiera nazwę stanu (dowolny format; skrót lub imię i nazwisko) oraz kwotę w dolarach.

Wypróbuj na Wolfram Sandbox

Stosowanie

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

 

f["CA", 1025.00]

61,50

f["miNnNesToA", 123.45]

8,49

Wyjaśnienie

Interpreter["USState"][#]

Interpretuj dane wejściowe jako nazwę stanu USA i wygeneruj Entity .

... @"StateSalesTaxRate"

Uzyskaj stawkę podatku od sprzedaży.

... #2

Pomnóż to przez drugie wejście.

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

Sformatuj wynik w postaci 9 cyfr po lewej stronie dziesiętnej i 2 cyfr po prawej stronie.


6
Matematyka. Oczywiście ...
Ven

8
To teraz robi się głupie!
Kudłaty

Dlaczego musisz używać interfejsu API tak długo, jak ciąg, aby uzyskać 142. właściwość?
Neil

11
Jest tu półpoważny pedantyczny punkt. Biorąc pod uwagę, że Mathematica pozyskuje dane rzeczywiste ze stale aktualizowanego magazynu danych, co się stanie, gdy zmieni się stawka podatku dla określonego stanu? Czy ta odpowiedź nie staje się wówczas nieprawidłowa w odniesieniu do specyfikacji podanej w pytaniu?
ymbirtt

4
@ymbirtt powinno być w porządku na tę meta dyskusję .
JungHwan Min

5

R , 219 212 bajtów

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)

Przyjmuje stan jako skrót (wszystkie wielkie litery).

state.abb to wbudowane dane R ze skrótami stanu w kolejności alfabetycznej, więc koduje podatki od sprzedaży, znajduje indeks stanu, oblicza podatek od sprzedaży i formatuje do 2 miejsc po przecinku (dane wyjściowe jako ciąg).

Wypróbuj online!


5

05AB1E , 134 bajty

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

Wypróbuj online!


RIP Mathematica wygrywa.


Wszystko to kompresuje następujące ciągi:

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

I:

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

Następnie używa indeksu stanu wejściowego, aby określić indeks szybkości, domyślnie 6, ponieważ istnieje tak wiele stanów z 6%.


Aby inni mogli spożywać:

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

Zauważ, że to działa tylko dlatego, że uporządkowałem stany tak, że żadne przecięcie 2 stanów nie tworzy innego stanu EG ( OHINzawiera [OH,IN,HI]natomiast INOHzawiera tylko[IN,OH] )


Większość pomysłów na to pochodzi z mojego poprzedniego wpisu dotyczącego stanu .


Link TIO ma -dflagę
H.PWiz

@ H.PWiz To do wizualizacji stosu. Jeśli go usuniesz, zobaczysz zwykłe wyjście programu.
Pan Xcoder,

@ H.PWiz służy wyłącznie do celów wizualizacji, bierze polecenie po poleceniu i pozwala zobaczyć, dlaczego program działa.
Magic Octopus Urn

Ach, myślałem, że to pomyłka.
H.PWiz

3

Pyth, 270 258 233 219 bajtów

*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

Należy przekazać parametry takie jak:

1025
CA

Wyjaśnienie:

*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.

Dzięki @ Mr.Xcoder.




Myślałem, że tylko .Zjest dostępny. Jeszcze raz dziękuję ;-).
Ven

3

Java (OpenJDK 8) , 594 + 19 592 580 575 412 bajtów

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]);}

Wypróbuj online!


1
Można zapisać 9 bajtów bezpośrednio adresowania Arraysjak java.util.Arraysi pozbycie instrukcji import. Chciałbym dołączyć link TIO, ale jest za długi. : P
totalnie ludzki,

Możesz zaoszczędzić jeszcze kilka bajtów, usuwając final; zmiana doublena float; zmiana Double.parseDoublena new Float; i zmieniając (s,a)->się s->a->za pomocą curry. Oto link TIO, aby zobaczyć, jak to zrobić.
Kevin Cruijssen,

1
Aha, możesz także usunąć wszystkie przecinki i końcowe zera i zmienić substring(3)na substring(2): TIO 415 bajtów . To krócej niż moja odpowiedź Java ...;)
Kevin Cruijssen

3

Java 8, 486 467 309 299 290 289 bajtów

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);}

-19 bajtów dzięki @MagicOctopusUrn poprzez usunięcie średników.

Wyjaśnienie:

Wypróbuj tutaj.

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
Jeśli użyjesz kolejności z mojej odpowiedzi, możesz usunąć wszystkie średniki ze swoich ciągów.
Magic Octopus Urn

HI;NYi MT;NHobecnie są jedynymi rzeczami w twoim kodzie, które powstrzymują cię przed usunięciem wszystkich średników. Odwróć kolejność obu i działałoby to dla około 20 zapisanych bajtów.
Magic Octopus Urn

1
@MagicOctopusUrn Dzięki, edytowano! Przy okazji, możesz również dodać stany 7do swojej odpowiedzi (chociaż TNkoliduje to z obecną kolejnością 0).
Kevin Cruijssen

@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00jest możliwe bez konfliktu z niczym innym.
Kevin Cruijssen

2

Perl 6, 341 bajtów

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}

No tak. To chyba wymyślone. Używa to metaoperatorów Perla 6, jak X=>tutaj, co jest X(cross-product) połączone z =>.

Oznacza to <ME NE> X=> 5.5(gdzie <ME NE>oznacza ('ME', 'NE')) => 5.5zastosowanie do każdego elementu tablicy, dając ME => 5.5, NE => 5.5. Nawiasy są tutaj tylko w celu pierwszeństwa ...


Jako golfista (erm ...), oczywiście nie napisałem tego ręcznie (z wyjątkiem faktycznej funkcji). Napisałem więc meta-golfa, aby wygenerować najbardziej wydajną kombinację!

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
}

Generuje zarówno X=>przypadki, jak i sprawy najprostsze (każda jest wyliczana), a ja wybrałem najkrótszą (pierwszą).


2

JavaScript (ES6), 227 224 bajty

Pobiera dane wejściowe w składni curry, (s)(v)gdzie s to stan, a v to ilość. Wykorzystuje zaokrąglanie podłogi.

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

Próbny


1

Kotlin , 444 bajty

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

Wypróbuj online!

Upiększony

// 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 bajty

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)

Wypróbuj online!

Bardzo proste: dane są przechowywane jako dwa znaki + lista cyfr: każdy procent jest mniejszy niż 10, a zatem może być przechowywany jako część całkowita (1 cyfra) + część dziesiętna (cyfra 0 ...).


1

C # , 318 309 bajtów


Dane

  • Wpisz String s 2-literowy skrót wielkiej litery stanu.
  • Wprowadź Double v wartość
  • Wyjście String Wartość podatku, którą należy pobrać, w zaokrągleniu do 2 miejsc po przecinku

Grał w golfa

(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 "";};

Nie golfił

( 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 "";
};

Nieczytelny czytelny

// 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 "";
};

Pełny kod

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();
        }
    }
}

Wydawnictwa

  • v1.0 - 318 bytes- Wstępne rozwiązanie.
  • v1.1 - - 9 bytes- Zmieniono .ToString("F2")używane przy pierwszym powrocie na interpolowane ciągi.

Notatki

  • Żaden

0

AWK , 277 bajtów

{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}

Wypróbuj online!

Szanowany wynik, ale nigdzie w pobliżu Mathematica. Dodałem 2 bajty, drukując nowy wiersz po każdym sprawdzeniu, ale myślę, że jest ładniejszy :)

(Mam nadzieję, że oczywiste jest, że dane wejściowe powinny być skrótem stanu i wartością w jednym wierszu).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.