zakuro 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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