From 7d12838a036b4c4bf3bb9feab73a7d404796eeb7 Mon Sep 17 00:00:00 2001 From: "k.yusuke" Date: Wed, 26 May 2021 16:22:23 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E9=9B=BB=E6=B0=97=E6=96=99=E9=87=91?= =?UTF-8?q?=E3=82=B7=E3=83=A5=E3=83=9F=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=A9=9F=E8=83=BD=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- challengeA/katayama/main.rb | 44 +++++++ challengeA/katayama/plan.rb | 35 +++++ challengeA/katayama/plan_data.json | 203 +++++++++++++++++++++++++++++ challengeA/katayama/simulator.rb | 29 +++++ 4 files changed, 311 insertions(+) create mode 100644 challengeA/katayama/main.rb create mode 100644 challengeA/katayama/plan.rb create mode 100644 challengeA/katayama/plan_data.json create mode 100644 challengeA/katayama/simulator.rb diff --git a/challengeA/katayama/main.rb b/challengeA/katayama/main.rb new file mode 100644 index 000000000..05a7787a7 --- /dev/null +++ b/challengeA/katayama/main.rb @@ -0,0 +1,44 @@ +require 'json' +require './simulator' +require './plan' + + # 契約アンペアを入力 + puts <<~TEXT + 契約しているアンペア数を入力して下さい。 + (例:30Aの場合は"30"と入力してください) + TEXT + + while true + print "アンペア数を入力 > " + amp = gets.to_i + break if [10, 15, 20, 30, 40, 50, 60].include?(amp) + puts "10,15,20,30,40,50,60のいずれかを入力して下さい" + end + + # 電気使用量を入力 + puts <<~TEXT + 次に1ヶ月の電気使用量(kWh)を入力してください。 + (例:300kWhの場合は"300"と入力してください) + TEXT + + while true + print "電気使用量を入力 > " + kwh = gets.to_i + break if kwh > 0 + puts "電気使用量は0以上の数値で入力してください" + end + + # プランごとの設定値をJSONファイルから取得 + plan_objs = [] + File.open("plan_data.json") do |file| + json_data = JSON.load(file, create_additions: true) + + # プランごとにインスタンスを生成する + json_data["plan"].map do |plan_obj| + plan_objs << Plan.new(plan_obj) + end + end + + # 見積もりシュミレーションを実行する + simulator = Simulator.new(amp,kwh) + simulator.simulate(plan_objs) \ No newline at end of file diff --git a/challengeA/katayama/plan.rb b/challengeA/katayama/plan.rb new file mode 100644 index 000000000..bb3e05044 --- /dev/null +++ b/challengeA/katayama/plan.rb @@ -0,0 +1,35 @@ +class Plan + attr_accessor :name, :provider_name, :support_amp, :base, :as_pay + + # 契約アンペア数1Aあたりの基本料金単価 + BASIC_CHARGE_UNIT_PRICE = 28.6 + + #入力されたkWhが上限なしの場合 + AS_PAY_CHARGE_RANGE_MAX = 9999 + + def initialize(args) + @name = args["name"] + @provider_name = args["provider_name"] + @support_amp = args["support_amp"] + @base= args["base"] + @as_pay = args["as_pay"] + end + + # 基本料金の算出を実行する + def calc_base_charge(input_amp) + + # 入力された契約アンペア数に対応する基本料金を算出する + target_amp = self.base.find {|b| b["amp"] == input_amp} + return target_amp["charge"] + end + + # 従量料金の算出を実行する + def calc_as_pay_charge(input_amount) + + # 入力された電気使用量に対応する従量料金の単価を算出する + target_range = self.as_pay.find {|a| (a["to"] == AS_PAY_CHARGE_RANGE_MAX ) ? true : (a["from"] <= input_amount && input_amount <= a["to"])} + + # 従量料金 = 従量料金の単価 × 電気使用量(kWh) + return target_range["per_charge"]*input_amount + end +end \ No newline at end of file diff --git a/challengeA/katayama/plan_data.json b/challengeA/katayama/plan_data.json new file mode 100644 index 000000000..39175d978 --- /dev/null +++ b/challengeA/katayama/plan_data.json @@ -0,0 +1,203 @@ +{ + "plan": [ + { + "name": "従量電灯B", + "provider_name": "東京電力エナジーパートナー", + "base": [ + { + "amp": 10, + "charge": 286.0 + }, + { + "amp": 15, + "charge": 429.0 + }, + { + "amp": 20, + "charge": 572.0 + }, + { + "amp": 30, + "charge": 858.0 + }, + { + "amp": 40, + "charge": 1144.0 + }, + { + "amp": 50, + "charge": 1430.0 + }, + { + "amp": 60, + "charge": 1716.0 + } + ], + "as_pay": [ + { + "from": 0, + "to": 120, + "per_charge": 19.88 + }, + { + "from": 120, + "to": 300, + "per_charge": 26.48 + }, + { + "from": 300, + "to": 9999, + "per_charge": 30.57 + } + ] + }, + { + "name": "おうちプラン", + "provider_name": "Loopでんき", + "base": [ + { + "amp": 10, + "charge": 0 + }, + { + "amp": 15, + "charge": 0 + }, + { + "amp": 20, + "charge": 0 + }, + { + "amp": 30, + "charge": 0 + }, + { + "amp": 40, + "charge": 0 + }, + { + "amp": 50, + "charge": 0 + }, + { + "amp": 60, + "charge": 0 + } + ], + "as_pay": [ + { + "from": 0, + "to": 9999, + "per_charge": 26.40 + } + ] + }, + { + "name": "ずっとも電気1", + "provider_name": "東京ガス", + "base": [ + { + "amp": 10, + "charge": 286.0 + }, + { + "amp": 15, + "charge": 429.0 + }, + { + "amp": 20, + "charge": 572.0 + }, + { + "amp": 30, + "charge": 858.0 + }, + { + "amp": 40, + "charge": 1144.0 + }, + { + "amp": 50, + "charge": 1430.0 + }, + { + "amp": 60, + "charge": 1716.0 + } + ], + "as_pay": [ + { + "from": 0, + "to": 140, + "per_charge": 23.67 + }, + { + "from": 140, + "to": 350, + "per_charge": 23.88 + }, + { + "from": 350, + "to": 9999, + "per_charge": 26.41 + } + ] + }, + { + "name": "従量電灯Bたっぷりプラン", + "provider_name": "JXTGでんき", + "base": [ + { + "amp": 10, + "charge": 286.0 + }, + { + "amp": 15, + "charge": 429.0 + }, + { + "amp": 20, + "charge": 572.0 + }, + { + "amp": 30, + "charge": 858.0 + }, + { + "amp": 40, + "charge": 1144.0 + }, + { + "amp": 50, + "charge": 1430.0 + }, + { + "amp": 60, + "charge": 1716.0 + } + ], + "as_pay": [ + { + "from": 0, + "to": 120, + "per_charge": 19.88 + }, + { + "from": 120, + "to": 300, + "per_charge": 26.48 + }, + { + "from": 300, + "to": 600, + "per_charge": 25.08 + }, + { + "from": 600, + "to": 9999, + "per_charge": 26.15 + } + ] + } + ] +} \ No newline at end of file diff --git a/challengeA/katayama/simulator.rb b/challengeA/katayama/simulator.rb new file mode 100644 index 000000000..ba255ea7a --- /dev/null +++ b/challengeA/katayama/simulator.rb @@ -0,0 +1,29 @@ +class Simulator + attr_accessor :amp, :kwh + + def initialize(amp, kwh) + @amp = amp + @kwh = kwh + end + + # プランごとの見積もりシュミレーションを実行し、結果を表示する + def simulate(plans) + + result = [] + plans.map do |plan| + + base_charge = plan.calc_base_charge(self.amp) + as_pay_charge = plan.calc_as_pay_charge(self.kwh) + + # 電気料金 = 基本料金 + 従量料金 + total_charge = base_charge + as_pay_charge + + result << { + provider_name: plan.provider_name, + plan_name: plan.name, + price: total_charge.ceil + } + end + puts result + end +end \ No newline at end of file From 720ec05f680f2d10313d7f126e92e2b5db7213f8 Mon Sep 17 00:00:00 2001 From: "k.yusuke" Date: Wed, 2 Jun 2021 20:32:20 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E5=8F=8A=E3=81=B3=E3=80=81?= =?UTF-8?q?=E4=BB=A5=E4=B8=8B=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=82=92=E8=A1=8C?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=80=82=20=E3=83=BB=E9=9B=BB=E6=B0=97?= =?UTF-8?q?=E3=82=92=E5=85=A8=E3=81=8F=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=A0=B4=E5=90=88=E9=9B=BB=E6=B0=97=E6=96=99=E9=87=91?= =?UTF-8?q?=E3=82=92=E5=8D=8A=E9=A1=8D=E3=81=AB=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E4=BF=AE=E6=AD=A3=20=E3=83=BB=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E5=A4=96=E3=81=AE=E3=82=A2=E3=83=B3=E3=83=9A=E3=82=A2=E3=81=8C?= =?UTF-8?q?=E5=85=A5=E5=8A=9B=E3=81=95=E3=82=8C=E3=81=9F=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AE=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=20=E3=83=BB=E5=BE=93=E9=87=8F=E6=96=99=E9=87=91?= =?UTF-8?q?=E3=81=AE=E8=A8=88=E7=AE=97=E6=96=B9=E6=B3=95=E3=82=92=E8=A6=8B?= =?UTF-8?q?=E7=9B=B4=E3=81=97(=E5=BE=93=E9=87=8F=E6=96=99=E9=87=91?= =?UTF-8?q?=E5=8D=98=E4=BE=A1=E3=82=92=E3=81=9D=E3=82=8C=E3=81=9E=E3=82=8C?= =?UTF-8?q?=E3=81=AE=E5=8D=98=E4=BE=A1=E3=81=AB=E3=81=8A=E3=81=84=E3=81=A6?= =?UTF-8?q?=E5=80=8B=E5=88=A5=E3=81=A7=E8=A8=88=E7=AE=97=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=82=82=E3=81=AE=E3=82=92=E5=90=88=E7=AE=97=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3)=20=E3=83=BB?= =?UTF-8?q?=E6=9C=88=E9=A1=8D=E4=BD=BF=E7=94=A8=E6=96=99=E3=81=8C=E6=9C=80?= =?UTF-8?q?=E4=BD=8E=E6=96=99=E9=87=91=E3=82=92=E5=89=B2=E3=82=8B=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AE=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- challengeA/katayama/main.rb | 12 +++--- challengeA/katayama/plan.rb | 64 ++++++++++++++++++++++++------ challengeA/katayama/plan_data.json | 5 +++ challengeA/katayama/simulator.rb | 20 ++++++++-- 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/challengeA/katayama/main.rb b/challengeA/katayama/main.rb index 05a7787a7..d11423bc8 100644 --- a/challengeA/katayama/main.rb +++ b/challengeA/katayama/main.rb @@ -21,12 +21,10 @@ (例:300kWhの場合は"300"と入力してください) TEXT - while true - print "電気使用量を入力 > " - kwh = gets.to_i - break if kwh > 0 - puts "電気使用量は0以上の数値で入力してください" - end + + print "電気使用量を入力 > " + kwh = gets.to_i + # プランごとの設定値をJSONファイルから取得 plan_objs = [] @@ -34,7 +32,7 @@ json_data = JSON.load(file, create_additions: true) # プランごとにインスタンスを生成する - json_data["plan"].map do |plan_obj| + json_data["plan"].map do |plan_obj| plan_objs << Plan.new(plan_obj) end end diff --git a/challengeA/katayama/plan.rb b/challengeA/katayama/plan.rb index bb3e05044..8636ff292 100644 --- a/challengeA/katayama/plan.rb +++ b/challengeA/katayama/plan.rb @@ -1,35 +1,73 @@ class Plan - attr_accessor :name, :provider_name, :support_amp, :base, :as_pay + attr_accessor :name, :provider_name, :supported_amp, :base, :as_pay, :is_supported, :min_charge - # 契約アンペア数1Aあたりの基本料金単価 - BASIC_CHARGE_UNIT_PRICE = 28.6 + # 電気料金の計算ロジックにおいて今回適用外としているもの + # ・燃料費調整額及び再生可能エネルギー賦課金 + # ・「東京ガス ずっとも電気1」の「ガス・電気セット割(定額A)」- [基本料金から275円(税込み)割引] - #入力されたkWhが上限なしの場合 + # 従量料金表において電気使用量の上限が存在しない場合の値 AS_PAY_CHARGE_RANGE_MAX = 9999 def initialize(args) + # プラン名 @name = args["name"] + # 会社名 @provider_name = args["provider_name"] - @support_amp = args["support_amp"] - @base= args["base"] + # 対応アンペア一覧 + @supported_amp = args["supported_amp"] + # 基本料金 + @base = args["base"] + # 従量料金 @as_pay = args["as_pay"] + # アンペア対応可否 + @is_supported = true + # 月額料金最低額 + @min_charge = args["min_charge"] end # 基本料金の算出を実行する def calc_base_charge(input_amp) - # 入力された契約アンペア数に対応する基本料金を算出する - target_amp = self.base.find {|b| b["amp"] == input_amp} - return target_amp["charge"] + # 入力されたアンペアがプラン対象かどうか判定 + if self.supported_amp.include?(input_amp) + + # 入力されたアンペアが対応可の場合、入力された契約アンペア数に対応する基本料金を算出する + target_amp = self.base.find {|b| b["amp"] == input_amp} + return target_amp["charge"] + else + + # 入力されたアンペアが対応外の場合 + self.is_supported = false + return 0 + end end # 従量料金の算出を実行する + # 従量料金 = 従量料金の単価 × 電気使用量(kWh) def calc_as_pay_charge(input_amount) + range_array = self.as_pay + as_pay_sum = 0 + + # 電気使用量に対応した従量料金の料金帯を取得 + max_range = range_array.find {|a| is_range?(input_amount, a)} + index = range_array.index(max_range) + range_array.each_with_index do |range, idx| + + # 電気使用量が従量料金の料金帯における端数の場合 + if idx == index && is_range?(input_amount, range) + as_pay_sum += max_range["per_charge"]* (input_amount - max_range["from"]) + break + end + as_pay_sum += range["per_charge"]*(range["to"] - range["from"]) + end + return as_pay_sum + end - # 入力された電気使用量に対応する従量料金の単価を算出する - target_range = self.as_pay.find {|a| (a["to"] == AS_PAY_CHARGE_RANGE_MAX ) ? true : (a["from"] <= input_amount && input_amount <= a["to"])} + private - # 従量料金 = 従量料金の単価 × 電気使用量(kWh) - return target_range["per_charge"]*input_amount + # 従量料金の料金帯に含まれるか否か + def is_range?(value, oppo) + return oppo["from"] <= value && value <= oppo["to"] end + end \ No newline at end of file diff --git a/challengeA/katayama/plan_data.json b/challengeA/katayama/plan_data.json index 39175d978..d480fcf58 100644 --- a/challengeA/katayama/plan_data.json +++ b/challengeA/katayama/plan_data.json @@ -3,6 +3,8 @@ { "name": "従量電灯B", "provider_name": "東京電力エナジーパートナー", + "supported_amp": [10, 15, 20, 30, 40, 50, 60], + "min_charge": 235.84, "base": [ { "amp": 10, @@ -53,6 +55,7 @@ }, { "name": "おうちプラン", + "supported_amp": [10, 15, 20, 30, 40, 50, 60], "provider_name": "Loopでんき", "base": [ { @@ -94,6 +97,7 @@ }, { "name": "ずっとも電気1", + "supported_amp": [30, 40, 50, 60], "provider_name": "東京ガス", "base": [ { @@ -146,6 +150,7 @@ { "name": "従量電灯Bたっぷりプラン", "provider_name": "JXTGでんき", + "supported_amp": [30, 40, 50, 60], "base": [ { "amp": 10, diff --git a/challengeA/katayama/simulator.rb b/challengeA/katayama/simulator.rb index ba255ea7a..ed911a928 100644 --- a/challengeA/katayama/simulator.rb +++ b/challengeA/katayama/simulator.rb @@ -12,16 +12,30 @@ def simulate(plans) result = [] plans.map do |plan| + # 基本料金の計算 base_charge = plan.calc_base_charge(self.amp) + + # 従量料金の計算 as_pay_charge = plan.calc_as_pay_charge(self.kwh) - # 電気料金 = 基本料金 + 従量料金 - total_charge = base_charge + as_pay_charge + # 電気を全く使用していない場合、基本料金が半額になる + if as_pay_charge == 0 + base_charge = base_charge/2 + end + + # 電気料金 = 基本料金 + 従量料金(少数切り捨て) + total_charge = (base_charge + as_pay_charge).floor + + # 電気料金が月額最低額以下の場合、月額最低額で電気料金を計上する + # (現時点で東京電力エナジーパートナー 従量電灯Bのみ確認) + if !plan.min_charge.nil? && plan.min_charge > total_charge + total_charge = plan.min_charge.floor + end result << { provider_name: plan.provider_name, plan_name: plan.name, - price: total_charge.ceil + price: plan.is_supported ? total_charge : 'アンペア対応外です' } end puts result From 79a1285f2d9568fe6f9a6c8b5c6e5e76d28eaaba Mon Sep 17 00:00:00 2001 From: "k.yusuke" Date: Thu, 3 Jun 2021 12:21:34 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E3=83=BB=E9=9B=BB=E6=B0=97=E3=82=92?= =?UTF-8?q?=E5=85=A8=E3=81=8F=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AE=E6=9D=A1=E4=BB=B6=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E3=83=BB=E9=9B=BB=E6=B0=97=E6=96=99=E9=87=91?= =?UTF-8?q?=E8=A8=88=E7=AE=97=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92?= =?UTF-8?q?Plan=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AB=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- challengeA/katayama/plan.rb | 41 +++++++++++++++++++++++++++----- challengeA/katayama/simulator.rb | 25 +++---------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/challengeA/katayama/plan.rb b/challengeA/katayama/plan.rb index 8636ff292..259db953c 100644 --- a/challengeA/katayama/plan.rb +++ b/challengeA/katayama/plan.rb @@ -25,20 +25,51 @@ def initialize(args) @min_charge = args["min_charge"] end + # 電気料金を計算する + def calc_total_charge(amp, kwh) + + # 基本料金の計算 + base_charge = calc_base_charge(amp, kwh) + + # 従量料金の計算 + as_pay_charge = calc_as_pay_charge(kwh) + + # 電気料金 = 基本料金 + 従量料金(少数切り捨て) + total_charge = (base_charge + as_pay_charge).floor + + # 電気料金が月額最低額以下の場合、月額最低額で電気料金を計上する + # (現時点で東京電力エナジーパートナー 従量電灯Bのみ確認) + if !self.min_charge.nil? && self.min_charge > total_charge + total_charge = self.min_charge.floor + end + + return total_charge + end + + private + # 基本料金の算出を実行する - def calc_base_charge(input_amp) + def calc_base_charge(input_amp, kwh) + base_charge = 0 # 入力されたアンペアがプラン対象かどうか判定 if self.supported_amp.include?(input_amp) # 入力されたアンペアが対応可の場合、入力された契約アンペア数に対応する基本料金を算出する target_amp = self.base.find {|b| b["amp"] == input_amp} - return target_amp["charge"] + base_charge = target_amp["charge"] + + # 電気使用量が0kWhの場合、電気料金のうち基本料金が半額になる + if kwh == 0 + base_charge = base_charge/2 + end + + return base_charge else - + # 入力されたアンペアが対応外の場合 self.is_supported = false - return 0 + return base_charge end end @@ -63,8 +94,6 @@ def calc_as_pay_charge(input_amount) return as_pay_sum end - private - # 従量料金の料金帯に含まれるか否か def is_range?(value, oppo) return oppo["from"] <= value && value <= oppo["to"] diff --git a/challengeA/katayama/simulator.rb b/challengeA/katayama/simulator.rb index ed911a928..87e6b673e 100644 --- a/challengeA/katayama/simulator.rb +++ b/challengeA/katayama/simulator.rb @@ -8,36 +8,17 @@ def initialize(amp, kwh) # プランごとの見積もりシュミレーションを実行し、結果を表示する def simulate(plans) - result = [] - plans.map do |plan| - - # 基本料金の計算 - base_charge = plan.calc_base_charge(self.amp) - - # 従量料金の計算 - as_pay_charge = plan.calc_as_pay_charge(self.kwh) - - # 電気を全く使用していない場合、基本料金が半額になる - if as_pay_charge == 0 - base_charge = base_charge/2 - end - - # 電気料金 = 基本料金 + 従量料金(少数切り捨て) - total_charge = (base_charge + as_pay_charge).floor - - # 電気料金が月額最低額以下の場合、月額最低額で電気料金を計上する - # (現時点で東京電力エナジーパートナー 従量電灯Bのみ確認) - if !plan.min_charge.nil? && plan.min_charge > total_charge - total_charge = plan.min_charge.floor - end + plans.map do |plan| + total_charge = plan.calc_total_charge(self.amp, self.kwh) result << { provider_name: plan.provider_name, plan_name: plan.name, price: plan.is_supported ? total_charge : 'アンペア対応外です' } end + puts result end end \ No newline at end of file