Basit Devlet Satış Vergisi Hesaplama


10

Amerika Birleşik Devletleri'ndeki satış vergileri karmaşıktır. Genel olarak, bir eyalet satış vergisi vardır (bir eyalet satış vergisi toplamayan bir avuç eyalet vardır), ancak bir ilçe satış vergisi, bir okul bölge satış vergisi, bir belediye (şehir) satış vergisi veya bir büyükşehir bölgesi satış vergisi. Bir şehrin farklı bölgelerinde farklı satış vergileri bile olabilir. Bununla birlikte, bu zorluğun amaçları doğrultusunda, sadece eyalet satış vergisine odaklanacağız.

Sıfırdan (iki ondalık basamağa kadar doğru) bir ABD doları tutarı ve bir eyalet (tam ad veya iki harfli kısaltma, seçiminiz, durumunuz önemli değildir) ve aşağıdaki satış vergisi yüzdeleri grafiğini kullanarak, söz konusu satış için tahsil edilmesi gereken ilgili devlet satış vergisini, doğru ve iki ondalık basamağa kesilmiş olarak verir. Lütfen kodunuzun yuvarlamayı nasıl işlediğini belirtin.

Düzenleme: Washington kısaltması yanlış WA yerine WS olarak listelenmiştir. Cevaplar her iki kısaltmayı da kullanabilir, çünkü bu benim amacımdı.

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 eyalet satış vergisi ile Kaliforniya örneği -

CA
1025.00

61.50

Minnesota örneği% 6.875 -

MN
123.45

8.49

14
inb4 Mathematica yerleşik.
James

Minnesota MN 6.875%- çünkü% .005, aslında çok fazla.
Sihirli Ahtapot Urn

1
Ahhh ... doğru ... bu gelir vergisi değil.
Sihirli Ahtapot Urn

2
@Shaggy Hayır, durum önemli değil.
AdmBorkBork

2
Bilgiçlik: Washington'un eyalet kısaltması WS değil WA'dır.
Michael Seifert

Yanıtlar:


15

Mathematica 112 103 77 76 66 bayt

Mathematica'da her şey için bir yerleşik vardır

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

Bir durum adı (herhangi bir biçim; kısaltma veya tam ad) ve dolar tutarını alır.

Wolfram Sandbox'ta deneyin

kullanım

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

 

f["CA", 1025.00]

61.50

f["miNnNesToA", 123.45]

8.49

açıklama

Interpreter["USState"][#]

Girişi ABD Eyalet adı olarak yorumlayın ve bir Entity.

... @"StateSalesTaxRate"

Satış vergisi oranını alın.

... #2

Bunu ikinci girişle çarpın.

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

Sonucu, ondalık basamağın solunda 9, sağında 2 basamaklı bir sayıya dönüştürün.


6
Mathematica. Tabii ki ...
Ven

8
Bu sadece aptalca oluyor!
Shaggy

142. özelliği elde etmek için neden dize sürece bir API kullanmanız gerekiyor?
Neil

11
Burada yarı ciddi bir bilgiçlik var. Mathematica'nın gerçek kelime verilerini sürekli güncellenen bir veri deposundan aldığı göz önüne alındığında, belirli bir devletin vergi oranı değiştiğinde ne olur? O zaman bu cevap soruda verilen şartnameye göre geçersiz olmaz mı?
ymbirtt

4
@ ymbirtt bu meta tartışmasına göre iyi olmalıdır .
JungHwan Min

5

R , 219121 bayt

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)

Durumu bir kısaltma olarak alır (tümü büyük harf).

state.abb devlet kısaltmaları alfabetik sırada olan yerleşik R verisidir, bu nedenle satış vergilerini kodlar, eyalet dizinini bulur, satış vergisini hesaplar ve 2 ondalık basamağa (dize olarak çıktı) biçimlendirir.

Çevrimiçi deneyin!


5

05AB1E , 134 bayt

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

Çevrimiçi deneyin!


RIP Mathematica kazanır.


Tüm bunlar aşağıdaki dizeleri sıkıştırır:

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

Ve:

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

Daha sonra,% 6 ile çok fazla durum olduğu için varsayılan olarak 6'ya ayarlanan oranın dizinini belirlemek için giriş durumunun dizinini kullanır.


Diğerlerinin tüketmesi için:

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

Ben 2 devletler hiçbir kesişme EG (farklı bir durumunu yaratır böyle devletler emrettiği için bu sadece çalışır Not OHINiçerir [OH,IN,HI]oysa INOHsadece içerir [IN,OH])


Bu konudaki fikirlerin çoğu, daha önceki eyalet temelli girişimden geldi .


TIO bağlantı -dbayrağı var
H.PWiz

@ H.PWiz Bu yığını görselleştirmek içindir. Kaldırırsanız, programın normal çıktısını görürsünüz.
Bay Xcoder

@ H.PWiz sadece görselleştirme amaçlıdır, komutla komut alır ve programın neden çalıştığını görmenizi sağlar.
Sihirli Ahtapot Urn

Ah, yanlışlıkla kaldığını düşündüm.
H.PWiz

3

Pyth, 270 258 233 219 bayt

*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

Aşağıdaki gibi parametrelerden geçirilmelidir:

1025
CA

Açıklama:

*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'a teşekkürler.




Sadece .Zmüsait olduğunu düşündüm . Tekrar teşekkürler ;-).
Ven

3

Java (OpenJDK 8) , 594 ± 19 592 580 575 412 bayt

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

Çevrimiçi deneyin!


1
Doğrudan ele alarak 9 bayt kaydedebilirsiniz Arraysolarak java.util.Arraysve ithalat beyanı kurtulmak alma. Bir TIO bağlantısı eklerdim ama çok uzun. : P
totallyhuman

Sökerek birkaç bayt daha kaydedebilirsiniz final; Değişen doubleiçin float; Değişen Double.parseDoubleiçin new Float; ve değişen (s,a)->hiç s->a->Currying kullanarak. İşte nasıl yapılacağını görmek için TIO bağlantısı.
Kevin Cruijssen

1
Oh, ve aynı zamanda tüm virgül ve en sondaki sıfır ve değişim kaldırabilirsiniz substring(3)için substring(2): TIO 415 bayt . Bu benim Java
cevabımdan

3

Java 8, 486 467 309 299 290 289 bayt

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

Noktalı virgülleri kaldırarak @MagicOctopusUrn sayesinde -19 bayt .

Açıklama:

Burada deneyin.

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
Cevabımdaki sıralamayı kullanırsanız, dizelerinizdeki tüm noktalı virgülleri kaldırabilirsiniz.
Sihirli Ahtapot Urn

HI;NYve MT;NHşu anda kodunuzdaki tüm noktalı virgülleri kaldırmanızı engelleyen tek şey. Her ikisinin de sırasını tersine çevirin ve kaydedilen 20 bayt için işe yarayacaktır.
Sihirli Ahtapot Urn

1
@MagicOctopusUrn Teşekkürler, düzenlendi! Btw, 7yanıtlarınıza durumları da eklemek isteyebilirsiniz ( TNgeçerli sırasını engellemesine rağmen 0).
Kevin Cruijssen

@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00başka bir şeyle çelişmeden mümkündür.
Kevin Cruijssen

2

Perl 6, 341 bayt

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}

Öyleyse, ha. Sanırım bu oldukça sadık. Bu, Perl 6'nın X=>burada olduğu gibi X(çapraz ürün) ile birleştirilen meta operatörlerini kullanır=> .

Bu, <ME NE> X=> 5.5( <ME NE>araçların ('ME', 'NE')) => 5.5dizinin her öğesine uygulandığı anlamına gelir ME => 5.5, NE => 5.5. Parantezler sadece öncelik için buradalar ...


Bir golfçü (erm ...) olarak, bunu el ile yazmadım (gerçek işlev hariç). Bu yüzden en verimli kombinasyonu oluşturmak için bir meta-golfçü yazdım!

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
}

Hem X=>vakaları hem de daha basit davayı (her biri numaralandırılırken) üretir ve en kısa olanı (eski) seçtim.


2

JavaScript (ES6), 227 224 bayt

Kıvrım sözdiziminde girdiyi alır; (s)(v)burada s , v miktarıdır. Zemin yuvarlamayı kullanır.

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

gösteri


1

Kotlin , 444 bayt

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

Çevrimiçi deneyin!

Beautified

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

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)

Çevrimiçi deneyin!

Çok basit: veriler iki karakter + basamak listesi olarak saklanır: her yüzde 10'dan azdır, bu nedenle tamsayı parçası (1 basamak) + ondalık kısım (0 -... basamak) olarak saklanabilir.


1

C # , 318 309 bayt


Veri

  • Giriş String s Durum büyük harfinin 2 harfli kısaltması.
  • Giriş Double v Değer
  • Çıktı String 2 ondalık basamağa yuvarlanacak şekilde toplanacak vergi değeri

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

Okunmamış okunabilir

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

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

Salıverme

  • v1.0 - 318 bytes- İlk çözüm.
  • v1.1 - - 9 bytes- .ToString("F2")Enterpolasyonlu dizgilere ilk dönüşte kullanılanı değiştirdi .

notlar

  • Yok

0

AWK , 277 bayt

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

Çevrimiçi deneyin!

Saygın bir puan, ama Mathematica yakınında hiçbir yerde. Her kontrolden sonra yeni satır baskısı alarak 2 bayt ekledim, ancak bence bu şekilde daha güzel :)

(Umarım girdinin durum kısaltması ve bir satırdaki bir değer olması açıktır.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.