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

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
AdmBorkBork
источник
14
inb4 Mathematica встроенный.
Джеймс
Minnesota MN 6.875%- потому что 0,005%, ну, на самом деле много.
Волшебная урна осьминога
1
Аааа ... верно ... это не подоходный налог.
Волшебная урна осьминога
2
@ Шэгги Нет, дело не имеет значения.
AdmBorkBork
2
Педантизм: аббревиатура штата для Вашингтона - WA, а не WS.
Майкл

Ответы:

15

Mathematica, 112 103 77 76 66 байт

Mathematica имеет встроенный для всего

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
Mathematica. Конечно ...
Ven
8
Это просто глупо сейчас!
Лохматый
Зачем вам нужно использовать API, пока строка для получения 142-го свойства?
Нил
11
Здесь есть полусерьезный педантичный момент. Учитывая, что Mathematica получает данные в режиме реального времени из постоянно обновляемого хранилища данных, что происходит, когда изменяется налоговая ставка для конкретного штата? Разве этот ответ не станет недействительным по отношению к спецификации, указанной в вопросе?
ymbirtt
4
@ymbirtt должно быть хорошо для этой мета-дискуссии .
JungHwan Мин
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 десятичных знаков (вывод в виде строки).

Попробуйте онлайн!

Giuseppe
источник
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])


Большинство идей для этого пришло из моей предыдущей записи, основанной на штате .

Урна волшебного осьминога
источник
У ссылки -d
TIO
@ 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.

Вен
источник
233 байта
г-н 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. Он использует упакованные строки (те, которые начинаются с .")
Mr. Xcoder
Я думал, что только .Zбыло доступно. Еще раз спасибо ;-).
Ven
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 сохраненных байтов.
Волшебная Урна Осьминога
1
@MagicOctopusUrn Спасибо, отредактировано! Кстати, вы можете захотеть добавить состояния для 7вашего ответа (хотя TNэто влияет на текущий порядок 0).
Кевин Круйссен
@MagicOctopusUrn INMSRITN 7.00& AKDENHORMT 0.00возможно, не конфликтуя ни с чем другим.
Кевин Круйссен
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 байта

Принимает ввод в синтаксисе карри, (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

демонстрация

Arnauld
источник
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)
}
jrtapsell
источник
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 -... цифра (и)).

jferard
источник
1

C # , 318 309 байт


Данные

  • Входные данные String s Двухбуквенное сокращение верхнего регистра.
  • Входное Double v значение
  • Выходные данные String Налоговая стоимость, которую нужно собрать, округляется до 2 десятичных знаков.

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

Ungolfed читаемый

// 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")используемые при первом возврате к интерполированным строкам.

Ноты

  • Никто
auhmaan
источник
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 байта, печатая новую строку после каждой проверки, но я думаю, что так получше :)

(Надеюсь, очевидно, что входными данными должны быть аббревиатура состояния и значение в одной строке.)

Роберт Бенсон
источник