Calcolatore dell'imposta sulle vendite semplice


10

Le tasse sulle vendite negli Stati Uniti sono, per non dire altro, complicate. In genere, esiste un'imposta sulle vendite statale (ci sono una manciata di stati che non riscuotono un'imposta sulle vendite statale), ma potrebbero esserci anche un'imposta sulle vendite della contea, un'imposta sulle vendite del distretto scolastico, un'imposta sulle vendite comunale (città) o un imposta sulle vendite per area metropolitana. Potrebbero anche esserci diverse imposte sulle vendite in diverse parti di una città. Ai fini di questa sfida, tuttavia, ci concentreremo solo sull'imposta sulle vendite statale.

Dato un importo in dollari USA maggiore di zero (preciso al secondo decimale) e uno stato (il nome completo o l'abbreviazione di due lettere, la scelta, il caso non ha importanza) e utilizzando il seguente grafico delle percentuali di imposta sulle vendite, emettere l'imposta sulle vendite statale corrispondente che deve essere riscossa per quella particolare vendita, accurata e troncata con due decimali. Specifica come il tuo codice gestisce l'arrotondamento.

Modifica: l'abbreviazione di Washington è stata erroneamente elencata come WS anziché WA. Le risposte possono usare entrambe le abbreviazioni, dato che era il mio goof.

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%

Esempio per la California al 6% di imposta sulle vendite statali -

CA
1025.00

61.50

Esempio per il Minnesota al 6,875% -

MN
123.45

8.49

14
inb4 Mathematica incorporato.
James,

Minnesota MN 6.875%- perché lo 0,005% in realtà è molto.
Magic Octopus Urn

1
Ahhh ... giusto ... questa non è imposta sul reddito.
Magic Octopus Urn

2
@Shaggy No, il caso non ha importanza.
AdmBorkBork,

2
Pedanteria: l'abbreviazione di stato per Washington è WA, non WS.
Michael Seifert,

Risposte:


15

Mathematica, 112 103 77 76 66 byte

Mathematica ha una funzione per tutto

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

Prende un nome di stato (qualsiasi formato; abbreviazione o nome completo) e l'importo in dollari.

Provalo su Wolfram Sandbox

uso

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

 

f["CA", 1025.00]

61.50

f["miNnNesToA", 123.45]

8.49

Spiegazione

Interpreter["USState"][#]

Interpreta l'input come un nome di stato USA e genera un Entity.

... @"StateSalesTaxRate"

Ottieni l'aliquota dell'imposta sulle vendite.

... #2

Moltiplicalo per il secondo input.

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

Formatta il risultato in un numero con 9 cifre a sinistra del decimale e 2 cifre a destra.


6
Matematica. Certo ...
Ven

8
Adesso sta diventando sciocco!
Shaggy

Perché è necessario utilizzare un'API purché la stringa per ottenere la proprietà 142nd?
Neil,

11
C'è un punto pedante semi-serio qui. Dato che Mathematica ricava i suoi dati di parole reali da un archivio dati in costante aggiornamento, cosa succede quando l'aliquota fiscale di un determinato stato cambia? Questa risposta non diventa quindi non valida rispetto alle specifiche fornite nella domanda?
ymbirtt,

4
@ymbirtt dovrebbe andare bene per questa meta discussione .
JungHwan Min

5

R , 219 212 byte

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)

Prende lo stato come abbreviazione (tutto maiuscolo).

state.abb sono i dati R incorporati con le abbreviazioni dello stato in ordine alfabetico, quindi codificano le imposte sulle vendite, trova l'indice dello stato, calcola l'imposta sulle vendite e formatta con 2 cifre decimali (output come stringa).

Provalo online!


5

05AB1E , 134 byte

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

Provalo online!


RIP Mathematica vince.


Tutto ciò che fa è comprime le seguenti stringhe:

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

Quindi utilizza l'indice dello stato di input per determinare l'indice della velocità, il cui valore predefinito è 6, poiché ci sono così tanti stati con il 6%.


Per gli altri di consumare:

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

Nota che funziona solo perché ho ordinato gli stati in modo tale che nessuna intersezione di 2 stati crei uno stato diverso EG ( OHINcontiene [OH,IN,HI]mentre INOHcontiene solo[IN,OH] )


La maggior parte delle idee per questo proviene dal mio precedente ingresso basato sullo stato .


Il link TIO ha la -dbandiera
H.Pwiz,

@ H.PWiz Questo è per visualizzare lo stack. Se lo rimuovi, vedrai l'output regolare del programma.
Mr. Xcoder,

@ H.PWiz è solo a scopo di visualizzazione, lo prende comando per comando e ti fa vedere perché il programma funziona.
Magic Octopus Urn

Ah, ho pensato che fosse stato lasciato per errore.
H.Piz,

3

Pyth, 270 258 233 219 byte

*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

I parametri devono essere passati in questo modo:

1025
CA

Spiegazione:

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

Grazie a @ Mr.Xcoder.




Pensavo .Zfosse disponibile solo . Grazie ancora ;-).
Ven

3

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

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

Provalo online!


1
È possibile salvare 9 byte indirizzando direttamente Arrayscome java.util.Arraysed eliminando la dichiarazione di importazione. Includerei un collegamento TIO ma è troppo lungo. : P
totalmente umano il

È possibile salvare qualche byte in più rimuovendolo final; passando doublea float; passando Double.parseDoublea new Float; e passando (s,a)->a s->a->usando il curry. Ecco il link TIO per vedere come.
Kevin Cruijssen,

1
Oh, e puoi anche rimuovere tutte le virgole e gli zero finali e passare substring(3)a substring(2): TIO 415 byte . È più breve della mia risposta Java ..;)
Kevin Cruijssen,

3

Java 8, 486 467 309 299 290 289 byte

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 byte grazie a @MagicOctopusUrn rimuovendo i punti e virgola.

Spiegazione:

Provalo qui.

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
Se si utilizza l'ordinamento dalla mia risposta, è possibile rimuovere tutti i punti e virgola nelle stringhe.
Magic Octopus Urn

HI;NY e MT;NH attualmente sono le uniche cose nel tuo codice che ti impediscono di rimuovere tutti i punti e virgola. Invertire l'ordine di entrambi e funzionerebbe per circa 20 byte salvati.
Magic Octopus Urn

1
@MagicOctopusUrn Grazie, modificato! A proposito, potresti voler aggiungere anche gli stati 7alla tua risposta (anche TNse interferisce con l'attuale ordine di 0).
Kevin Cruijssen,

@MagicOctopusUrn INMSRITN 7.00 & AKDENHORMT 0.00è possibile senza essere in conflitto con nient'altro.
Kevin Cruijssen,

2

Perl 6, 341 byte

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}

Quindi, eh. Questo è abbastanza inventato, immagino. Questo utilizza i meta-operatori di Perl 6, come X=>qui, che è X(prodotto incrociato) combinato con =>.

Ciò significa che <ME NE> X=> 5.5(dove <ME NE>significa ('ME', 'NE')) viene => 5.5applicato su ogni elemento dell'array, cedendoME => 5.5, NE => 5.5 . Le parentesi sono semplicemente qui per la precedenza ...


Come giocatore di golf (erm ...), ovviamente non l'ho scritto a mano (tranne la funzione effettiva). Quindi ho scritto un meta-golfista per generare la combinazione più efficiente!

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
}

Genera sia i X=>casi sia il caso più semplice (con ognuno dei quali elencati), e ho scelto il più breve (il primo).


2

JavaScript (ES6), 227 224 byte

Accetta input nella sintassi del curry in (s)(v)cui s è lo stato e v è l'importo. Utilizza l'arrotondamento del pavimento.

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

dimostrazione


1

Kotlin , 444 byte

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

Provalo online!

Abbellire

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

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)

Provalo online!

Molto semplice: i dati sono memorizzati come due caratteri + elenco di cifre: ogni percentuale è inferiore a 10, quindi può essere memorizzata come parte intera (1 cifra) + parte decimale (0 -... cifra (e)).


1

C # , 318 309 byte


Dati

  • Input String s L'abbreviazione di 2 lettere dello stato maiuscolo.
  • Input Double v Il valore
  • Output String Il valore fiscale da riscuotere arrotondato al secondo decimale

golfed

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

Leggibile non golfato

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

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

Uscite

  • v1.0 - 318 bytes- Soluzione iniziale.
  • v1.1 - - 9 bytes- Modificato l' .ToString("F2")usato nel primo ritorno alle stringhe interpolate.

Appunti

  • Nessuna

0

AWK , 277 byte

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

Provalo online!

Un punteggio rispettabile, ma da nessuna parte vicino a Mathematica. Ho aggiunto 2 byte avendo una nuova riga dopo ogni controllo, ma penso che sia più bello in quel modo :)

(Speriamo che sia ovvio che l'input dovrebbe essere l'abbreviazione dello stato e un valore su una riga.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.