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
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../const/number'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ # :nodoc:
8
+ module Gihou
9
+ # :nodoc:
10
+ module Lunar
11
+ #
12
+ # Localization 入暦特定
13
+ #
14
+ module Localization
15
+ # @return [Integer] 1近点月
16
+ ANOMALISTIC_MONTH = Const::Number::Cycle::ANOMALISTIC_MONTH
17
+ # @return [Integer] 積年
18
+ TOTAL_YEAR = Const::Number::Stack::TOTAL_YEAR
19
+ # @return [Integer] 開始年
20
+ BEGIN_YEAR = Const::Number::Stack::BEGIN_YEAR
21
+ # @return [Integer] 年
22
+ YEAR = Const::Number::Cycle::YEAR
23
+
24
+ #
25
+ # 対象年の最初の入暦を求める
26
+ #
27
+ # @param [Remainder] lunar_age 天正閏余
28
+ # @param [Integer] western_year 西暦年
29
+ #
30
+ # @return [Cycle::LunarRemainder] 入暦
31
+ #
32
+ def self.first_remainder(lunar_age:, western_year:)
33
+ # 積年の開始から対象年までの年数
34
+ total_year = TOTAL_YEAR + western_year - BEGIN_YEAR
35
+
36
+ # 通積分 - 天正閏余
37
+ total_day = total_year * YEAR - lunar_age.to_minute
38
+
39
+ Cycle::LunarRemainder.new(total: (total_day % ANOMALISTIC_MONTH))
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../calculation/stella/lunar/abstract_location'
4
+
5
+ require_relative '../../const/remainder'
6
+
7
+ require_relative './localization'
8
+
9
+ # :nodoc:
10
+ module Zakuro
11
+ # :nodoc:
12
+ module Gihou
13
+ # :nodoc:
14
+ module Lunar
15
+ #
16
+ # Location 入暦
17
+ #
18
+ class Location < Calculation::Lunar::AbstractLocation
19
+ # @return [Cycle::LunarRemainder] 1近点月
20
+ ANOMALISTIC_MONTH = Const::Remainder::Lunar::ANOMALISTIC_MONTH
21
+ # @return [Cycle::LunarRemainder] 入暦上限
22
+ LIMIT = Const::Remainder::Lunar::LIMIT
23
+ # @return [Cycle::LunarRemainder] 弦
24
+ QUARTER = Const::Remainder::Lunar::QUARTER
25
+
26
+ #
27
+ # 初期化
28
+ #
29
+ # @param [Cycle::LunarRemainder] lunar_age 天正閏余(大余小余)
30
+ # @param [Integer] western_year 西暦年
31
+ #
32
+ def initialize(lunar_age:, western_year:)
33
+ super(lunar_age: lunar_age, western_year: western_year)
34
+ end
35
+
36
+ #
37
+ # 入暦を計算する
38
+ #
39
+ def run
40
+ if calculated
41
+ # 1始まりで計算しているので、入暦上限を用いる
42
+ decrease(limit: LIMIT)
43
+ return
44
+ end
45
+
46
+ first
47
+ end
48
+
49
+ #
50
+ # 弦の分だけ月地点を進める
51
+ #
52
+ def add_quarter
53
+ remainder.add!(QUARTER)
54
+ end
55
+
56
+ private
57
+
58
+ #
59
+ # 初回計算
60
+ #
61
+ def first
62
+ @remainder = Localization.first_remainder(
63
+ lunar_age: remainder, western_year: western_year
64
+ )
65
+ # 初回は0始まりで計算しているので、入暦上限ではなく1近点月を用いる
66
+ decrease(limit: ANOMALISTIC_MONTH)
67
+ # 1始まりに改める
68
+ one_based
69
+
70
+ @calculated = true
71
+ end
72
+
73
+ #
74
+ # 大余小余に合わせて減算する(折り返す)
75
+ #
76
+ # @param [Cycle::LunarRemainder] limit 上限
77
+ #
78
+ def decrease(limit:)
79
+ return if remainder < limit
80
+
81
+ remainder.sub!(ANOMALISTIC_MONTH)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../calculation/stella/lunar/choukei_value'
4
+
5
+ require_relative '../../cycle/remainder'
6
+
7
+ require_relative './adjustment'
8
+
9
+ # :nodoc:
10
+ module Zakuro
11
+ # :nodoc:
12
+ module Gihou
13
+ # :nodoc:
14
+ module Lunar
15
+ #
16
+ # Value 月補正値
17
+ #
18
+ module Value
19
+ # @return [Output::Logger] ロガー
20
+ LOGGER = Output::Logger.new(location: 'lunar_value')
21
+
22
+ # :reek:TooManyStatements { max_statements: 9 }
23
+
24
+ #
25
+ # 月の運行による補正値を算出する
26
+ #
27
+ # @param [Cycle::LunarRemainder] remainder 月の大余小余
28
+ #
29
+ # @return [Integer] 補正値
30
+ #
31
+ def self.get(remainder:)
32
+ valid?(remainder: remainder)
33
+
34
+ day = remainder.day
35
+ minute = remainder.floor_minute
36
+
37
+ # 引き当て
38
+ row = Adjustment.specify(day: day, minute: minute)
39
+
40
+ value = row.value
41
+
42
+ # LOGGER.debug("value.per: #{value.per}")
43
+ # LOGGER.debug("row.denominator: #{row.denominator}")
44
+ # LOGGER.debug("value.stack: #{value.stack}")
45
+
46
+ minus_minute = Adjustment.minus_minute(day: day, minute: minute)
47
+
48
+ day = Calculation::Lunar::ChoukeiValue.rounded_day(
49
+ per: value.per, denominator: row.denominator, minute: minus_minute
50
+ )
51
+
52
+ # LOGGER.debug("day: #{day}")
53
+
54
+ value.stack + day
55
+ end
56
+
57
+ #
58
+ # 大余小余を検証する
59
+ #
60
+ # @param [Cycle::LunarRemainder] remainder 大余小余
61
+ #
62
+ # @return [True] 正しい(月の位相計算に使う大余小余)
63
+ # @return [True] 正しくない
64
+ #
65
+ def self.valid?(remainder:)
66
+ return if remainder.is_a?(Cycle::LunarRemainder)
67
+
68
+ raise ArgumentError, "unmatch parameter type: #{remainder.class}"
69
+ end
70
+ private_class_method :valid?
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './lunar_age'
4
+ require_relative './winter_solstice'
5
+
6
+ # :nodoc:
7
+ module Zakuro
8
+ # :nodoc:
9
+ module Gihou
10
+ # :nodoc:
11
+ module Origin
12
+ #
13
+ # AverageNovember 11月経
14
+ #
15
+ module AverageNovember
16
+ #
17
+ # 11月経朔(冬至が含まれる月の1日)を求める
18
+ #
19
+ # @param [Integer] western_year 西暦年
20
+ #
21
+ # @return [Remainder] 11月経朔
22
+ #
23
+ def self.get(western_year:)
24
+ # 冬至
25
+ winter_solstice = WinterSolstice.get(western_year: western_year)
26
+ # 天正閏余
27
+ lunar_age = LunarAge.get(western_year: western_year)
28
+
29
+ winter_solstice.sub(lunar_age)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../output/logger'
4
+
5
+ require_relative '../../const/number'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Gihou
11
+ # :nodoc:
12
+ module Origin
13
+ #
14
+ # LunarAge 天正閏余
15
+ #
16
+ module LunarAge
17
+ # @return [Integer] 朔望月
18
+ SYNODIC_MONTH = Const::Number::Cycle::SYNODIC_MONTH
19
+ # @return [Integer] 一年
20
+ YEAR = Const::Number::Cycle::YEAR
21
+ # @return [Integer] 積年
22
+ TOTAL_YEAR = Const::Number::Stack::TOTAL_YEAR
23
+ # @return [Integer] 暦の開始年
24
+ BEGIN_YEAR = Const::Number::Stack::BEGIN_YEAR
25
+
26
+ # @return [Output::Logger] ロガー
27
+ LOGGER = Output::Logger.new(location: 'lunar_age')
28
+
29
+ # :reek:TooManyStatements { max_statements: 7 }
30
+
31
+ #
32
+ # 対象年の天正閏余(冬至より前にある11月経朔との差 = 月齢)を算出する
33
+ # 太陽と月の運動による補正値を算出し、その補正結果を返す
34
+ #
35
+ # @param [Integer] western_year 西暦年
36
+ #
37
+ # @return [Remainder] 天正閏余
38
+ #
39
+ def self.get(western_year:)
40
+ # 積年の開始から対象年までの年数
41
+ total = TOTAL_YEAR + western_year - BEGIN_YEAR
42
+
43
+ # 12朔望月に対する1年の余り(単位:分)
44
+ remainder_minute = YEAR - (SYNODIC_MONTH * 12)
45
+
46
+ # 朔望月に含まれなかった余り(単位:年)
47
+ remainder_year = total % SYNODIC_MONTH
48
+
49
+ LOGGER.debug("[01]: #{remainder_year}")
50
+
51
+ # 天正閏余
52
+ lunar_age = remainder_minute * remainder_year % SYNODIC_MONTH
53
+
54
+ LOGGER.debug("[02]: #{lunar_age}")
55
+
56
+ # 大余・小余に変換する
57
+ Cycle::Remainder.new(total: lunar_age)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../output/logger'
4
+
5
+ require_relative '../../const/number'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Gihou
11
+ # :nodoc:
12
+ module Origin
13
+ #
14
+ # WinterSolstice 冬至
15
+ #
16
+ module WinterSolstice
17
+ # @return [Integer] 通余
18
+ REMAINDER_ALL_YEAR = Const::Number::Derivation::REMAINDER_ALL_YEAR
19
+ # @return [Integer] 60日
20
+ SIXTY_DAYS = Const::Number::Derivation::SIXTY_DAYS
21
+ # @return [Integer] 積年
22
+ TOTAL_YEAR = Const::Number::Stack::TOTAL_YEAR
23
+ # @return [Integer] 暦の開始年
24
+ BEGIN_YEAR = Const::Number::Stack::BEGIN_YEAR
25
+
26
+ # @return [Output::Logger] ロガー
27
+ LOGGER = Output::Logger.new(location: 'winter_solstice')
28
+
29
+ # :reek:TooManyStatements { max_statements: 6 }
30
+
31
+ #
32
+ # 対象年の前年の冬至を求める
33
+ #
34
+ # @param [Integer] western_year 西暦年
35
+ #
36
+ # @return [Remainder] 前年の冬至
37
+ #
38
+ def self.get(western_year:)
39
+ # 積年の開始から対象年までの年数
40
+ total = TOTAL_YEAR + western_year - BEGIN_YEAR
41
+ remainder_year = total % SIXTY_DAYS
42
+
43
+ LOGGER.debug("[01]:#{remainder_year}")
44
+
45
+ # 通余を使う
46
+ winter_solstice_minute = (remainder_year * REMAINDER_ALL_YEAR) % SIXTY_DAYS
47
+
48
+ LOGGER.debug("[02]:#{winter_solstice_minute}")
49
+
50
+ Cycle::Remainder.new(total: winter_solstice_minute)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../cycle/solar_term'
4
+
5
+ require_relative '../../const/number'
6
+
7
+ # :nodoc:
8
+ module Zakuro
9
+ # :nodoc:
10
+ module Gihou
11
+ # :nodoc:
12
+ module Solar
13
+ #
14
+ # Adjustment 24気損益眺朒(ちょうじく)数
15
+ #
16
+ module Adjustment
17
+ #
18
+ # Row 行データ
19
+ #
20
+ class Row
21
+ # @return [Integer] 眺朒(ちょうじく)積
22
+ attr_reader :stack
23
+ # @return [Integer] 眺朒(ちょうじく)数
24
+ attr_reader :per_term
25
+ # @return [Integer] 毎日差
26
+ attr_reader :per_day
27
+
28
+ #
29
+ # 初期化
30
+ #
31
+ # @param [Integer] stack 眺朒(ちょうじく)積
32
+ # @param [Integer] per_term 眺朒(ちょうじく)数
33
+ # @param [Integer] per_day 毎日差
34
+ #
35
+ def initialize(stack:, per_term:, per_day:)
36
+ @stack = stack
37
+ @per_term = per_term
38
+ @per_day = per_day
39
+ end
40
+
41
+ #
42
+ # 文字化
43
+ #
44
+ # @return [String] 文字
45
+ #
46
+ def to_s
47
+ "stack:#{@stack}, per_term:#{@per_term}, per_day:#{@per_day}"
48
+ end
49
+ end
50
+
51
+ # @return [Array<Row>] 24気損益眺朒(ちょうじく)数
52
+ MAP = {
53
+ touji: Row.new(stack: 0.0, per_term: +3.9546, per_day: -0.0372), # 冬至(とうじ)
54
+ shoukan: Row.new(stack: +54.0, per_term: +3.4091, per_day: -0.0372), # 小寒(しょうかん)
55
+ daikan: Row.new(stack: +100.0, per_term: +2.8636, per_day: -0.0372), # 大寒(だいかん)
56
+ risshun: Row.new(stack: +138.0, per_term: +2.3181, per_day: +0.0372), # 立春(りっしゅん)
57
+ usui: Row.new(stack: +176.0, per_term: +2.8636, per_day: +0.0372), # 雨水(うすい)
58
+ keichitsu: Row.new(stack: +222.0, per_term: +3.4091, per_day: +0.0372), # 啓蟄(けいちつ)
59
+ shunbun: Row.new(stack: +276.0, per_term: -3.7220, per_day: +0.0329), # 春分(しゅんぶん)
60
+ seimei: Row.new(stack: +222.0, per_term: -3.2086, per_day: +0.0329), # 清明(せいめい)
61
+ kokuu: Row.new(stack: +176.0, per_term: -2.6952, per_day: +0.0329), # 穀雨(こくう)
62
+ rikka: Row.new(stack: +138.0, per_term: -2.1818, per_day: -0.0329), # 立夏(りっか)
63
+ shouman: Row.new(stack: +100.0, per_term: -2.6952, per_day: -0.0329), # 小満(しょうまん)
64
+ boushu: Row.new(stack: +54.0, per_term: -3.2086, per_day: -0.0329), # 芒種(ぼうしゅ)
65
+ geshi: Row.new(stack: 0.0, per_term: -3.7220, per_day: +0.0329), # 夏至(げし)
66
+ shousho: Row.new(stack: -54.0, per_term: -3.2086, per_day: +0.0329), # 小暑(しょうしょ)
67
+ taisho: Row.new(stack: -100.0, per_term: -2.6952, per_day: +0.0329), # 大暑(たいしょ)
68
+ risshuu: Row.new(stack: -138.0, per_term: -2.1818, per_day: -0.0329), # 立秋(りっしゅう)
69
+ shosho: Row.new(stack: -176.0, per_term: -2.6952, per_day: -0.0329), # 処暑(しょしょ)
70
+ hakuro: Row.new(stack: -222.0, per_term: -3.2086, per_day: -0.0329), # 白露(はくろ)
71
+ shuubun: Row.new(stack: -276.0, per_term: +3.9546, per_day: -0.0372), # 秋分(しゅうぶん)
72
+ kanro: Row.new(stack: -222.0, per_term: +3.4091, per_day: -0.0372), # 寒露(かんろ)
73
+ soukou: Row.new(stack: -176.0, per_term: +2.8636, per_day: -0.0372), # 霜降(そうこう)
74
+ rittou: Row.new(stack: -138.0, per_term: +2.3181, per_day: +0.0372), # 立冬(りっとう)
75
+ shousetsu: Row.new(stack: -100.0, per_term: +2.8636, per_day: +0.0372), # 小雪(しょうせつ)
76
+ taisetsu: Row.new(stack: -54.0, per_term: +3.4091, per_day: +0.0372) # 大雪(たいせつ)
77
+ }.freeze
78
+
79
+ #
80
+ # 24気損益眺朒(ちょうじく)数の行データを特定する
81
+ #
82
+ # @param [Integer] index 連番(二十四節気)
83
+ #
84
+ # @return [Row] 行データ
85
+ #
86
+ def self.specify(index:)
87
+ key = Cycle::SolarTerm::ORDER[index]
88
+ Adjustment::MAP[key].clone
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end