import java.util.stream.Stream ;
import java.util.stream.DoubleStream ;
import java.util.Arrays ;
import java.util.function.Function ;
public class Main {
static final double [ ] percents = { 0.10 , 0.15 , 0.25 , 0.28 , 0.33 , 0.35 } ;
static final double [ ] thresholds = { 8350 , 33950 , 82250 , 171550 , 372950 } ;
public static void main
( String [ ] args
) { double [ ] partialSums = Stream.iterate ( 0 , n -> n + 1 ) .limit ( 5 ) .mapToDouble (
( i) -> thresholds[ i] * ( percents[ i] - percents[ i + 1 ] )
) .toArray ( ) ;
Function
< Double , Double
> computeTax
= ( income
) -> { int level
= ( int ) Arrays .
stream ( thresholds
) .
reduce ( 0 ,
( x, y
) -> x
+ new Boolean ( income
> y
) .
compareTo ( false ) ) ;
return Arrays .
stream ( partialSums
) .
limit ( level
) .
reduce ( 0 ,
( x, y
) -> x
+ y
) + income
* percents
[ level
] ; } ;
double tax, controlValue;
tax = computeTax.apply ( 5000.0 ) ;
controlValue = 5000 * 0.10 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
tax = computeTax.apply ( 10000.0 ) ;
controlValue = 8350 * 0.10 + ( 10000 - 8350 ) * 0.15 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
tax = computeTax.apply ( 50000.0 ) ;
controlValue = 8350 * 0.10 + ( 33950 - 8350 ) * 0.15 +
( 50000 - 33950 ) * 0.25 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
tax = computeTax.apply ( 100000.0 ) ;
controlValue = 8350 * 0.10 + ( 33950 - 8350 ) * 0.15 +
( 82250 - 33950 ) * 0.25 + ( 100000 - 82250 ) * 0.28 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
tax = computeTax.apply ( 200000.0 ) ;
controlValue = 8350 * 0.10 + ( 33950 - 8350 ) * 0.15 +
( 82250 - 33950 ) * 0.25 + ( 171550 - 82250 ) * 0.28 +
( 200000 - 171550 ) * 0.33 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
tax = computeTax.apply ( 500000.0 ) ;
controlValue = 8350 * 0.10 + ( 33950 - 8350 ) * 0.15 +
( 82250 - 33950 ) * 0.25 + ( 171550 - 82250 ) * 0.28 +
( 372950 - 171550 ) * 0.33 + ( 500000 - 372950 ) * 0.35 ;
System .
out .
println ( "Tax is " + ( int ) ( tax
* 100 ) / 100.0 ) ; System .
out .
println ( "Control value is " + ( int ) ( controlValue
* 100 ) / 100.0 ) ;
}
}
aW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Eb3VibGVTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgc3RhdGljIGZpbmFsIGRvdWJsZVtdIHBlcmNlbnRzICAgPSB7MC4xMCwgMC4xNSwgMC4yNSwgMC4yOCwgMC4zMywgMC4zNX07CiAgICBzdGF0aWMgZmluYWwgZG91YmxlW10gdGhyZXNob2xkcyA9IHs4MzUwLCAzMzk1MCwgODIyNTAsIDE3MTU1MCwgMzcyOTUwfTsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgZG91YmxlW10gcGFydGlhbFN1bXMgPSBTdHJlYW0uaXRlcmF0ZSgwLCBuIC0+IG4gKyAxKS5saW1pdCg1KS5tYXBUb0RvdWJsZSgKICAgICAgICAgICAgKGkpIC0+IHRocmVzaG9sZHNbaV0gKiAocGVyY2VudHNbaV0gLSBwZXJjZW50c1tpICsgMV0pCiAgICAgICAgKS50b0FycmF5KCk7CgogICAgICAgIEZ1bmN0aW9uPERvdWJsZSwgRG91YmxlPiBjb21wdXRlVGF4ID0gKGluY29tZSkgLT4gewogICAgICAgICAgICBpbnQgbGV2ZWwgPSAoaW50KUFycmF5cy5zdHJlYW0odGhyZXNob2xkcykucmVkdWNlKDAsICh4LCB5KSAtPiB4ICsgbmV3IEJvb2xlYW4oaW5jb21lID4geSkuY29tcGFyZVRvKGZhbHNlKSk7CgogICAgICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShwYXJ0aWFsU3VtcykubGltaXQobGV2ZWwpLnJlZHVjZSgwLCAoeCwgeSkgLT4geCArIHkpICsgaW5jb21lICogcGVyY2VudHNbbGV2ZWxdOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgZG91YmxlIHRheCwgY29udHJvbFZhbHVlOwoKICAgICAgICB0YXggPSBjb21wdXRlVGF4LmFwcGx5KDUwMDAuMCk7CiAgICAgICAgY29udHJvbFZhbHVlID0gNTAwMCAqIDAuMTA7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUYXggaXMgIiArIChpbnQpKHRheCAqIDEwMCkgLyAxMDAuMCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250cm9sIHZhbHVlIGlzICIgKyAoaW50KShjb250cm9sVmFsdWUgKiAxMDApIC8gMTAwLjApOwoKCiAgICAgICAgdGF4ID0gY29tcHV0ZVRheC5hcHBseSgxMDAwMC4wKTsKICAgICAgICBjb250cm9sVmFsdWUgPSA4MzUwICogMC4xMCArICgxMDAwMCAtIDgzNTApICogMC4xNTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRheCBpcyAiICsgKGludCkodGF4ICogMTAwKSAvIDEwMC4wKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdmFsdWUgaXMgIiArIChpbnQpKGNvbnRyb2xWYWx1ZSAqIDEwMCkgLyAxMDAuMCk7CgoKICAgICAgICB0YXggPSBjb21wdXRlVGF4LmFwcGx5KDUwMDAwLjApOwogICAgICAgIGNvbnRyb2xWYWx1ZSA9IDgzNTAgKiAwLjEwICsgKDMzOTUwIC0gODM1MCkgKiAwLjE1ICsKICAgICAgICAgICAgKDUwMDAwIC0gMzM5NTApICogMC4yNTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRheCBpcyAiICsgKGludCkodGF4ICogMTAwKSAvIDEwMC4wKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdmFsdWUgaXMgIiArIChpbnQpKGNvbnRyb2xWYWx1ZSAqIDEwMCkgLyAxMDAuMCk7CgoKICAgICAgICB0YXggPSBjb21wdXRlVGF4LmFwcGx5KDEwMDAwMC4wKTsKICAgICAgICBjb250cm9sVmFsdWUgPSA4MzUwICogMC4xMCArICgzMzk1MCAtIDgzNTApICogMC4xNSArCiAgICAgICAgICAgICg4MjI1MCAtIDMzOTUwKSAqIDAuMjUgKyAoMTAwMDAwIC0gODIyNTApICogMC4yODsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRheCBpcyAiICsgKGludCkodGF4ICogMTAwKSAvIDEwMC4wKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdmFsdWUgaXMgIiArIChpbnQpKGNvbnRyb2xWYWx1ZSAqIDEwMCkgLyAxMDAuMCk7CgoKICAgICAgICB0YXggPSBjb21wdXRlVGF4LmFwcGx5KDIwMDAwMC4wKTsKICAgICAgICBjb250cm9sVmFsdWUgPSA4MzUwICogMC4xMCArICgzMzk1MCAtIDgzNTApICogMC4xNSArCiAgICAgICAgICAgICg4MjI1MCAtIDMzOTUwKSAqIDAuMjUgKyAoMTcxNTUwIC0gODIyNTApICogMC4yOCArCiAgICAgICAgICAgICgyMDAwMDAgLSAxNzE1NTApICogMC4zMzsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRheCBpcyAiICsgKGludCkodGF4ICogMTAwKSAvIDEwMC4wKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdmFsdWUgaXMgIiArIChpbnQpKGNvbnRyb2xWYWx1ZSAqIDEwMCkgLyAxMDAuMCk7CgoKICAgICAgICB0YXggPSBjb21wdXRlVGF4LmFwcGx5KDUwMDAwMC4wKTsKICAgICAgICBjb250cm9sVmFsdWUgPSA4MzUwICogMC4xMCArICgzMzk1MCAtIDgzNTApICogMC4xNSArCiAgICAgICAgICAgICg4MjI1MCAtIDMzOTUwKSAqIDAuMjUgKyAoMTcxNTUwIC0gODIyNTApICogMC4yOCArCiAgICAgICAgICAgICgzNzI5NTAgLSAxNzE1NTApICogMC4zMyArICg1MDAwMDAgLSAzNzI5NTApICogMC4zNTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRheCBpcyAiICsgKGludCkodGF4ICogMTAwKSAvIDEwMC4wKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRyb2wgdmFsdWUgaXMgIiArIChpbnQpKGNvbnRyb2xWYWx1ZSAqIDEwMCkgLyAxMDAuMCk7CgogICAgfQp9Cg==