Простий державний калькулятор податку з продажу


10

Податки з продажу в США є, найменше, складними. Як правило, існує державний податок з продажу (є кілька держав, які не збирають державний податок з продажу), але також може бути округ податок з продажу, податок з продажу шкільного округу, муніципальний (міський) податок з продажу або податок з продажу мегаполісу. В різних частинах міста навіть податки з продажу можуть бути різними. Однак для цього завдання ми зосередимось лише на податку з продажу.

З огляду на суму долара США, що перевищує нуль (точно до двох знаків після коми) та стан (повне ім’я або двобуквенне абревіатура, ваш вибір, випадок не має значення) та використовуючи нижню діаграму відсотків податку з продажу, вивести відповідний державний податок з продажу, необхідний для стягнення для цього конкретного продажу, точний і обрізаний до двох знаків після коми. Вкажіть, будь ласка, як ваш код обробляє округлення.

Редагувати: Абревіатура для Вашингтона була вказана неправильно як WS замість WA. У відповідях може бути використана будь-яка абревіатура, оскільки це був мій гуф.

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% державного податку з продажу -

CA
1025.00

61.50

Приклад для Міннесоти на рівні 6,875% -

MN
123.45

8.49

14
inb4 Mathematica вбудований.
Джеймс

Minnesota MN 6.875%- тому що .005% це, ну, насправді багато.
Magic Octopus Urn

1
Аааа ... так ... це не податок на прибуток.
Чарівна урва восьминога

2
@Shaggy Ні, справа не має значення.
AdmBorkBork

2
Pedantry: абревіатура штату Вашингтон - WA, а не WS.
Майкл Сейферт

Відповіді:


15

Математика, 112 103 77 76 66 байт

Математика має вбудований для всього

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

Приймає назву штату (будь-якого формату; абревіатуру або повне ім’я) та суму долара.

Спробуйте його на Wolfram Sandbox

Використання

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

 

f["CA", 1025.00]

61,50

f["miNnNesToA", 123.45]

8.49

Пояснення

Interpreter["USState"][#]

Інтерпретуйте введення як ім'я штату США та створіть Entity.

... @"StateSalesTaxRate"

Отримайте ставку податку з продажу.

... #2

Помножте це на другий вхід.

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

Відформатуйте результат у число з 9 цифр ліворуч від десяткової та 2 цифр праворуч.


6
Математика. Звичайно ...
Вен,

8
Це зараз стає нерозумно!
Shaggy

Чому для отримання 142-го властивості вам потрібно використовувати API до тих пір, як рядок?
Ніл

11
Тут є напівсерйозна педантична точка. Зважаючи на те, що Mathematica джерела даних у реальному слові отримує з магазину даних, що постійно оновлюється, що відбувається, коли ставка податку певної держави змінюється? Чи не відповідає ця відповідь недійсною стосовно специфікацій, наведених у питанні?
ymbirtt

4
@ymbirtt має бути добре за цією мета-дискусією .
JungHwan Min

5

R , 219 212 байт

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)

Приймає стан як абревіатуру (усі літери).

state.abb це вбудовані R дані з абревіатурами держави в алфавітному порядку, тому він жорстко кодує податки з продажу, знаходить індекс стану, обчислює податок з продажу та форматує до 2 знаків після коми (виводиться як рядок).

Спробуйте в Інтернеті!


5

05AB1E , 134 байти

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

Спробуйте в Інтернеті!


RIP Mathematica виграє.


Все, що потрібно зробити - це стиснути такі рядки:

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

І:

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

Потім використовує індекс вхідного стану, щоб визначити індекс швидкості, дефолт - 6, тому що існує стільки станів з 6%.


Щоб інші споживали:

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

Зауважте, це працює лише тому, що я наказав таким станам, що жоден перетин двох станів не створює інший стан EG ( OHINмістить [OH,IN,HI]тоді, коли INOHмістить тільки [IN,OH])


Більшість ідей для цього виходили з мого попереднього вступу на базі держави .


TIO посилання має -dпрапор
H.PWiz

@ H.PWiz Це для візуалізації стека. Якщо ви видалите його, ви побачите регулярний вихід програми.
Містер Xcoder

@ H.PWiz призначений лише для візуалізації, приймає це по команді і дає змогу побачити, чому працює програма.
Чарівна восьминога урна

Ах, я думав, що це було залишено помилково.
H.PWiz

3

Pyth, 270 258 233 219 байт

*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

Потрібно передавати такі параметри:

1025
CA

Пояснення:

*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



1
195 символів, 219 байт: *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. Він використовує упаковані рядки (ті, з яких починається .")
Містер Xcoder

Я думав, що є тільки .Zдоступний. Ще раз дякую вам ;-).
Високоповажний

3

Java (OpenJDK 8) , 594 + 19 592 580 575 412 байт

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

Спробуйте в Інтернеті!


1
Ви можете зберегти 9 байт, безпосередньо звертаючись , Arraysяк java.util.Arraysі позбавлення від оператора імпорту. Я б включив посилання TIO, але воно занадто довго. : P
повністюлюдський

Ви можете зберегти ще кілька байтів, видаливши final; перехід doubleна float; перехід Double.parseDoubleна new Float; і переходити (s,a)->до s->a->використання за допомогою каррі. Ось TIO-посилання, щоб побачити як.
Кевін Круїйсен

1
О, і ви також можете видалити всі коми і кінцеві нулі та змінити substring(3)на substring(2): TIO 415 байт . Це коротше моєї відповіді на Java ..;)
Кевін Круїйсен

3

Java 8, 486 467 309 299 290 289 байт

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 байт завдяки @MagicOctopusUrn , видаливши крапки з комою.

Пояснення:

Спробуйте тут.

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
Якщо ви використовуєте замовлення з моєї відповіді, ви можете видалити всі крапки з комою з ваших рядків.
Чарівна урва восьминога

HI;NYі MT;NHнаразі єдині речі у вашому коді не дозволяють вам видаляти всі напівколонки. Зворотний порядок обох, і він буде працювати приблизно як 20 байтів, збережених.
Magic Octopus Urn

1
@MagicOctopusUrn Дякую, відредаговано! До речі, ви можете також додати стани 7до своєї відповіді (хоча TNце заважає поточному порядку 0).
Kevin Cruijssen

@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00можливо без конфлікту з чим-небудь іншим.
Kevin Cruijssen

2

Perl 6, 341 байт

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}

Отже, так. Думаю, це досить надумано. Тут використовуються метаоператори Perl 6, як X=>тут, з якими Xпоєднується (крос-продукт) =>.

Це означає <ME NE> X=> 5.5(де <ME NE>кошти ('ME', 'NE')) => 5.5застосовується до кожного елемента масиву, поступаючись ME => 5.5, NE => 5.5. Дужки просто тут для переваги ...


Як гольфіст (гм ...) я, очевидно, не писав цього вручну (за винятком фактичної функції). Тому я написав мета-гольфіст, щоб створити найбільш ефективну комбінацію!

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
}

Він генерує і X=>випадки, і простіший випадок (кожен з них перераховується), і я вибрав найкоротший (колишній).


2

JavaScript (ES6), 227 224 байт

Вводиться в синтаксис currying, (s)(v)де s - стан, а v - кількість. Використовує закруглення підлоги.

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

Демо


1

Котлін , 444 байт

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

Спробуйте в Інтернеті!

Прикрасили

// 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 байти

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)

Спробуйте в Інтернеті!

Дуже просто: дані зберігаються у вигляді двох символів + список цифр: кожен відсоток менше 10, таким чином вони можуть зберігатися як ціла частина (1 цифра) + десяткова частина (0 -... цифра (и)).


1

C # , 318 309 байт


Дані

  • Введення String s Абревіатура двох літер верхнього регістру стану.
  • Введення Double v Значення
  • Висновок String Податкова вартість, яку потрібно зібрати, округляється до двох знаків після коми

Гольф

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

Безумовно

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

Незрозумілий читабельний

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

Повний код

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

Релізи

  • v1.0 - 318 bytes- Початкове рішення.
  • v1.1 - - 9 bytes- Змінено .ToString("F2")використане в першому поверненні до інтерпольованих рядків.

Примітки

  • Жоден

0

AWK , 277 байт

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

Спробуйте в Інтернеті!

Поважна оцінка, але ніде поблизу Mathematica. Я додав 2 байти, друкуючи новий рядок після кожної перевірки, але я думаю, що так красивіше :)

(Сподіваємось, очевидно, що введенням повинно бути абревіатура стану та значення в одному рядку.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.