zakuro 0.1.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -1
  3. data/doc/gengou.md +22 -22
  4. data/doc/operation/csv/month.csv +468 -202
  5. data/doc/operation/operation.xlsx +0 -0
  6. data/lib/zakuro/calculation/base/operated_year.rb +114 -0
  7. data/lib/zakuro/calculation/base/year.rb +3 -0
  8. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +29 -29
  9. data/lib/zakuro/calculation/monthly/abstract_lunar_phase.rb +169 -0
  10. data/lib/zakuro/calculation/monthly/first_day.rb +1 -1
  11. data/lib/zakuro/calculation/monthly/operated_month.rb +47 -3
  12. data/lib/zakuro/calculation/range/medieval_annual_range.rb +105 -0
  13. data/lib/zakuro/calculation/range/operated_range.rb +61 -16
  14. data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +78 -0
  15. data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +71 -0
  16. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +117 -0
  17. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +187 -0
  18. data/lib/zakuro/calculation/stella/solar/choukei_value.rb +136 -0
  19. data/lib/zakuro/calculation/type/old_float.rb +69 -0
  20. data/lib/zakuro/era/japan/reki.rb +1 -1
  21. data/lib/zakuro/era/japan/yaml/set-001-until-south.yaml +22 -22
  22. data/lib/zakuro/operation/month/type.rb +58 -0
  23. data/lib/zakuro/operation/yaml/month.yaml +8512 -0
  24. data/lib/zakuro/version/context.rb +1 -1
  25. data/lib/zakuro/version/daien/const/number.rb +55 -0
  26. data/lib/zakuro/version/daien/const/remainder.rb +53 -0
  27. data/lib/zakuro/version/daien/cycle/remainder.rb +85 -0
  28. data/lib/zakuro/version/daien/cycle/solar_term.rb +34 -0
  29. data/lib/zakuro/version/daien/daien.rb +36 -0
  30. data/lib/zakuro/version/daien/monthly/lunar_phase.rb +106 -0
  31. data/lib/zakuro/version/daien/range/annual_range.rb +39 -0
  32. data/lib/zakuro/version/daien/stella/lunar/adjustment.rb +240 -0
  33. data/lib/zakuro/version/daien/stella/lunar/localization.rb +44 -0
  34. data/lib/zakuro/version/daien/stella/lunar/location.rb +80 -0
  35. data/lib/zakuro/version/daien/stella/lunar/value.rb +75 -0
  36. data/lib/zakuro/version/daien/stella/origin/average_november.rb +34 -0
  37. data/lib/zakuro/version/daien/stella/origin/lunar_age.rb +62 -0
  38. data/lib/zakuro/version/daien/stella/origin/winter_solstice.rb +55 -0
  39. data/lib/zakuro/version/daien/stella/solar/adjustment.rb +93 -0
  40. data/lib/zakuro/version/daien/stella/solar/average.rb +98 -0
  41. data/lib/zakuro/version/daien/stella/solar/interval.rb +108 -0
  42. data/lib/zakuro/version/daien/stella/solar/location.rb +61 -0
  43. data/lib/zakuro/version/daien/stella/solar/value.rb +36 -0
  44. data/lib/zakuro/version/genka/const/number.rb +43 -0
  45. data/lib/zakuro/version/genka/const/remainder.rb +33 -0
  46. data/lib/zakuro/version/genka/cycle/remainder.rb +92 -0
  47. data/lib/zakuro/version/genka/cycle/solar_term.rb +34 -0
  48. data/lib/zakuro/version/genka/genka.rb +19 -2
  49. data/lib/zakuro/version/genka/monthly/lunar_phase.rb +95 -0
  50. data/lib/zakuro/version/genka/range/annual_range.rb +77 -0
  51. data/lib/zakuro/version/genka/stella/origin/first_term.rb +55 -0
  52. data/lib/zakuro/version/genka/stella/origin/january.rb +49 -0
  53. data/lib/zakuro/version/genka/stella/solar/average.rb +41 -0
  54. data/lib/zakuro/version/gihou/const/number.rb +55 -0
  55. data/lib/zakuro/version/gihou/const/remainder.rb +54 -0
  56. data/lib/zakuro/version/gihou/cycle/remainder.rb +82 -0
  57. data/lib/zakuro/version/gihou/cycle/solar_term.rb +34 -0
  58. data/lib/zakuro/version/gihou/gihou.rb +23 -2
  59. data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +106 -0
  60. data/lib/zakuro/version/gihou/range/annual_range.rb +39 -0
  61. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +250 -0
  62. data/lib/zakuro/version/gihou/stella/lunar/localization.rb +44 -0
  63. data/lib/zakuro/version/gihou/stella/lunar/location.rb +80 -0
  64. data/lib/zakuro/version/gihou/stella/lunar/value.rb +75 -0
  65. data/lib/zakuro/version/gihou/stella/origin/average_november.rb +34 -0
  66. data/lib/zakuro/version/gihou/stella/origin/lunar_age.rb +62 -0
  67. data/lib/zakuro/version/gihou/stella/origin/winter_solstice.rb +55 -0
  68. data/lib/zakuro/version/gihou/stella/solar/adjustment.rb +93 -0
  69. data/lib/zakuro/version/gihou/stella/solar/average.rb +97 -0
  70. data/lib/zakuro/version/gihou/stella/solar/interval.rb +108 -0
  71. data/lib/zakuro/version/gihou/stella/solar/location.rb +61 -0
  72. data/lib/zakuro/version/gihou/stella/solar/value.rb +36 -0
  73. data/lib/zakuro/version/senmyou/const/number.rb +1 -1
  74. data/lib/zakuro/version/senmyou/const/remainder.rb +7 -3
  75. data/lib/zakuro/version/senmyou/cycle/remainder.rb +27 -6
  76. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +4 -1
  77. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +12 -112
  78. data/lib/zakuro/version/senmyou/range/annual_range.rb +5 -77
  79. data/lib/zakuro/version/senmyou/stella/lunar/localization.rb +2 -3
  80. data/lib/zakuro/version/senmyou/stella/lunar/location.rb +13 -34
  81. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +8 -30
  82. data/lib/zakuro/version/senmyou/stella/solar/adjustment.rb +29 -29
  83. data/lib/zakuro/version/senmyou/stella/solar/average.rb +14 -92
  84. data/lib/zakuro/version/senmyou/stella/solar/location.rb +18 -121
  85. data/lib/zakuro/version/senmyou/stella/solar/value.rb +4 -103
  86. data/lib/zakuro/version/version_class_resolver.rb +12 -0
  87. data/lib/zakuro/version.rb +1 -1
  88. data/lib/zakuro/version_factory.rb +1 -1
  89. metadata +61 -7
  90. data/lib/zakuro/version/taien/taien.rb +0 -19
@@ -15,9 +15,9 @@ module Zakuro
15
15
  #
16
16
  module Adjustment
17
17
  #
18
- # Item 24気損益眺朒(ちょうじく)数
18
+ # Row 行データ
19
19
  #
20
- class Item
20
+ class Row
21
21
  # @return [Integer] 眺朒(ちょうじく)積
22
22
  attr_reader :stack
23
23
  # @return [Integer] 眺朒(ちょうじく)数
@@ -48,40 +48,40 @@ module Zakuro
48
48
  end
49
49
  end
50
50
 
51
- # @return [Array<Item>] 24気損益眺朒(ちょうじく)数
51
+ # @return [Array<Row>] 24気損益眺朒(ちょうじく)数
52
52
  MAP = {
53
- touji: Item.new(stack: 0.0, per_term: +33.4511, per_day: -0.3695), # 冬至(とうじ)
54
- shoukan: Item.new(stack: +449.0, per_term: +28.0389, per_day: -0.3606), # 小寒(しょうかん)
55
- daikan: Item.new(stack: +823.0, per_term: +22.6998, per_day: -0.3519), # 大寒(だいかん)
56
- risshun: Item.new(stack: +1122.0, per_term: +17.8923, per_day: -0.4068), # 立春(りっしゅん)
57
- usui: Item.new(stack: +1346.0, per_term: +11.7966, per_day: -0.3998), # 雨水(うすい)
58
- keichitsu: Item.new(stack: +1481.0, per_term: +5.7986, per_day: -0.3998), # 啓蟄(けいちつ)
59
- shunbun: Item.new(stack: +1526.0, per_term: -0.2433, per_day: -0.3779), # 春分(しゅんぶん)
60
- seimei: Item.new(stack: +1481.0, per_term: -6.1254, per_day: -0.3634), # 清明(せいめい)
61
- kokuu: Item.new(stack: +1346.0, per_term: -12.2048, per_day: -0.2987), # 穀雨(こくう)
62
- rikka: Item.new(stack: +1122.0, per_term: -16.9060, per_day: -0.2919), # 立夏(りっか)
63
- shouman: Item.new(stack: +823.0, per_term: -21.5362, per_day: -0.2854), # 小満(しょうまん)
64
- boushu: Item.new(stack: +449.0, per_term: -26.0498, per_day: -0.2854), # 芒種(ぼうしゅ)
65
- geshi: Item.new(stack: 0.0, per_term: -30.3119, per_day: +0.2854), # 夏至(げし)
66
- shousho: Item.new(stack: -449.0, per_term: -25.8126, per_day: +0.2919), # 小暑(しょうしょ)
67
- taisho: Item.new(stack: -823.0, per_term: -21.2454, per_day: +0.2987), # 大暑(たいしょ)
68
- risshuu: Item.new(stack: -1122.0, per_term: -17.0296, per_day: +0.3634), # 立秋(りっしゅう)
69
- shosho: Item.new(stack: -1346.0, per_term: -11.4744, per_day: +0.3779), # 処暑(しょしょ)
70
- hakuro: Item.new(stack: -1481.0, per_term: -5.6429, per_day: +0.3779), # 白露(はくろ)
71
- shuubun: Item.new(stack: -1526.0, per_term: +0.1432, per_day: +0.3998), # 秋分(しゅうぶん)
72
- kanro: Item.new(stack: -1481.0, per_term: +6.1488, per_day: +0.4068), # 寒露(かんろ)
73
- soukou: Item.new(stack: -1346.0, per_term: +12.6336, per_day: +0.3519), # 霜降(そうこう)
74
- rittou: Item.new(stack: -1122.0, per_term: +17.8043, per_day: +0.3606), # 立冬(りっとう)
75
- shousetsu: Item.new(stack: -823.0, per_term: +23.0590, per_day: +0.3695), # 小雪(しょうせつ)
76
- taisetsu: Item.new(stack: -449.0, per_term: +28.4618, per_day: +0.3695) # 大雪(たいせつ)
53
+ touji: Row.new(stack: 0.0, per_term: +33.4511, per_day: -0.3695), # 冬至(とうじ)
54
+ shoukan: Row.new(stack: +449.0, per_term: +28.0389, per_day: -0.3606), # 小寒(しょうかん)
55
+ daikan: Row.new(stack: +823.0, per_term: +22.6998, per_day: -0.3519), # 大寒(だいかん)
56
+ risshun: Row.new(stack: +1122.0, per_term: +17.8923, per_day: -0.4068), # 立春(りっしゅん)
57
+ usui: Row.new(stack: +1346.0, per_term: +11.7966, per_day: -0.3998), # 雨水(うすい)
58
+ keichitsu: Row.new(stack: +1481.0, per_term: +5.7986, per_day: -0.3998), # 啓蟄(けいちつ)
59
+ shunbun: Row.new(stack: +1526.0, per_term: -0.2433, per_day: -0.3779), # 春分(しゅんぶん)
60
+ seimei: Row.new(stack: +1481.0, per_term: -6.1254, per_day: -0.3634), # 清明(せいめい)
61
+ kokuu: Row.new(stack: +1346.0, per_term: -12.2048, per_day: -0.2987), # 穀雨(こくう)
62
+ rikka: Row.new(stack: +1122.0, per_term: -16.9060, per_day: -0.2919), # 立夏(りっか)
63
+ shouman: Row.new(stack: +823.0, per_term: -21.5362, per_day: -0.2854), # 小満(しょうまん)
64
+ boushu: Row.new(stack: +449.0, per_term: -26.0498, per_day: -0.2854), # 芒種(ぼうしゅ)
65
+ geshi: Row.new(stack: 0.0, per_term: -30.3119, per_day: +0.2854), # 夏至(げし)
66
+ shousho: Row.new(stack: -449.0, per_term: -25.8126, per_day: +0.2919), # 小暑(しょうしょ)
67
+ taisho: Row.new(stack: -823.0, per_term: -21.2454, per_day: +0.2987), # 大暑(たいしょ)
68
+ risshuu: Row.new(stack: -1122.0, per_term: -17.0296, per_day: +0.3634), # 立秋(りっしゅう)
69
+ shosho: Row.new(stack: -1346.0, per_term: -11.4744, per_day: +0.3779), # 処暑(しょしょ)
70
+ hakuro: Row.new(stack: -1481.0, per_term: -5.6429, per_day: +0.3779), # 白露(はくろ)
71
+ shuubun: Row.new(stack: -1526.0, per_term: +0.1432, per_day: +0.3998), # 秋分(しゅうぶん)
72
+ kanro: Row.new(stack: -1481.0, per_term: +6.1488, per_day: +0.4068), # 寒露(かんろ)
73
+ soukou: Row.new(stack: -1346.0, per_term: +12.6336, per_day: +0.3519), # 霜降(そうこう)
74
+ rittou: Row.new(stack: -1122.0, per_term: +17.8043, per_day: +0.3606), # 立冬(りっとう)
75
+ shousetsu: Row.new(stack: -823.0, per_term: +23.0590, per_day: +0.3695), # 小雪(しょうせつ)
76
+ taisetsu: Row.new(stack: -449.0, per_term: +28.4618, per_day: +0.3695) # 大雪(たいせつ)
77
77
  }.freeze
78
78
 
79
79
  #
80
- # 24気損益眺朒(ちょうじく)数を特定する
80
+ # 24気損益眺朒(ちょうじく)数の行データを特定する
81
81
  #
82
82
  # @param [Integer] index 連番(二十四節気)
83
83
  #
84
- # @return [Adjustment::Item] 24気損益眺朒(ちょうじく)数
84
+ # @return [Row] 行データ
85
85
  #
86
86
  def self.specify(index:)
87
87
  key = Cycle::SolarTerm::ORDER[index]
@@ -1,9 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/solar/abstract_average'
4
+
3
5
  require_relative '../../const/remainder'
4
6
 
7
+ require_relative '../../cycle/solar_term'
8
+
5
9
  require_relative '../origin/winter_solstice'
6
10
 
11
+ require_relative './location'
12
+
7
13
  # :nodoc:
8
14
  module Zakuro
9
15
  # :nodoc:
@@ -11,19 +17,17 @@ module Zakuro
11
17
  # :nodoc:
12
18
  module Solar
13
19
  #
14
- # Average 常気(太陽軌道平均)
20
+ # Average 平気(太陽軌道平均)
15
21
  #
16
- class Average
17
- # @return [Remainder] 気策
18
- SOLAR_TERM_AVERAGE = Const::Remainder::Solar::SOLAR_TERM_AVERAGE
19
-
22
+ class Average < Calculation::Solar::AbstractAverage
20
23
  #
21
24
  # 初期化
22
25
  #
23
26
  # @param [Integer] western_year 西暦年
24
27
  #
25
28
  def initialize(western_year:)
26
- @solar_term = Average.first_solar_term(western_year: western_year)
29
+ solar_term = Average.first_solar_term(western_year: western_year)
30
+ super(solar_term: solar_term)
27
31
  end
28
32
 
29
33
  #
@@ -34,16 +38,7 @@ module Zakuro
34
38
  # @return [Array<Month>] 1年データ
35
39
  #
36
40
  def set(annual_range:)
37
- # 次月と比較しながら当月の二十四節気を決める
38
- # NOTE: 最後の月は処理できない(=計算外の余分な月が最後に必要である)
39
- annual_range.each_cons(2) do |(current_month, next_month)|
40
- set_solar_term(
41
- current_month: current_month,
42
- next_month: next_month
43
- )
44
- end
45
-
46
- annual_range
41
+ super(annual_range: annual_range)
47
42
  end
48
43
 
49
44
  #
@@ -60,7 +55,7 @@ module Zakuro
60
55
  # 二十四節気(冬至)
61
56
  solar_term = Cycle::SolarTerm.new(index: 0, remainder: winter_solstice)
62
57
 
63
- first_solar_term_index = Average.calc_fist_solar_term_index(western_year: western_year)
58
+ first_solar_term_index = Average.calc_first_solar_term_index(western_year: western_year)
64
59
 
65
60
  # 対象の二十四節気まで戻す
66
61
  solar_term.prev_by_index(first_solar_term_index)
@@ -82,7 +77,7 @@ module Zakuro
82
77
  #
83
78
  # @return [Integer] 二十四節気番号
84
79
  #
85
- def self.calc_fist_solar_term_index(western_year:)
80
+ def self.calc_first_solar_term_index(western_year:)
86
81
  # 天正閏余
87
82
  lunar_age = Origin::LunarAge.get(western_year: western_year)
88
83
 
@@ -92,83 +87,10 @@ module Zakuro
92
87
  solar_term_index = solar_location.index
93
88
 
94
89
  # 入定気の一つ後の二十四節気まで戻す(ただし11月経朔が二十四節気上にある場合は戻さない)
95
- solar_term_index += 1 unless solar_location.remainder == Cycle::Remainder.new(total: 0)
90
+ solar_term_index += 1 unless solar_location.remainder.day.zero?
96
91
 
97
92
  solar_term_index
98
93
  end
99
-
100
- # :reek:TooManyStatements { max_statements: 7 }
101
-
102
- #
103
- # 月内(当月朔日から当月末日(来月朔日の前日)の間)に二十四節気があるか
104
- # @note 大余60で一巡するため 以下2パターンがある
105
- # * current_month <= next_month : (二十四節気) >= current_month && (二十四節気) < next_month
106
- # * current_month > next_month : (二十四節気) >= current_month || (二十四節気) < next_month
107
- #
108
- # @param [Remainder] solar_term 二十四節気
109
- # @param [Remainder] current_month 月初
110
- # @param [Remainder] next_month 月末
111
- #
112
- # @return [True] 対象の二十四節気がある
113
- # @return [False] 対象の二十四節気がない
114
- #
115
- def self.in_solar_term?(solar_term:, current_month:, next_month:)
116
- # 大余で比較する
117
- target_time = solar_term.day
118
- current_month_time = current_month.day
119
- next_month_time = next_month.day
120
- current_month_over = (target_time >= current_month_time)
121
- next_month_under = (target_time < next_month_time)
122
-
123
- return current_month_over && next_month_under if current_month_time <= next_month_time
124
-
125
- current_month_over || next_month_under
126
- end
127
-
128
- private
129
-
130
- # :reek:TooManyStatements { max_statements: 8 }
131
-
132
- #
133
- # 二十四節気を設定する
134
- #
135
- # @param [Month] current_month 当月
136
- # @param [Month] next_month 次月
137
- #
138
- def set_solar_term(current_month:, next_month:)
139
- # 安全策として無限ループは回避する
140
- # * 最大試行回数:4回(設定なし => 設定あり => 設定あり => 設定なし)
141
- # * 閏月は1回しか設定しない
142
- # * 最大2回設定する(中気・節気)
143
- (0..3).each do |_index|
144
- in_range = Average.in_solar_term?(
145
- solar_term: @solar_term.remainder, current_month: current_month.remainder,
146
- next_month: next_month.remainder
147
- )
148
-
149
- # 範囲外
150
- unless in_range
151
- # 1つ以上設定されていれば切り上げる(一つ飛ばしで二十四節気を設定することはない)
152
- break unless current_month.empty_solar_term?
153
-
154
- next_solar_term
155
- next
156
- end
157
-
158
- current_month.add_term(term: @solar_term.clone)
159
- next_solar_term
160
-
161
- # 宣明暦は最大2つまで
162
- break if current_month.solar_term_size == 2
163
- end
164
- end
165
-
166
- #
167
- # 次の二十四節気に移る
168
- #
169
- def next_solar_term
170
- @solar_term.next_term!
171
- end
172
94
  end
173
95
  end
174
96
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/solar/abstract_location'
4
+
3
5
  require_relative '../../const/remainder'
4
6
 
5
7
  require_relative './interval'
@@ -13,150 +15,45 @@ module Zakuro
13
15
  #
14
16
  # Location 入定気
15
17
  #
16
- class Location
18
+ class Location < Calculation::Solar::AbstractLocation
17
19
  # @return [Cycle::Remainder] 弦
18
20
  QUARTER = Const::Remainder::Solar::QUARTER
19
21
 
20
- # @return [True] 計算済み(前回計算あり)
21
- # @return [False] 未計算(初回計算)
22
- attr_reader :calculated
23
- # @return [Integer] 連番
24
- attr_reader :index
25
- # @return [Cycle::Remainder] 大余小余
26
- attr_reader :remainder
27
-
28
22
  #
29
23
  # 初期化
30
24
  #
31
25
  # @param [Cycle::Remainder] lunar_age 天正閏余(大余小余)
32
26
  #
33
- def initialize(lunar_age: Cycle::Remainder.new)
34
- @calculated = false
35
- @index = -1
36
- @remainder = lunar_age.clone
27
+ def initialize(lunar_age:)
28
+ super(lunar_age: lunar_age, quarter: QUARTER)
37
29
  end
38
30
 
39
- #
40
- # 入定気を計算する
41
- #
42
- def run
43
- return current if calculated
44
-
45
- first
46
- end
31
+ # :reek:UtilityFunction
47
32
 
48
33
  #
49
- # 無効かどうか
50
- #
51
- # @return [True] 無効
52
- # @return [False] 有効
53
- #
54
- def invalid?
55
- @index == -1
56
- end
57
-
58
- #
59
- # 弦の分だけ太陽地点を進める
60
- #
61
- def add_quarter
62
- @remainder.add!(QUARTER)
63
- end
64
-
65
- private
66
-
67
- #
68
- # 2回目以降の計算をする
69
- #
70
- def current
71
- decrease_recursively
72
- end
73
-
34
+ # 二十四節気番号に対応する入気定日加減数を返す
74
35
  #
75
- # 初回計算する
36
+ # @note 継承のためクラスメソッドにしない
76
37
  #
77
- def first
78
- define_first
79
- @calculated = true
80
- end
81
-
38
+ # @param [Integer] index 二十四節気番号
82
39
  #
83
- # 初回の入定気を定める
40
+ # @return [Cycle::Remainder] 入気定日加減数
84
41
  #
85
- def define_first
86
- # 入定気の起算方法
87
- # 概要:
88
- # * 太陽の運行による補正値は、二十四節気の気ごとに定められる
89
- # * 11月経朔の前にある気を求め、それから11月経朔との間隔を求める
90
- # * 気ごとの補正値と、気から11月経朔までにかかる補正値を求める
91
- # 前提:
92
- # * 11月経朔に関わる二十四節気は、時系列から順に、小雪・大雪・冬至である
93
- # * 小雪〜大雪の間隔は小雪定数で、大雪〜冬至の間隔は大雪定数で決められている(24気損益眺朒(ちょうじく)数のこと)
94
- # * 11月経朔は、この小雪〜冬至の間のいずれかにある
95
- # 計算:
96
- # 2パターンある
97
- # (a) 大雪〜冬至にある場合
98
- # *「大雪定数 >= 天正閏余」の場合を指す
99
- # * * NOTE 資料では「より大きい(>)」とされるが、大雪そのものの場合は大雪から起算すべき
100
- # * この場合は、大雪〜経朔の間隔を求める
101
- # (b) 小雪〜大雪にある場合
102
- # *「大雪定数 < 天正閏余」の場合を指す
103
- # * この場合は、小雪〜経朔の間隔を求める
104
-
105
- # NOTE: 上記パターンとは別に、稀だが立冬のパターンも存在する
106
- # この場合は比較方法はそのままに立冬〜経朔の間隔を求める
107
-
108
- # 大雪(23)/小雪(22)/立冬(21)
109
- [23, 22, 21].each do |index|
110
- prev(index: index)
111
-
112
- break unless invalid?
113
- end
114
-
115
- # 立冬(21)を超える天正閏余は成立し得ない(1朔望月をはるかに超えることになる)
116
- return unless invalid?
117
-
118
- raise ArgumentError.new, 'invalid winster solstice age'
42
+ def interval(index:)
43
+ Interval.index_of(index)
119
44
  end
120
45
 
121
- #
122
- # 大余小余の分だけ二十四節気を遡る
123
- #
124
- # @param [Integer] index 二十四節気番号
125
- #
126
- def prev(index:)
127
- interval = Interval.index_of(index)
128
- if remainder > interval
129
- @remainder.sub!(interval)
130
- return
131
- end
132
-
133
- # 入定気が確定する
134
- @remainder = interval.sub(@remainder)
135
- @index = index
136
- end
46
+ # :reek:UtilityFunction
137
47
 
138
48
  #
139
- # 二十四節気番号を次に進める
49
+ # 入気定日加減数の要素数を返す
140
50
  #
141
- def next_index
142
- @index += 1
143
- @index = 0 if @index >= Interval.size
144
- end
145
-
51
+ # @note 継承のためクラスメソッドにしない
146
52
  #
147
- # 二十四節気を減算する
53
+ # @return [Integer] 入気定日加減数の要素数
148
54
  #
149
- def decrease_recursively
150
- interval = Interval.index_of(@index)
151
- # 現在の二十四節気に留まる
152
- return if remainder < interval
153
-
154
- @remainder.sub!(interval)
155
-
156
- next_index
157
-
158
- # 再帰
159
- decrease_recursively
55
+ def interval_size
56
+ Interval.size
160
57
  end
161
58
  end
162
59
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/solar/choukei_value'
4
+
3
5
  require_relative '../../const/number'
4
6
 
5
7
  require_relative './adjustment'
@@ -27,111 +29,10 @@ module Zakuro
27
29
  def self.get(solar_location:)
28
30
  remainder = solar_location.remainder
29
31
 
30
- adjustment = Adjustment.specify(index: solar_location.index)
31
- # 損益率/眺朒(ちょうじく)数
32
- # パラメータ:
33
- # a: 眺朒(ちょうじく)数の初日の値
34
- # b: 損益率初日の値
35
- # c: 損益率の毎日の差
36
- # n: 定気の日から数えた日数
37
-
38
- day_stack = calc_day_stack(remainder: remainder, adjustment: adjustment)
39
-
40
- month_stack = calc_month_stack(stack: adjustment.stack, day: remainder.day,
41
- per_term: adjustment.per_term, per_day:
42
- adjustment.per_day)
43
-
44
- # 冬至であれば眺朒数がプラスになり続けて損益率が「益」で、小雪であればマイナスの眺朒数がプラスされ続けて「損」
45
- month_stack + day_stack
46
- end
47
-
48
- #
49
- # 損益率を求める
50
- #
51
- # @param [Remainder] remainder 入定気
52
- # @param [Adjustment::Item] adjustment 24気損益眺朒(ちょうじく)数
53
- #
54
- # @return [Integer] 損益率
55
- #
56
- def self.calc_day_stack(remainder:, adjustment:)
57
- per_term = adjustment.per_term
58
- per_day = adjustment.per_day
59
- sign, ratio = calc_ratio(day: remainder.day, per_term: per_term, per_day: per_day)
60
-
61
- calc_day_stack_from_ratio(sign: sign, ratio: ratio,
62
- minute: remainder.minute)
63
- end
64
- private_class_method :calc_day_stack
65
-
66
- # :reek:TooManyStatements { max_statements: 6 }
67
-
68
- #
69
- # 大余に対応する損益率を求める
70
- # 損益率 = b + n * c
71
- #
72
- # @param [Integer] day 大余
73
- # @param [Integer] per_term 眺朒(ちょうじく)数
74
- # @param [Integer] per_day 毎日差
75
- #
76
- # @return [Integer] 正負
77
- # @return [Integer] 大余に対応する損益率
78
- #
79
- def self.calc_ratio(day:, per_term:, per_day:)
80
- ratio = per_term + day * per_day
81
- sign = 1
82
- if ratio.negative?
83
- sign = -1
84
- ratio *= sign
85
- end
86
- # 小数点以下は無視する
87
- ratio = ratio.floor
88
-
89
- [sign, ratio]
90
- end
91
- private_class_method :calc_ratio
92
-
93
- #
94
- # 小余を含めた損益率を求める
95
- #
96
- # @param [Integer] sign 正負(大余に対応する損益率)
97
- # @param [Integer] ratio 大余に対応する損益率
98
- # @param [Integer] minute 小余
99
- #
100
- # @return [Integer] 小余を含めた損益率
101
- #
102
- def self.calc_day_stack_from_ratio(sign:, ratio:, minute:)
103
- minute_stack = ratio * minute
104
- day_stack = (minute_stack / DAY).floor
105
- # 四捨五入
106
- # NOTE 資料では「この余りが4200をこえていれば切り上げる」とあり「>=」とした
107
- # 1612年の7月(慶長17年7月)が境界値4200だが、繰り上げを行なっていたため
108
- day_stack += 1 if minute_stack % DAY >= (DAY / 2)
109
- day_stack *= sign
110
-
111
- day_stack
112
- end
113
- private_class_method :calc_day_stack_from_ratio
114
-
115
- # :reek:LongParameterList { max_params: 4 }
32
+ row = Adjustment.specify(index: solar_location.index)
116
33
 
117
- #
118
- # 眺朒(ちょうじく)数を求める
119
- # 眺朒(ちょうじく)数 = a + (n * b) + (1/2)n(n-1)c
120
- #
121
- # @param [Integer] stack 眺朒(ちょうじく)積
122
- # @param [Integer] day 大余
123
- # @param [Integer] per_term 眺朒(ちょうじく)数
124
- # @param [Integer] per_day 毎日差f
125
- #
126
- # @return [Integer] 眺朒(ちょうじく)数
127
- #
128
- def self.calc_month_stack(stack:, day:, per_term:, per_day:)
129
- month_stack = stack + day * per_term + \
130
- (1 / 2.0) * (day * (day - 1) * per_day)
131
- # 切り捨て(プラスマイナスに関わらず小数点以下切り捨て)
132
- month_stack.negative? ? month_stack.ceil : month_stack.floor
34
+ Calculation::Solar::ChoukeiValue.get(remainder: remainder, row: row)
133
35
  end
134
- private_class_method :calc_month_stack
135
36
  end
136
37
  end
137
38
  end
@@ -1,5 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './genka/cycle/remainder'
4
+ require_relative './genka/cycle/solar_term'
5
+ require_relative './genka/range/annual_range'
6
+
7
+ require_relative './gihou/cycle/remainder'
8
+ require_relative './gihou/cycle/solar_term'
9
+ require_relative './gihou/range/annual_range'
10
+
11
+ require_relative './daien/cycle/remainder'
12
+ require_relative './daien/cycle/solar_term'
13
+ require_relative './daien/range/annual_range'
14
+
3
15
  require_relative './senmyou/cycle/remainder'
4
16
  require_relative './senmyou/cycle/solar_term'
5
17
  require_relative './senmyou/range/annual_range'
@@ -3,5 +3,5 @@
3
3
  # :nodoc:
4
4
  module Zakuro
5
5
  # @return [String] library version
6
- VERSION = '0.1.5'
6
+ VERSION = '0.5.0'
7
7
  end
@@ -4,7 +4,7 @@ require_relative './era/japan/reki'
4
4
  require_relative './era/western'
5
5
  require_relative './version/genka/genka'
6
6
  require_relative './version/gihou/gihou'
7
- require_relative './version/taien/taien'
7
+ require_relative './version/daien/daien'
8
8
  require_relative './version/senmyou/senmyou'
9
9
  require_relative './version/joukyou/joukyou'
10
10
  require_relative './version/houryaku/houryaku'