i_ching 0.1.1 → 0.1.2
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/i_ching.rb +14 -1
- data/lib/i_ching/cast_hexagram.rb +58 -0
- data/lib/i_ching/caster.rb +24 -0
- data/lib/i_ching/casters/base.rb +17 -0
- data/lib/i_ching/casters/coins.rb +12 -0
- data/lib/i_ching/casters/random.rb +12 -0
- data/lib/i_ching/casters/yarrow.rb +82 -0
- data/lib/i_ching/has_attributes.rb +10 -0
- data/lib/i_ching/hexagram.rb +8 -0
- data/lib/i_ching/line.rb +4 -4
- data/lib/i_ching/trigram.rb +4 -0
- data/lib/i_ching/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 659be3dc9e13bf0554d94913f7a5dc605aff503a
|
4
|
+
data.tar.gz: ae844f40d018e5d1b16fef8481ee6a4ae98e2598
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d055ff4d53c1223b1213525e56f5b2871655937872941bf285e5f0094701d3d05167786adc039288569a76e4cbcb5e618fb4e8028bb6013cd1c2a77ec90efc72
|
7
|
+
data.tar.gz: 2f7456e3983607f35a4fc6de8711db9ca5cc3e0d5cdf8f0229b26582b98a9518856ac43e8fc46542a1fa02f588880176fd06b36cea29ac78dfcab75d2b0d332d
|
data/lib/i_ching.rb
CHANGED
@@ -1,13 +1,26 @@
|
|
1
1
|
require "sequel"
|
2
|
+
require "json"
|
2
3
|
|
3
4
|
require "i_ching/has_attributes"
|
5
|
+
require "i_ching/cast_hexagram"
|
6
|
+
require "i_ching/caster"
|
7
|
+
require "i_ching/casters/base"
|
8
|
+
require "i_ching/casters/coins"
|
9
|
+
require "i_ching/casters/random"
|
10
|
+
require "i_ching/casters/yarrow"
|
4
11
|
require "i_ching/hexagram"
|
5
12
|
require "i_ching/line"
|
6
13
|
require "i_ching/trigram"
|
7
14
|
require "i_ching/version"
|
8
15
|
|
9
16
|
module IChing
|
10
|
-
|
17
|
+
extend self
|
18
|
+
|
19
|
+
def cast_hexagram(method=:yarrow)
|
20
|
+
caster = IChing::Caster.with_method(method)
|
21
|
+
caster.cast_hexagram
|
22
|
+
end
|
23
|
+
|
11
24
|
module DB
|
12
25
|
extend self
|
13
26
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module IChing
|
2
|
+
class CastHexagram
|
3
|
+
class InvalidCast < ArgumentError; end
|
4
|
+
|
5
|
+
CHANGES = {
|
6
|
+
6 => 7,
|
7
|
+
9 => 8
|
8
|
+
}
|
9
|
+
|
10
|
+
STABILIZATIONS = {
|
11
|
+
6 => 8,
|
12
|
+
9 => 7
|
13
|
+
}
|
14
|
+
|
15
|
+
BINARY = {
|
16
|
+
7 => 1,
|
17
|
+
8 => 0
|
18
|
+
}
|
19
|
+
|
20
|
+
attr_reader :lines
|
21
|
+
|
22
|
+
def initialize(*lines)
|
23
|
+
@lines = lines
|
24
|
+
validate
|
25
|
+
end
|
26
|
+
|
27
|
+
def change
|
28
|
+
CastHexagram.new(*process(CHANGES))
|
29
|
+
end
|
30
|
+
|
31
|
+
def stabilize
|
32
|
+
CastHexagram.new(*process(STABILIZATIONS))
|
33
|
+
end
|
34
|
+
|
35
|
+
def binary
|
36
|
+
stabilize.lines.map { |line| BINARY[line] }.join("").to_i(2)
|
37
|
+
end
|
38
|
+
|
39
|
+
def hexagram
|
40
|
+
Hexagram.get_by_binary(self.binary)
|
41
|
+
end
|
42
|
+
|
43
|
+
def changed_hexagram
|
44
|
+
change.hexagram
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def process(conversion_hash)
|
50
|
+
lines.map { |line| conversion_hash.fetch(line, line) }
|
51
|
+
end
|
52
|
+
|
53
|
+
def validate
|
54
|
+
raise InvalidCast unless @lines.count == 6
|
55
|
+
raise InvalidCast unless @lines.all? { |line| line.between?(6, 9) }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module IChing
|
2
|
+
module Caster
|
3
|
+
extend self
|
4
|
+
class InvalidCaster < Exception
|
5
|
+
end
|
6
|
+
|
7
|
+
def with_method(method)
|
8
|
+
if casting_method = available_casting_method(method)
|
9
|
+
casting_method.new
|
10
|
+
else
|
11
|
+
raise InvalidCaster
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def available_casting_method(method)
|
16
|
+
case method.to_sym
|
17
|
+
when :yarrow then IChing::Casters::Yarrow
|
18
|
+
when :coins then IChing::Casters::Coins
|
19
|
+
when :random then IChing::Casters::Random
|
20
|
+
else nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module IChing
|
2
|
+
module Casters
|
3
|
+
class Base
|
4
|
+
def cast_hexagram
|
5
|
+
CastHexagram.new(*generate_lines)
|
6
|
+
end
|
7
|
+
|
8
|
+
def generate_lines
|
9
|
+
6.times.map { generate_line }
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate_line
|
13
|
+
raise NotImplementedError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module IChing
|
2
|
+
module Casters
|
3
|
+
class Yarrow < Base
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def generate_line
|
8
|
+
@remainder_sets = []
|
9
|
+
@stalks = 50
|
10
|
+
@remainder = 0
|
11
|
+
|
12
|
+
put_single_stalk_aside
|
13
|
+
|
14
|
+
3.times do
|
15
|
+
divide_stalks
|
16
|
+
take_one_stalk_from_right_hand_pile
|
17
|
+
take_least_mod_four_from_left
|
18
|
+
take_least_mod_four_from_right
|
19
|
+
set_remainder_aside
|
20
|
+
|
21
|
+
reset_stalks
|
22
|
+
end
|
23
|
+
|
24
|
+
convert_remainders_to_line
|
25
|
+
end
|
26
|
+
|
27
|
+
def put_single_stalk_aside
|
28
|
+
@stalks -= 1
|
29
|
+
end
|
30
|
+
|
31
|
+
def divide_stalks
|
32
|
+
@left = (@stalks / 2) + (rand(20) - 10)
|
33
|
+
@right = @stalks - @left
|
34
|
+
end
|
35
|
+
|
36
|
+
def take_one_stalk_from_right_hand_pile
|
37
|
+
@remainder += 1
|
38
|
+
@right -= 1
|
39
|
+
end
|
40
|
+
|
41
|
+
def take_least_mod_four_from_left
|
42
|
+
r = @left % 4
|
43
|
+
r = case r
|
44
|
+
when 0 then 4
|
45
|
+
else r
|
46
|
+
end
|
47
|
+
@left -= r
|
48
|
+
@remainder += r
|
49
|
+
end
|
50
|
+
|
51
|
+
def take_least_mod_four_from_right
|
52
|
+
r = @right % 4
|
53
|
+
r = case r
|
54
|
+
when 0 then 4
|
55
|
+
else r
|
56
|
+
end
|
57
|
+
@right -= r
|
58
|
+
@remainder += r
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_remainder_aside
|
62
|
+
@remainder_sets << @remainder
|
63
|
+
end
|
64
|
+
|
65
|
+
def reset_stalks
|
66
|
+
@remainder = 0
|
67
|
+
@stalks = @left + @right
|
68
|
+
@left = 0
|
69
|
+
@right = 0
|
70
|
+
end
|
71
|
+
|
72
|
+
def convert_remainders_to_line
|
73
|
+
@remainder_sets.map do |r|
|
74
|
+
case r
|
75
|
+
when 8, 9 then 2
|
76
|
+
when 4, 5 then 3
|
77
|
+
end
|
78
|
+
end.inject(0) { |t, n| t + n }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/i_ching/hexagram.rb
CHANGED
data/lib/i_ching/line.rb
CHANGED
@@ -4,14 +4,14 @@ module IChing
|
|
4
4
|
has_attributes :king_wen_number, :place, :meaning
|
5
5
|
|
6
6
|
class << self
|
7
|
-
def get(king_wen_number, place)
|
8
|
-
new(table[king_wen_number: king_wen_number, place: place])
|
9
|
-
end
|
10
|
-
|
11
7
|
def all(king_wen_number)
|
12
8
|
table.where(king_wen_number: king_wen_number).order(:place).map { |line| new(line) }
|
13
9
|
end
|
14
10
|
|
11
|
+
def get(king_wen_number, place)
|
12
|
+
new(table[king_wen_number: king_wen_number, place: place])
|
13
|
+
end
|
14
|
+
|
15
15
|
private
|
16
16
|
|
17
17
|
def table
|
data/lib/i_ching/trigram.rb
CHANGED
data/lib/i_ching/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i_ching
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Berkowitz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -84,6 +84,12 @@ files:
|
|
84
84
|
- i_ching.gemspec
|
85
85
|
- lib/i_ching.db
|
86
86
|
- lib/i_ching.rb
|
87
|
+
- lib/i_ching/cast_hexagram.rb
|
88
|
+
- lib/i_ching/caster.rb
|
89
|
+
- lib/i_ching/casters/base.rb
|
90
|
+
- lib/i_ching/casters/coins.rb
|
91
|
+
- lib/i_ching/casters/random.rb
|
92
|
+
- lib/i_ching/casters/yarrow.rb
|
87
93
|
- lib/i_ching/has_attributes.rb
|
88
94
|
- lib/i_ching/hexagram.rb
|
89
95
|
- lib/i_ching/line.rb
|