zakuro 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/zakuro/calculation/monthly/abstract_lunar_phase.rb +169 -0
  3. data/lib/zakuro/calculation/range/medieval_annual_range.rb +105 -0
  4. data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +76 -0
  5. data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +52 -0
  6. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +117 -0
  7. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +187 -0
  8. data/lib/zakuro/calculation/stella/solar/choukei_value.rb +136 -0
  9. data/lib/zakuro/calculation/type/old_float.rb +69 -0
  10. data/lib/zakuro/version.rb +1 -1
  11. data/lib/zakuro/version/gihou/const/number.rb +55 -0
  12. data/lib/zakuro/version/gihou/const/remainder.rb +56 -0
  13. data/lib/zakuro/version/gihou/cycle/remainder.rb +61 -0
  14. data/lib/zakuro/version/gihou/cycle/solar_term.rb +34 -0
  15. data/lib/zakuro/version/gihou/gihou.rb +23 -2
  16. data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +106 -0
  17. data/lib/zakuro/version/gihou/range/annual_range.rb +39 -0
  18. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +250 -0
  19. data/lib/zakuro/version/gihou/stella/lunar/localization.rb +44 -0
  20. data/lib/zakuro/version/gihou/stella/lunar/location.rb +86 -0
  21. data/lib/zakuro/version/gihou/stella/lunar/value.rb +74 -0
  22. data/lib/zakuro/version/gihou/stella/origin/average_november.rb +34 -0
  23. data/lib/zakuro/version/gihou/stella/origin/lunar_age.rb +62 -0
  24. data/lib/zakuro/version/gihou/stella/origin/winter_solstice.rb +55 -0
  25. data/lib/zakuro/version/gihou/stella/solar/adjustment.rb +93 -0
  26. data/lib/zakuro/version/gihou/stella/solar/average.rb +97 -0
  27. data/lib/zakuro/version/gihou/stella/solar/interval.rb +108 -0
  28. data/lib/zakuro/version/gihou/stella/solar/location.rb +61 -0
  29. data/lib/zakuro/version/gihou/stella/solar/value.rb +36 -0
  30. data/lib/zakuro/version/senmyou/const/number.rb +1 -1
  31. data/lib/zakuro/version/senmyou/const/remainder.rb +7 -1
  32. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +4 -1
  33. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +11 -111
  34. data/lib/zakuro/version/senmyou/range/annual_range.rb +5 -77
  35. data/lib/zakuro/version/senmyou/stella/lunar/localization.rb +2 -3
  36. data/lib/zakuro/version/senmyou/stella/lunar/location.rb +13 -28
  37. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +5 -28
  38. data/lib/zakuro/version/senmyou/stella/solar/adjustment.rb +29 -29
  39. data/lib/zakuro/version/senmyou/stella/solar/average.rb +11 -89
  40. data/lib/zakuro/version/senmyou/stella/solar/location.rb +18 -121
  41. data/lib/zakuro/version/senmyou/stella/solar/value.rb +4 -103
  42. data/lib/zakuro/version/version_class_resolver.rb +4 -0
  43. metadata +28 -2
@@ -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,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative './gihou/cycle/remainder'
4
+ require_relative './gihou/cycle/solar_term'
5
+ require_relative './gihou/range/annual_range'
6
+
3
7
  require_relative './senmyou/cycle/remainder'
4
8
  require_relative './senmyou/cycle/solar_term'
5
9
  require_relative './senmyou/range/annual_range'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zakuro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pldb
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-16 00:00:00.000000000 Z
11
+ date: 2021-06-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: mainly lunar solar calendar
14
14
  email:
@@ -46,18 +46,26 @@ files:
46
46
  - lib/zakuro/calculation/cycle/abstract_remainder.rb
47
47
  - lib/zakuro/calculation/cycle/abstract_solar_term.rb
48
48
  - lib/zakuro/calculation/cycle/zodiac.rb
49
+ - lib/zakuro/calculation/monthly/abstract_lunar_phase.rb
49
50
  - lib/zakuro/calculation/monthly/first_day.rb
50
51
  - lib/zakuro/calculation/monthly/initialized_month.rb
51
52
  - lib/zakuro/calculation/monthly/month.rb
52
53
  - lib/zakuro/calculation/monthly/month_label.rb
53
54
  - lib/zakuro/calculation/monthly/operated_month.rb
54
55
  - lib/zakuro/calculation/range/full_range.rb
56
+ - lib/zakuro/calculation/range/medieval_annual_range.rb
55
57
  - lib/zakuro/calculation/range/operated_range.rb
56
58
  - lib/zakuro/calculation/range/operated_solar_terms.rb
57
59
  - lib/zakuro/calculation/range/transfer/western_date_allocation.rb
58
60
  - lib/zakuro/calculation/range/transfer/year_boundary.rb
59
61
  - lib/zakuro/calculation/specifier/single_day.rb
62
+ - lib/zakuro/calculation/stella/lunar/abstract_location.rb
63
+ - lib/zakuro/calculation/stella/lunar/choukei_value.rb
64
+ - lib/zakuro/calculation/stella/solar/abstract_average.rb
65
+ - lib/zakuro/calculation/stella/solar/abstract_location.rb
66
+ - lib/zakuro/calculation/stella/solar/choukei_value.rb
60
67
  - lib/zakuro/calculation/summary/single.rb
68
+ - lib/zakuro/calculation/type/old_float.rb
61
69
  - lib/zakuro/condition.rb
62
70
  - lib/zakuro/era/japan/gengou.rb
63
71
  - lib/zakuro/era/japan/gengou/parser.rb
@@ -87,7 +95,25 @@ files:
87
95
  - lib/zakuro/version/abstract_version.rb
88
96
  - lib/zakuro/version/context.rb
89
97
  - lib/zakuro/version/genka/genka.rb
98
+ - lib/zakuro/version/gihou/const/number.rb
99
+ - lib/zakuro/version/gihou/const/remainder.rb
100
+ - lib/zakuro/version/gihou/cycle/remainder.rb
101
+ - lib/zakuro/version/gihou/cycle/solar_term.rb
90
102
  - lib/zakuro/version/gihou/gihou.rb
103
+ - lib/zakuro/version/gihou/monthly/lunar_phase.rb
104
+ - lib/zakuro/version/gihou/range/annual_range.rb
105
+ - lib/zakuro/version/gihou/stella/lunar/adjustment.rb
106
+ - lib/zakuro/version/gihou/stella/lunar/localization.rb
107
+ - lib/zakuro/version/gihou/stella/lunar/location.rb
108
+ - lib/zakuro/version/gihou/stella/lunar/value.rb
109
+ - lib/zakuro/version/gihou/stella/origin/average_november.rb
110
+ - lib/zakuro/version/gihou/stella/origin/lunar_age.rb
111
+ - lib/zakuro/version/gihou/stella/origin/winter_solstice.rb
112
+ - lib/zakuro/version/gihou/stella/solar/adjustment.rb
113
+ - lib/zakuro/version/gihou/stella/solar/average.rb
114
+ - lib/zakuro/version/gihou/stella/solar/interval.rb
115
+ - lib/zakuro/version/gihou/stella/solar/location.rb
116
+ - lib/zakuro/version/gihou/stella/solar/value.rb
91
117
  - lib/zakuro/version/gregorio/gregorio.rb
92
118
  - lib/zakuro/version/houryaku/houryaku.rb
93
119
  - lib/zakuro/version/joukyou/joukyou.rb