Kalkulator Pajak Penjualan Negara Sederhana

10

Pajak penjualan di Amerika Serikat rumit, untuk sedikitnya. Secara umum, ada pajak penjualan negara bagian (ada beberapa negara bagian yang tidak memungut pajak penjualan negara bagian), tetapi bisa juga ada pajak penjualan daerah, pajak penjualan distrik sekolah, pajak penjualan kota, atau pajak penjualan pajak penjualan area metropolitan. Bahkan mungkin ada pajak penjualan yang berbeda di berbagai bagian kota. Namun, untuk keperluan tantangan ini, kita akan fokus hanya pada pajak penjualan negara bagian.

Diberikan jumlah dolar AS lebih besar dari nol (akurat ke dua tempat desimal) dan negara (baik nama lengkap atau singkatan dua huruf, pilihan Anda, kasing tidak masalah), dan menggunakan grafik persentase pajak penjualan di bawah ini, mengeluarkan pajak penjualan negara bagian terkait yang harus dikumpulkan untuk penjualan tertentu, akurat dan dipotong ke dua tempat desimal. Silakan tentukan bagaimana kode Anda menangani pembulatan.

Sunting: Singkatan untuk Washington salah terdaftar sebagai WS, bukan WA. Jawaban dapat menggunakan singkatan, karena itu adalah kesalahan saya.

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%

Contoh untuk California dengan pajak penjualan negara bagian 6% -

CA
1025.00

61.50

Contoh untuk Minnesota pada 6,875% -

MN
123.45

8.49
AdmBorkBork
sumber
14
inb4 Mathematica builtin.
James
Minnesota MN 6.875%- Karena 0,005%, yah, sebenarnya banyak.
Magic Octopus Urn
1
Ahhh ... benar ... ini bukan pajak penghasilan.
Magic Octopus Urn
2
@ Shaggy Tidak, kasing tidak masalah.
AdmBorkBork
2
Pedantry: singkatan negara bagian untuk Washington adalah WA, bukan WS.
Michael Seifert

Jawaban:

15

Mathematica, 112 103 77 76 66 byte

Mathematica memiliki dasar untuk segalanya

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

Mengambil nama negara (format apa pun; singkatan atau nama lengkap) dan jumlah dolar.

Cobalah di Wolfram Sandbox

Pemakaian

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

 

f["CA", 1025.00]

61.50

f["miNnNesToA", 123.45]

8.49

Penjelasan

Interpreter["USState"][#]

Menafsirkan input sebagai nama Negara AS dan menghasilkan Entity.

... @"StateSalesTaxRate"

Dapatkan tarif pajak penjualan.

... #2

Lipat gandakan dengan input kedua.

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

Format hasilnya menjadi angka dengan 9 digit di kiri desimal dan 2 digit di kanan.

JungHwan Min
sumber
6
Mathematica. Tentu saja ...
Ven
8
Ini semakin konyol sekarang!
Shaggy
Mengapa Anda perlu menggunakan API selama string untuk mendapatkan properti ke-142?
Neil
11
Ada titik pedantic semi-serius di sini. Mengingat bahwa Mathematica sumber data kata aslinya dari datastore yang terus diperbarui, apa yang terjadi ketika tarif pajak suatu negara berubah? Bukankah jawaban ini kemudian menjadi tidak valid sehubungan dengan spesifikasi yang diberikan dalam pertanyaan?
ymbirtt
4
@ymbirtt tidak masalah untuk diskusi meta ini .
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)

Mengambil status sebagai singkatan (semua huruf besar).

state.abb adalah data R bawaan dengan singkatan negara dalam urutan abjad, sehingga hardcode pajak penjualan, menemukan indeks negara, menghitung pajak penjualan, dan format ke 2 tempat desimal (output sebagai string).

Cobalah online!

Giuseppe
sumber
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„ .‡#è*т/}

Cobalah online!


RIP Mathematica menang.


Semua ini dilakukan adalah kompres string berikut:

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

Dan:

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

Kemudian gunakan indeks negara input untuk menentukan indeks tingkat, default ke 6, karena ada begitu banyak negara dengan 6%.


Untuk dikonsumsi orang lain:

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

Catatan ini hanya berfungsi karena saya memerintahkan negara-negara sehingga tidak ada persimpangan 2 negara menciptakan keadaan yang berbeda EG ( OHINberisi [OH,IN,HI]sedangkan INOHhanya berisi [IN,OH])


Sebagian besar ide untuk ini berasal dari entri berbasis negara saya sebelumnya .

Guci Gurita Ajaib
sumber
TIO link memiliki -dbendera
H.PWiz
@ H.PWiz Itu untuk memvisualisasikan tumpukan. Jika Anda menghapusnya, Anda akan melihat output reguler dari program.
Tn. Xcoder
@ H.PWiz hanya untuk tujuan visualisasi, bawa perintah demi perintah dan biarkan Anda melihat mengapa program ini bekerja.
Magic Octopus Urn
Ah, saya pikir itu karena kesalahan.
H.PWiz
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

Harus lulus parameter seperti ini:

1025
CA

Penjelasan:

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

Terima kasih kepada @ Mr.Xcoder.

Yang Mulia
sumber
233 bytes
Mr. Xcoder
Saya pikir hanya .Ztersedia. Terima kasih lagi ;-).
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]);}

Cobalah online!

Roberto Graham
sumber
1
Anda dapat menyimpan 9 byte dengan mengarahkan langsung Arrayssebagai java.util.Arraysdan menghilangkan pernyataan impor. Saya akan menyertakan tautan TIO tetapi terlalu panjang. : P
totallyhuman
Anda dapat menyimpan beberapa byte lagi dengan menghapus final; berubah doublemenjadi float; berubah Double.parseDoublemenjadi new Float; dan mengubah (s,a)->ke s->a->dengan menggunakan kari. Inilah tautan TIO untuk melihat caranya.
Kevin Cruijssen
1
Oh, dan Anda juga dapat menghapus semua koma dan mengekor nol dan mengubah substring(3)ke substring(2): TIO 415 byte . Itu lebih pendek dari jawaban Java saya ..;)
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 terima kasih kepada @MagicOctopusUrn dengan menghapus titik koma.

Penjelasan:

Coba di sini.

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
sumber
1
Jika Anda menggunakan pemesanan dari jawaban saya, Anda dapat menghapus semua titik koma di string Anda.
Magic Octopus Urn
HI;NYdan MT;NHsaat ini satu-satunya hal dalam kode Anda yang menghentikan Anda menghapus semua tanda titik koma. Membalik urutan keduanya dan itu akan berhasil seperti 20 byte yang disimpan.
Magic Octopus Urn
1
@MagicOctopusUrn Terima kasih, diedit! Btw, Anda mungkin ingin menambahkan status untuk 7jawaban Anda juga (meskipun TNtidak mengganggu urutan saat ini 0).
Kevin Cruijssen
@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00dimungkinkan tanpa bertentangan dengan hal lain.
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}

Jadi ya Kurasa ini dibuat-buat. Ini menggunakan meta-operator Perl 6, seperti di X=>sini, yang merupakan X(lintas produk) dikombinasikan dengan=> .

Itu berarti <ME NE> X=> 5.5(di mana <ME NE>cara ('ME', 'NE')) => 5.5diterapkan pada setiap elemen array, menghasilkan ME => 5.5, NE => 5.5. Tanda kurung di sini hanya untuk diutamakan ...


Sebagai pegolf (erm ...), saya jelas tidak menulis itu dengan tangan (kecuali fungsi sebenarnya). Jadi saya menulis meta-pegolf untuk menghasilkan kombinasi yang paling efisien!

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
}

Ini menghasilkan kedua X=>kasus dan kasus yang lebih sederhana (dengan masing-masing disebutkan), dan saya memilih yang terpendek (yang pertama).

Yang Mulia
sumber
2

JavaScript (ES6), 227 224 byte

Mengambil input dalam sintaks currying di (s)(v)mana s adalah status dan v adalah jumlah. Menggunakan pembulatan lantai.

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

Demo

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

Cobalah online!

Yg diperindahkan

// 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
sumber
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)

Cobalah online!

Sangat sederhana: data disimpan sebagai dua karakter + daftar digit: setiap persentase kurang dari 10, sehingga dapat disimpan sebagai bagian integer (1 digit) + bagian desimal (0 -... digit)

jferard
sumber
1

C # , 318 309 byte


Data

  • Input String s singkatan 2 huruf dari huruf besar negara.
  • Masukkan Double v nilai
  • Output String Nilai pajak yang harus dikumpulkan dibulatkan menjadi 2 tempat desimal

Golf

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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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

Rilis

  • v1.0 - 318 bytes- Solusi awal.
  • v1.1 - - 9 bytes- Mengubah yang .ToString("F2")digunakan dalam kembalinya pertama ke string interpolasi.

Catatan

  • Tidak ada
auhmaan
sumber
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}

Cobalah online!

Skor yang terhormat, tapi tidak jauh dari Mathematica. Saya memang menambahkan 2 byte dengan memiliki cetakan baris baru setelah setiap pemeriksaan, tapi saya pikir itu lebih cantik seperti itu :)

(Semoga jelas bahwa input harus menjadi singkatan negara dan nilai pada satu baris.)

Robert Benson
sumber