import java.io.*;
import java.math.BigDecimal;
import java.util.Scanner;
interface IBond
{
public void setCouponRate
( BigDecimal couponRate
);
}
abstract class Bond implements IBond
{
{
this.price = price;
this.period = period;
this.couponRate = couponRate;
this.cpiRate = cpiRate;
}
public void setPrice
( BigDecimal price
) { this.
price = price
; }
public void setPeriod
( BigDecimal period
) { this.
period = period
; }
public BigDecimal getCouponRate
() { return couponRate
; } public void setCouponRate
( BigDecimal couponRate
) { this.
couponRate = couponRate
; }
public BigDecimal getCpiRate
() { return cpiRate
; } public void setCpiRate
( BigDecimal cpiRate
) { this.
cpiRate = cpiRate
; }
}
class ZeroCouponBond extends Bond
{
{
super( price, period, couponRate, cpiRate );
}
}
class RegularBond extends Bond
{
{
super( price, period, couponRate, cpiRate );
}
}
class RealReturnBond extends Bond
{
{
super( price, period, couponRate, cpiRate );
}
}
abstract class Calculator
{
{
}
protected static BigDecimal CalculateZeroCouponYield
( IBond bond
) {
return bond.getPrice().divide( bond.getPeriod().multiply( bond.getPrice() ) );
}
protected static BigDecimal CalculateRegularCouponYield
( IBond bond
) {
return CalculateZeroCouponYield( bond ).add( bond.getCouponRate() );
}
protected static BigDecimal CalculateRealReturnBondYield
( IBond bond
) {
return CalculateRegularCouponYield( bond ).add( bond.getCpiRate() );
}
}
class ZeroCouponYieldCalculator extends Calculator
{
{
return CalculateZeroCouponYield( bond );
}
}
class RegularYieldCalculator extends Calculator
{
{
return CalculateRegularCouponYield( bond );
}
}
class RealReturnYieldCalculator extends Calculator
{
{
return CalculateRealReturnBondYield( bond );
}
}
class Solution {
Scanner scanner
= new Scanner
(System.
in);
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
IBond zeroCouponBond = new ZeroCouponBond( price, period, couponRate, cpiRate );
IBond regularBond = new RegularBond( price, period, couponRate, cpiRate );
IBond realReturnBond = new RealReturnBond( price, period, couponRate, cpiRate );
System.
out.
println( "price: " + price
+ " period: " + period
+ " couponrate: " + couponRate
+ " cpirate: " + cpiRate
); System.
out.
println( ZeroCouponYieldCalculator.
Calculate( zeroCouponBond
) + " " + RegularYieldCalculator.
Calculate( regularBond
) + " " + RealReturnYieldCalculator.
Calculate( realReturnBond
) ); }
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwppbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CgppbnRlcmZhY2UgSUJvbmQKewogICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0UHJpY2UoKTsKICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKCBCaWdEZWNpbWFsIHByaWNlICk7CiAgICAKICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldFBlcmlvZCgpOwogICAgcHVibGljIHZvaWQgc2V0UGVyaW9kKCBCaWdEZWNpbWFsIHBlcmlvZCApOwogICAgCiAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3Vwb25SYXRlKCk7CiAgICBwdWJsaWMgdm9pZCBzZXRDb3Vwb25SYXRlKCBCaWdEZWNpbWFsIGNvdXBvblJhdGUgKTsKICAgIAogICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q3BpUmF0ZSgpOwogICAgcHVibGljIHZvaWQgc2V0Q3BpUmF0ZSggQmlnRGVjaW1hbCBjcGlSYXRlICk7Cn0KCmFic3RyYWN0IGNsYXNzIEJvbmQgaW1wbGVtZW50cyBJQm9uZAp7CiAgICBwdWJsaWMgQm9uZCggQmlnRGVjaW1hbCBwcmljZSwgQmlnRGVjaW1hbCBwZXJpb2QsIEJpZ0RlY2ltYWwgY291cG9uUmF0ZSwgQmlnRGVjaW1hbCBjcGlSYXRlICkKICAgIHsKICAgICAgICB0aGlzLnByaWNlID0gcHJpY2U7CiAgICAgICAgdGhpcy5wZXJpb2QgPSBwZXJpb2Q7CiAgICAgICAgdGhpcy5jb3Vwb25SYXRlID0gY291cG9uUmF0ZTsKICAgICAgICB0aGlzLmNwaVJhdGUgPSBjcGlSYXRlOwogICAgfQogICAgCiAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbCBwcmljZTsKICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldFByaWNlKCkgeyByZXR1cm4gcHJpY2U7IH0KICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKCBCaWdEZWNpbWFsIHByaWNlICkgeyB0aGlzLnByaWNlID0gcHJpY2U7IH0KICAgIAogICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcGVyaW9kOwogICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0UGVyaW9kKCkgeyByZXR1cm4gcGVyaW9kOyB9CiAgICBwdWJsaWMgdm9pZCBzZXRQZXJpb2QoIEJpZ0RlY2ltYWwgcGVyaW9kICkgeyB0aGlzLnBlcmlvZCA9IHBlcmlvZDsgfQogICAgCiAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3Vwb25SYXRlOwogICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q291cG9uUmF0ZSgpIHsgcmV0dXJuIGNvdXBvblJhdGU7IH0KICAgIHB1YmxpYyB2b2lkIHNldENvdXBvblJhdGUoIEJpZ0RlY2ltYWwgY291cG9uUmF0ZSApIHsgdGhpcy5jb3Vwb25SYXRlID0gY291cG9uUmF0ZTsgfQogICAgCiAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjcGlSYXRlOwogICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q3BpUmF0ZSgpIHsgcmV0dXJuIGNwaVJhdGU7IH0KICAgIHB1YmxpYyB2b2lkIHNldENwaVJhdGUoIEJpZ0RlY2ltYWwgY3BpUmF0ZSApIHsgdGhpcy5jcGlSYXRlID0gY3BpUmF0ZTsgfQogICAgCn0KCmNsYXNzIFplcm9Db3Vwb25Cb25kIGV4dGVuZHMgQm9uZAp7CiAgICBwdWJsaWMgWmVyb0NvdXBvbkJvbmQoIEJpZ0RlY2ltYWwgcHJpY2UsIEJpZ0RlY2ltYWwgcGVyaW9kLCBCaWdEZWNpbWFsIGNvdXBvblJhdGUsIEJpZ0RlY2ltYWwgY3BpUmF0ZSApCiAgICB7CiAgICAgICAgc3VwZXIoIHByaWNlLCBwZXJpb2QsIGNvdXBvblJhdGUsIGNwaVJhdGUgKTsKICAgIH0KfQoKY2xhc3MgUmVndWxhckJvbmQgZXh0ZW5kcyBCb25kCnsKICAgIHB1YmxpYyBSZWd1bGFyQm9uZCggIEJpZ0RlY2ltYWwgcHJpY2UsIEJpZ0RlY2ltYWwgcGVyaW9kLCBCaWdEZWNpbWFsIGNvdXBvblJhdGUsIEJpZ0RlY2ltYWwgY3BpUmF0ZSApCiAgICB7CiAgICAgICAgc3VwZXIoIHByaWNlLCBwZXJpb2QsIGNvdXBvblJhdGUsIGNwaVJhdGUgKTsKICAgIH0KfQoKY2xhc3MgUmVhbFJldHVybkJvbmQgZXh0ZW5kcyBCb25kCnsKICAgIHB1YmxpYyBSZWFsUmV0dXJuQm9uZCggQmlnRGVjaW1hbCBwcmljZSwgQmlnRGVjaW1hbCBwZXJpb2QsIEJpZ0RlY2ltYWwgY291cG9uUmF0ZSwgQmlnRGVjaW1hbCBjcGlSYXRlICkKICAgIHsKICAgICAgICBzdXBlciggcHJpY2UsIHBlcmlvZCwgY291cG9uUmF0ZSwgY3BpUmF0ZSApOwogICAgfQp9CgphYnN0cmFjdCBjbGFzcyBDYWxjdWxhdG9yCnsKICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBDYWxjdWxhdGUoIElCb25kIGJvbmQgKQogICAgewogICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCgwKTsKICAgIH0KICAgIAogICAgcHJvdGVjdGVkIHN0YXRpYyBCaWdEZWNpbWFsIENhbGN1bGF0ZVplcm9Db3Vwb25ZaWVsZCggSUJvbmQgYm9uZCApCiAgICB7CiAgICAgICAgcmV0dXJuIGJvbmQuZ2V0UHJpY2UoKS5kaXZpZGUoIGJvbmQuZ2V0UGVyaW9kKCkubXVsdGlwbHkoIGJvbmQuZ2V0UHJpY2UoKSApICk7CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBzdGF0aWMgQmlnRGVjaW1hbCBDYWxjdWxhdGVSZWd1bGFyQ291cG9uWWllbGQoIElCb25kIGJvbmQgKQogICAgewogICAgICAgIHJldHVybiBDYWxjdWxhdGVaZXJvQ291cG9uWWllbGQoIGJvbmQgKS5hZGQoIGJvbmQuZ2V0Q291cG9uUmF0ZSgpICk7CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBzdGF0aWMgQmlnRGVjaW1hbCBDYWxjdWxhdGVSZWFsUmV0dXJuQm9uZFlpZWxkKCBJQm9uZCBib25kICkKICAgIHsKICAgICAgICByZXR1cm4gQ2FsY3VsYXRlUmVndWxhckNvdXBvbllpZWxkKCBib25kICkuYWRkKCBib25kLmdldENwaVJhdGUoKSApOwogICAgfSAgICAKfQoKY2xhc3MgWmVyb0NvdXBvbllpZWxkQ2FsY3VsYXRvciBleHRlbmRzIENhbGN1bGF0b3IKewogICAgcHVibGljIHN0YXRpYyBCaWdEZWNpbWFsIENhbGN1bGF0ZSggSUJvbmQgYm9uZCApCiAgICB7CiAgICAgICAgcmV0dXJuIENhbGN1bGF0ZVplcm9Db3Vwb25ZaWVsZCggYm9uZCApOwogICAgfQp9CgpjbGFzcyBSZWd1bGFyWWllbGRDYWxjdWxhdG9yIGV4dGVuZHMgQ2FsY3VsYXRvcgp7CiAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgQ2FsY3VsYXRlKCBJQm9uZCBib25kICkKICAgIHsKICAgICAgICByZXR1cm4gQ2FsY3VsYXRlUmVndWxhckNvdXBvbllpZWxkKCBib25kICk7CiAgICB9Cn0KCmNsYXNzIFJlYWxSZXR1cm5ZaWVsZENhbGN1bGF0b3IgZXh0ZW5kcyBDYWxjdWxhdG9yCnsKICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBDYWxjdWxhdGUoIElCb25kIGJvbmQgKQogICAgewogICAgICAgIHJldHVybiBDYWxjdWxhdGVSZWFsUmV0dXJuQm9uZFlpZWxkKCBib25kICk7CiAgICB9Cn0KCmNsYXNzIFNvbHV0aW9uIHsgICAKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10gKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoKICAgICAgICBCaWdEZWNpbWFsIHByaWNlID0gc2Nhbm5lci5uZXh0QmlnRGVjaW1hbCgpOwogICAgICAgIEJpZ0RlY2ltYWwgcGVyaW9kID0gc2Nhbm5lci5uZXh0QmlnRGVjaW1hbCgpOwogICAgICAgIEJpZ0RlY2ltYWwgY291cG9uUmF0ZSA9IHNjYW5uZXIubmV4dEJpZ0RlY2ltYWwoKTsKICAgICAgICBCaWdEZWNpbWFsIGNwaVJhdGUgPSBzY2FubmVyLm5leHRCaWdEZWNpbWFsKCk7CiAgICAgIAogICAgICAgIC8qIEVudGVyIHlvdXIgY29kZSBoZXJlLiBSZWFkIGlucHV0IGZyb20gU1RESU4uIFByaW50IG91dHB1dCB0byBTVERPVVQgKi8KICAgICAgICBJQm9uZCB6ZXJvQ291cG9uQm9uZCA9IG5ldyBaZXJvQ291cG9uQm9uZCggcHJpY2UsIHBlcmlvZCwgY291cG9uUmF0ZSwgY3BpUmF0ZSApOwogICAgICAgIElCb25kIHJlZ3VsYXJCb25kID0gbmV3IFJlZ3VsYXJCb25kKCBwcmljZSwgcGVyaW9kLCBjb3Vwb25SYXRlLCBjcGlSYXRlICk7CiAgICAgICAgSUJvbmQgcmVhbFJldHVybkJvbmQgPSBuZXcgUmVhbFJldHVybkJvbmQoIHByaWNlLCBwZXJpb2QsIGNvdXBvblJhdGUsIGNwaVJhdGUgKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJwcmljZTogIiArIHByaWNlICsgIiBwZXJpb2Q6ICIgKyBwZXJpb2QgKyAiIGNvdXBvbnJhdGU6ICIgKyBjb3Vwb25SYXRlICsgIiBjcGlyYXRlOiAiICsgY3BpUmF0ZSApOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggWmVyb0NvdXBvbllpZWxkQ2FsY3VsYXRvci5DYWxjdWxhdGUoIHplcm9Db3Vwb25Cb25kICkgKyAiICIgKyBSZWd1bGFyWWllbGRDYWxjdWxhdG9yLkNhbGN1bGF0ZSggcmVndWxhckJvbmQgKSArICIgIiArIFJlYWxSZXR1cm5ZaWVsZENhbGN1bGF0b3IuQ2FsY3VsYXRlKCByZWFsUmV0dXJuQm9uZCApICk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEJpZ0RlY2ltYWwudmFsdWVPZigxMC4xMjM0KS5zZXRTY2FsZSgyLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApKTsKICAgICAgICB9Cn0=