four-pillars 0.1.12 → 0.1.14
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.
- checksums.yaml +4 -4
- data/lib/four-pillars.rb +137 -50
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3208005abb1c52cad09b0e9b335a22351553193308d8716b535eedde2ffd9aa
|
4
|
+
data.tar.gz: 570bf5d0a00163dc68202f42f76d07a7f746f2a54d52c6309e95ca01094dfc7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c60b16002946f6e495eb72e2abe5230285e4b25b2ed6c5cc784cd26a28c02e70e97d4f66e6918b16b16273650add5c9047a0e2d1181e459e5b689cf142d3300f
|
7
|
+
data.tar.gz: 5c9f536213509c42325111551d35f3c9aa1e0891fde699ab358c0ee5f464e9e6a215659d62c98a0a6d967ee841d8f11e2ab59b128f7dc78437e6aa561bf8efa2
|
data/lib/four-pillars.rb
CHANGED
@@ -118,12 +118,17 @@ class FourPillarsLogic
|
|
118
118
|
# 生年月日時間, 性別(大運の向きに使用)
|
119
119
|
attr_reader :birth_dt, :gender
|
120
120
|
|
121
|
-
def initialize(birth_dt,gender)
|
122
|
-
@birth_dt = birth_dt.map {|v| v.to_i }
|
121
|
+
def initialize(birth_dt,gender,with_time:false)
|
122
|
+
@birth_dt = birth_dt.map {|v| v.nil? ? nil : v.to_i }
|
123
123
|
@gender = gender
|
124
|
+
@with_time = with_time
|
124
125
|
raise "Incorrect birth date: #{birth_dt}" if @birth_dt.count != 5
|
125
126
|
raise "Gender must be m,f or o(other): #{gender}" unless ['o','m','f'].include? @gender
|
126
127
|
raise "Year must be larger than 1863" if @birth_dt[0] < 1864
|
128
|
+
h = @birth_dt[3]
|
129
|
+
if !h.nil? && (h < 0 || h > 23)
|
130
|
+
raise "Invalid hour: #{birth_dt}"
|
131
|
+
end
|
127
132
|
end
|
128
133
|
|
129
134
|
# 生年月日と性別
|
@@ -137,7 +142,12 @@ class FourPillarsLogic
|
|
137
142
|
else
|
138
143
|
g = ""
|
139
144
|
end
|
140
|
-
|
145
|
+
if h.nil? || i.nil?
|
146
|
+
t = ""
|
147
|
+
else
|
148
|
+
t = "#{h}時#{i}分"
|
149
|
+
end
|
150
|
+
"#{y}年#{m}月#{d}日#{t}生 #{g}"
|
141
151
|
end
|
142
152
|
|
143
153
|
# 前月の日数
|
@@ -196,7 +206,8 @@ class FourPillarsLogic
|
|
196
206
|
setsuiri[0] == d
|
197
207
|
end
|
198
208
|
|
199
|
-
# 干支(日,月,年)
|
209
|
+
# 干支((時,)日,月,年)
|
210
|
+
# with_time=trueの時、時柱を含め長さ4の配列を返す
|
200
211
|
def kanshi
|
201
212
|
y,m,d,h,i = @birth_dt
|
202
213
|
sd, st = setsuiri
|
@@ -206,7 +217,17 @@ class FourPillarsLogic
|
|
206
217
|
md -= 1 if d < sd || (d == sd && h*60+i < st)
|
207
218
|
dd = Date.new(y,m,d) - Date.new(1863,12,31) # 1923.10.18 = 甲子
|
208
219
|
|
209
|
-
return [KANSHI_ARRAY[dd % 60],KANSHI_ARRAY[md % 60],KANSHI_ARRAY[yd % 60]]
|
220
|
+
return [KANSHI_ARRAY[dd % 60],KANSHI_ARRAY[md % 60],KANSHI_ARRAY[yd % 60]] unless @with_time
|
221
|
+
|
222
|
+
dp = KANSHI_ARRAY[dd % 60] # 日柱
|
223
|
+
if h.nil?
|
224
|
+
tp = nil
|
225
|
+
else
|
226
|
+
jyunishi_idx = h == 23 ? 0 : ((h + 1) / 2)
|
227
|
+
jikkan_idx = ((JIKKAN.index(dp[0]) % 5) * 2 + jyunishi_idx) % 10
|
228
|
+
tp = JIKKAN[jikkan_idx] + JYUNISHI[jyunishi_idx]
|
229
|
+
end
|
230
|
+
return [tp,dp,KANSHI_ARRAY[md % 60],KANSHI_ARRAY[yd % 60]]
|
210
231
|
end
|
211
232
|
|
212
233
|
# 干支(数字)
|
@@ -236,7 +257,7 @@ class FourPillarsLogic
|
|
236
257
|
zn = zokan_number
|
237
258
|
z = []
|
238
259
|
kanshi.each do |k|
|
239
|
-
j = k
|
260
|
+
j = k&.slice(1) # 十二支
|
240
261
|
if zokan_hash1.keys.include? j
|
241
262
|
z += [zokan_hash1[j]]
|
242
263
|
elsif zokan_hash2.keys.include? j
|
@@ -255,6 +276,8 @@ class FourPillarsLogic
|
|
255
276
|
else
|
256
277
|
z += [arr[4]]
|
257
278
|
end
|
279
|
+
else # j == nil
|
280
|
+
z += [nil]
|
258
281
|
end
|
259
282
|
end
|
260
283
|
return z
|
@@ -262,52 +285,103 @@ class FourPillarsLogic
|
|
262
285
|
|
263
286
|
# 通変星(nil,月,年)
|
264
287
|
def tsuhensei
|
265
|
-
|
266
|
-
|
267
|
-
[
|
288
|
+
o = @with_time ? 1 : 0
|
289
|
+
m = FourPillarsLogic::tsuhensei(kanshi[o][0],kanshi[o + 1][0])
|
290
|
+
y = FourPillarsLogic::tsuhensei(kanshi[o][0],kanshi[o + 2][0])
|
291
|
+
if @with_time
|
292
|
+
tk = kanshi[0]&.slice(0)
|
293
|
+
if tk.nil?
|
294
|
+
t = nil
|
295
|
+
else
|
296
|
+
t = FourPillarsLogic::tsuhensei(kanshi[o][0],tk)
|
297
|
+
end
|
298
|
+
[t,nil,m,y]
|
299
|
+
else
|
300
|
+
[nil,m,y]
|
301
|
+
end
|
268
302
|
end
|
269
303
|
|
270
304
|
# 蔵干通変星
|
271
305
|
def zokan_tsuhensei
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
306
|
+
if @with_time
|
307
|
+
j = JIKKAN.index(kanshi[1][0])
|
308
|
+
if j % 2 == 0 # 陽
|
309
|
+
jikkan = JIKKAN
|
310
|
+
else # 陰
|
311
|
+
jikkan = JIKKAN_IN
|
312
|
+
end
|
313
|
+
j = jikkan.index(kanshi[1][0])
|
314
|
+
j_time = jikkan.index(zokan[0])
|
315
|
+
j_day = jikkan.index(zokan[1])
|
316
|
+
j_month = jikkan.index(zokan[2])
|
317
|
+
j_year = jikkan.index(zokan[3])
|
318
|
+
if j_time.nil?
|
319
|
+
t_time = nil
|
320
|
+
else
|
321
|
+
t_time = j_time - j
|
322
|
+
t_time += 10 if t_time < 0
|
323
|
+
end
|
324
|
+
t_day = j_day - j
|
325
|
+
t_day += 10 if t_day < 0
|
326
|
+
t_month = j_month - j
|
327
|
+
t_month += 10 if t_month < 0
|
328
|
+
t_year = j_year - j
|
329
|
+
t_year += 10 if t_year < 0
|
330
|
+
[(t_time.nil? ? nil : TSUHENSEI[t_time]),TSUHENSEI[t_day],TSUHENSEI[t_month],TSUHENSEI[t_year]]
|
331
|
+
else
|
332
|
+
j = JIKKAN.index(kanshi[0][0])
|
333
|
+
if j % 2 == 0 # 陽
|
334
|
+
jikkan = JIKKAN
|
335
|
+
else # 陰
|
336
|
+
jikkan = JIKKAN_IN
|
337
|
+
end
|
338
|
+
j = jikkan.index(kanshi[0][0])
|
339
|
+
j_day = jikkan.index(zokan[0])
|
340
|
+
j_month = jikkan.index(zokan[1])
|
341
|
+
j_year = jikkan.index(zokan[2])
|
342
|
+
t_day = j_day - j
|
343
|
+
t_day += 10 if t_day < 0
|
344
|
+
t_month = j_month - j
|
345
|
+
t_month += 10 if t_month < 0
|
346
|
+
t_year = j_year - j
|
347
|
+
t_year += 10 if t_year < 0
|
348
|
+
[TSUHENSEI[t_day],TSUHENSEI[t_month],TSUHENSEI[t_year]]
|
277
349
|
end
|
278
|
-
j = jikkan.index(kanshi[0][0])
|
279
|
-
j_day = jikkan.index(zokan[0])
|
280
|
-
j_month = jikkan.index(zokan[1])
|
281
|
-
j_year = jikkan.index(zokan[2])
|
282
|
-
t_day = j_day - j
|
283
|
-
t_day += 10 if t_day < 0
|
284
|
-
t_month = j_month - j
|
285
|
-
t_month += 10 if t_month < 0
|
286
|
-
t_year = j_year - j
|
287
|
-
t_year += 10 if t_year < 0
|
288
|
-
[TSUHENSEI[t_day],TSUHENSEI[t_month],TSUHENSEI[t_year]]
|
289
350
|
end
|
290
351
|
|
291
352
|
# 十二運星
|
292
353
|
def jyuniunsei
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
[
|
354
|
+
o = @with_time ? 1 : 0
|
355
|
+
d = FourPillarsLogic::jyuniunsei(kanshi[o][0],kanshi[0 + o][1])
|
356
|
+
m = FourPillarsLogic::jyuniunsei(kanshi[o][0],kanshi[1 + o][1])
|
357
|
+
y = FourPillarsLogic::jyuniunsei(kanshi[o][0],kanshi[2 + o][1])
|
358
|
+
return [d,m,y] unless @with_time
|
359
|
+
if @birth_dt[3].nil? # when hour is nil
|
360
|
+
t = nil
|
361
|
+
else
|
362
|
+
t = FourPillarsLogic::jyuniunsei(kanshi[o][0],kanshi[0][1])
|
363
|
+
end
|
364
|
+
[t,d,m,y]
|
297
365
|
end
|
298
366
|
|
299
|
-
# 十二運星エネルギー
|
367
|
+
# 十二運星エネルギー 時中は使わない?
|
300
368
|
def jyuniunsei_energy
|
301
369
|
jyuniunsei.map {|v| JYUNIUNSEI_ENERGY[v] }
|
302
370
|
end
|
303
371
|
|
304
372
|
# 空亡 = 天中殺
|
305
373
|
def kuubou
|
306
|
-
|
307
|
-
|
374
|
+
o = @with_time ? 1 : 0
|
375
|
+
k_day = (kanshi_as_number[0 + o] - 1) / 10
|
376
|
+
k_year = (kanshi_as_number[2 + o] - 1) / 10
|
308
377
|
[KUUBOU[k_day],KUUBOU[k_year]]
|
309
378
|
end
|
310
379
|
|
380
|
+
# 日柱のインデックス 時柱を求める場合は1になる
|
381
|
+
def offset_for_day
|
382
|
+
@with_time ? 1 : 0
|
383
|
+
end
|
384
|
+
|
311
385
|
# テーブル表示用に配列にして返す (デバッグ用)
|
312
386
|
# 0:干支, 1:干支数字, 2:蔵干, 3:通変星, 4:蔵干通変星, 5:十二運星
|
313
387
|
# 五行、天中殺、十二運星エネルギーは別途
|
@@ -324,9 +398,14 @@ class FourPillarsLogic
|
|
324
398
|
# 五行(十干)
|
325
399
|
def gogyo_jikkan
|
326
400
|
arr = []
|
327
|
-
|
328
|
-
|
329
|
-
|
401
|
+
kanshi.length.times do |i|
|
402
|
+
k = kanshi[i]&.slice(0)
|
403
|
+
if k.nil?
|
404
|
+
arr += [nil]
|
405
|
+
else
|
406
|
+
j = JIKKAN.index(k)
|
407
|
+
arr += [(j % 2 == 0 ? "+" : "-") + GOGYO[j / 2]]
|
408
|
+
end
|
330
409
|
end
|
331
410
|
return arr
|
332
411
|
end
|
@@ -335,9 +414,14 @@ class FourPillarsLogic
|
|
335
414
|
def gogyo_jyunishi
|
336
415
|
arr = []
|
337
416
|
gogyo_j = ["水","土","木","木","土","火","火","土","金","金","土","水"]
|
338
|
-
|
339
|
-
|
340
|
-
|
417
|
+
kanshi.length.times do |i|
|
418
|
+
jj = kanshi[i]&.slice(1)
|
419
|
+
if jj.nil?
|
420
|
+
arr += [nil]
|
421
|
+
else
|
422
|
+
j = JYUNISHI.index(jj)
|
423
|
+
arr += [(j % 2 == 0 ? "+" : "-") + gogyo_j[j]]
|
424
|
+
end
|
341
425
|
end
|
342
426
|
return arr
|
343
427
|
end
|
@@ -345,8 +429,8 @@ class FourPillarsLogic
|
|
345
429
|
# 守護神
|
346
430
|
def shugoshin
|
347
431
|
# 日柱の十干と月柱の十二支
|
348
|
-
x = JIKKAN.index(kanshi[0][0])
|
349
|
-
y = JYUNISHI.index(kanshi[1][1])
|
432
|
+
x = JIKKAN.index(kanshi[0 + offset_for_day][0])
|
433
|
+
y = JYUNISHI.index(kanshi[1 + offset_for_day][1])
|
350
434
|
SHUGOSHIN[y][x].split("")
|
351
435
|
end
|
352
436
|
|
@@ -354,7 +438,9 @@ class FourPillarsLogic
|
|
354
438
|
def shukumei
|
355
439
|
s = []
|
356
440
|
t = kuubou # 天中殺 0:上段, 1:下段
|
357
|
-
|
441
|
+
ka = kanshi
|
442
|
+
ka.delete_at(0) if @with_time
|
443
|
+
k = ka.map {|v| v[1] } # 日,月,年柱の干支
|
358
444
|
if t[0].include? k[2]
|
359
445
|
s += ["生年中殺"]
|
360
446
|
end
|
@@ -372,10 +458,10 @@ class FourPillarsLogic
|
|
372
458
|
end
|
373
459
|
|
374
460
|
def equivalent_kanshi(only_jikkan=false)
|
461
|
+
k = kanshi
|
462
|
+
k.delete_at(0) if @with_time
|
375
463
|
if only_jikkan
|
376
|
-
k =
|
377
|
-
else
|
378
|
-
k = kanshi
|
464
|
+
k = k.map {|v| v[0] } # 日,月,年柱の十干
|
379
465
|
end
|
380
466
|
if k[0] == k[1] && k[1] == k[2]
|
381
467
|
return [[0,1],[0,2],[1,2]]
|
@@ -407,8 +493,8 @@ class FourPillarsLogic
|
|
407
493
|
v = []
|
408
494
|
eq = equivalent_kanshi(true)
|
409
495
|
eq.each do |e|
|
410
|
-
k0 = kanshi[e[0]][1]
|
411
|
-
k1 = kanshi[e[1]][1]
|
496
|
+
k0 = kanshi[e[0] + offset_for_day][1]
|
497
|
+
k1 = kanshi[e[1] + offset_for_day][1]
|
412
498
|
v += [e] if on_distance?(k0,k1,6)
|
413
499
|
end
|
414
500
|
return v
|
@@ -420,13 +506,13 @@ class FourPillarsLogic
|
|
420
506
|
v = []
|
421
507
|
eq = equivalent_kanshi(true)
|
422
508
|
eq.each do |e|
|
423
|
-
k0 = kanshi[e[0]][1]
|
424
|
-
k1 = kanshi[e[1]][1]
|
509
|
+
k0 = kanshi[e[0] + offset_for_day][1]
|
510
|
+
k1 = kanshi[e[1] + offset_for_day][1]
|
425
511
|
v += [e] if on_distance?(k0,k1,4)
|
426
512
|
end
|
427
513
|
eq.each do |e|
|
428
|
-
k0 = kanshi[e[0]][1]
|
429
|
-
k1 = kanshi[e[1]][1]
|
514
|
+
k0 = kanshi[e[0] + offset_for_day][1]
|
515
|
+
k1 = kanshi[e[1] + offset_for_day][1]
|
430
516
|
v += [e] if on_distance?(k0,k1,8)
|
431
517
|
end
|
432
518
|
return v
|
@@ -436,6 +522,7 @@ class FourPillarsLogic
|
|
436
522
|
def taiun
|
437
523
|
return [nil,nil] unless ['m','f'].include? @gender
|
438
524
|
k = gogyo_jikkan[2][0]
|
525
|
+
# TODO: 時刻不明の場合は?
|
439
526
|
t = @birth_dt[3] * 60 + @birth_dt[4] # 生まれた時間
|
440
527
|
if (@gender == 'm' && k == "+") || (@gender == 'f' && k == '-')
|
441
528
|
order = "順行"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: four-pillars
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yosei Ito
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A class which tells fortune by Four Pillar astrology(四柱推命).
|
14
14
|
email: y-itou@lumber-mill.co.jp
|
@@ -37,7 +37,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: '0'
|
39
39
|
requirements: []
|
40
|
-
rubygems_version: 3.
|
40
|
+
rubygems_version: 3.5.16
|
41
41
|
signing_key:
|
42
42
|
specification_version: 4
|
43
43
|
summary: Four Pillar astrology
|