Calculadora de imposto sobre vendas simples do estado

10

Os impostos sobre vendas nos Estados Unidos são complicados, para dizer o mínimo. Geralmente, há um imposto estadual sobre vendas (existem vários estados que não cobram um imposto estadual), mas também pode haver um imposto municipal sobre vendas, um imposto municipal sobre vendas, um imposto sobre vendas escolares, um imposto municipal sobre vendas ou um imposto municipal sobre vendas. imposto sobre vendas na região metropolitana. Pode até haver diferentes impostos sobre vendas em diferentes partes da cidade. Para os propósitos deste desafio, no entanto, focaremos apenas o imposto estadual sobre vendas.

Dado um valor em dólares americanos maior que zero (com precisão de duas casas decimais) e um estado (o nome completo ou a abreviação de duas letras, sua escolha, maiúsculas e minúsculas não importa) e usando o gráfico abaixo das porcentagens de impostos sobre vendas, gerar o imposto estadual sobre vendas correspondente a ser cobrado para essa venda específica, preciso e truncado com duas casas decimais. Especifique como o seu código lida com o arredondamento.

Edit: A abreviação de Washington foi listada incorretamente como WS em vez de WA. As respostas podem usar qualquer uma das abreviações, já que esse foi meu ponto de vista.

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%

Exemplo para a Califórnia com 6% de imposto estadual sobre vendas -

CA
1025.00

61.50

Exemplo para Minnesota a 6,875% -

MN
123.45

8.49
AdmBorkBork
fonte
14
inb4 Mathematica embutido.
James
Minnesota MN 6.875%- porque 0,005% é, na verdade, muito.
Magic Octopus Urn
11
Ahhh ... certo ... isso não é imposto de renda.
Magic Octopus Urn
2
@ Shaggy Não, o caso não importa.
AdmBorkBork 5/09
2
Pediatria: a abreviação do estado para Washington é WA, não WS.
Michael Seifert 5/09

Respostas:

15

Mathematica, 112 103 77 76 66 bytes

O Mathematica tem um builtin para tudo

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

Leva um nome de estado (qualquer formato; abreviação ou nome completo) e o valor em dólar.

Experimente na Wolfram Sandbox

Uso

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

 

f["CA", 1025.00]

61,50

f["miNnNesToA", 123.45]

8.49

Explicação

Interpreter["USState"][#]

Interprete a entrada como um nome de Estado dos EUA e gere um Entity.

... @"StateSalesTaxRate"

Obtenha a taxa de imposto sobre vendas.

... #2

Multiplique isso pela segunda entrada.

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

Formate o resultado em um número com 9 dígitos à esquerda do decimal e 2 dígitos à direita.

JungHwan Min
fonte
6
Mathematica. Claro ...
Ven
8
Isso está ficando bobo agora!
Shaggy
Por que você precisa usar uma API desde a string para obter a propriedade 142?
Neil
11
Há um ponto pedante semi-sério aqui. Dado que o Mathematica obtém seus dados com palavras reais de um armazenamento de dados em constante atualização, o que acontece quando a taxa de imposto de um determinado estado muda? Essa resposta não se torna inválida em relação às especificações fornecidas na pergunta?
ymbirtt 5/09/17
4
@ymbirtt deve ficar bem com esta meta discussão .
JungHwan Min 5/09/17
5

R , 219 212 bytes

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)

Assume o estado como uma abreviação (todas em maiúsculas).

state.abb são os dados R incorporados com as abreviações do estado em ordem alfabética; portanto, codifica os impostos sobre vendas, localiza o índice do estado, calcula o imposto sobre vendas e formata para duas casas decimais (saída como uma sequência).

Experimente online!

Giuseppe
fonte
5

05AB1E , 134 bytes

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

Experimente online!


O RIP Mathematica vence.


Tudo isso faz é comprimir as seguintes seqüências de caracteres:

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

E:

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

Em seguida, usa o índice do estado de entrada para determinar o índice da taxa, padronizando para 6, porque existem muitos estados com 6%.


Para outros consumirem:

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

Observe que isso só funciona porque eu ordenei os estados de forma que nenhuma interseção de 2 estados crie um estado diferente EG ( OHINcontém [OH,IN,HI]enquanto INOHapenas contém [IN,OH])


A maioria das idéias para isso veio da minha entrada anterior baseada em estado .

Urna de polvo mágico
fonte
O link do TIO possui uma -dbandeira
H.PWiz 5/17
@ H.PWiz Isso é para visualizar a pilha. Se você removê-lo, verá a saída regular do programa.
Sr. Xcoder 5/09
@ H.PWiz é apenas para fins de visualização, utiliza comando por comando e permite que você veja por que o programa funciona.
Urna de polvo mágico
Ah, eu pensei que foi deixado por engano.
H.PWiz
3

Pitão, 270 258 233 219 bytes

*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

Devem ser passados ​​parâmetros da seguinte forma:

1025
CA

Explicação:

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

Graças a @ Mr.Xcoder.

Ven
fonte
233 bytes
Sr. Xcoder 5/17
Eu pensei que só .Zestava disponível. Mais uma vez obrigado ;-).
Ven
3

Java (OpenJDK 8) , 594 + 19 592 580 575 412 bytes

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

Experimente online!

Roberto Graham
fonte
11
Você pode salvar 9 bytes endereçando diretamente Arrayscomo java.util.Arrayse se livrando da instrução de importação. Eu incluiria um link TIO, mas é muito longo. : P
totallyhuman
Você pode salvar mais alguns bytes removendo final; mudando doublepara float; mudando Double.parseDoublepara new Float; e mudar (s,a)->para s->a->usando currying. Aqui está o link do TIO para ver como.
Kevin Cruijssen
11
Ah, e você também pode remover todas as vírgulas e zeros à direita e alterar substring(3)para substring(2): TIO 415 bytes . Isso é mais curto do que a minha resposta Java ..;)
Kevin Cruijssen
3

Java 8, 486 467 309 299 290 289 bytes

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 bytes graças a @MagicOctopusUrn removendo o ponto e vírgula.

Explicação:

Experimente aqui.

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
Kevin Cruijssen
fonte
11
Se você usar o pedido da minha resposta, poderá remover todos os pontos e vírgulas em suas seqüências.
Magic Octopus Urn
HI;NYe MT;NHatualmente são as únicas coisas em seu código que o impedem de remover todos os pontos e vírgulas. Inverta a ordem de ambos e funcionaria por 20 bytes salvos.
Magic Octopus Urn
11
@MagicOctopusUrn Obrigado, editado! Aliás, convém adicionar os estados para 7a sua resposta (embora TNisso interfira na ordem atual de 0).
Kevin Cruijssen
@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00é possível sem entrar em conflito com mais nada.
Kevin Cruijssen
2

Perl 6, 341 bytes

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}

Então, hein. Isso é bastante artificial, eu acho. Isso usa meta-operadores do Perl 6, como X=>aqui, que é X(produto cruzado) combinado com =>.

Isso significa <ME NE> X=> 5.5(em que <ME NE>meios ('ME', 'NE')) é => 5.5aplicado em cada elemento da matriz, produzindo ME => 5.5, NE => 5.5. Os parênteses estão aqui apenas para precedência ...


Como jogador de golfe (erm ...), obviamente não o escrevi à mão (exceto a função real). Então eu escrevi um meta-jogador para gerar a combinação mais eficiente!

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
}

Ele gera os X=>casos e o caso mais simples (com cada um sendo enumerado), e eu escolhi o mais curto (o primeiro).

Ven
fonte
2

JavaScript (ES6), 227 224 bytes

Recebe entrada na sintaxe de curry, (s)(v)onde s é o estado ev é a quantidade. Usa arredondamento de piso.

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

Demo

Arnauld
fonte
1

Kotlin , 444 bytes

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

Experimente online!

Embelezado

// 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)
}
jrtapsell
fonte
1

Python 3 , 303 bytes

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)

Experimente online!

Muito simples: os dados são armazenados como dois caracteres + lista de dígitos: cada porcentagem é inferior a 10, portanto, pode ser armazenada como parte inteira (1 dígito) + parte decimal (0 -... dígito (s)).

jferard
fonte
1

C # , 318 309 bytes


Dados

  • Entrada String s A abreviação de 2 letras do estado em maiúsculas.
  • Entrada Double v O valor
  • Saída String O valor do imposto a ser cobrado arredondado para 2 casas decimais

Golfe

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

Ungolfed

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

Ungolfed legible

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

Código completo

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

Lançamentos

  • v1.0 - 318 bytes- Solução inicial.
  • v1.1 - - 9 bytes- Alterado o .ToString("F2")usado no primeiro retorno para seqüências de caracteres interpoladas.

Notas

  • Nenhum
auhmaan
fonte
0

AWK , 277 bytes

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

Experimente online!

Uma pontuação respeitável, mas longe de Mathematica. Eu adicionei 2 bytes tendo uma nova linha impressa após cada verificação, mas acho que é mais bonito assim :)

(Espero que seja óbvio que a entrada deve ser a abreviação de estado e um valor em uma linha.)

Robert Benson
fonte