qi 8.0.0 → 9.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/qi.rb +11 -31
  4. data/lib/qi/action.rb +61 -0
  5. data/lib/qi/move.rb +46 -0
  6. metadata +6 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb79c3951884c03bb69f5b570c776e6154181b2e9c780a568faeb37b079b749e
4
- data.tar.gz: 180ff6505865b89be300c3f3fbdc99d1f945d49f2469e73c6c3b28ad2cedd3f0
3
+ metadata.gz: 80f30262bee5c02c0df18d00b03848331e9bc673980e88c1c1949f0ac6915ff7
4
+ data.tar.gz: eca221290986aef674784c4c2f840f8485ea89d7deb5b19075df883e05cf574a
5
5
  SHA512:
6
- metadata.gz: 6e1281cc8424faee3b9be0be0842b816aa824595e3f9e62e54c0bb0949dcf1671ce942bfb47bf5ffcb78abdff03dd11de723b3dba58256570b33b83fad6545a9
7
- data.tar.gz: e3b0c8103baa427ff22f770c6afc70eef6c5251fee580864c23129c264ea5534528dd365099fa9f5e4bf2b9f5d8d4762094e6bf771bab2acde4eeeeee795d680
6
+ metadata.gz: 5945e941761301f153d6db897b710d9548e6c3a514f1edc61222773e9cbee15f4d28e5abf7d4b85f072b2fc3dc866d07489c6e8d42aabb3c7bc38be788b70092
7
+ data.tar.gz: fd96cf0829d263a9374e52992c61a2b97815f3c6431bee0373080dbdde85c1d0a62eb9e414e950d0bc9ee49ff5d44594f3286ae9996aec8f2a6725dcb0a9fbcb
data/README.md CHANGED
@@ -30,8 +30,8 @@ require "qi"
30
30
 
31
31
  Qi.call(
32
32
  [43, 13, "+B"],
33
- *%w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
34
- **{
33
+ in_hand: %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
34
+ square: {
35
35
  3 => "s",
36
36
  4 => "k",
37
37
  5 => "s",
data/lib/qi.rb CHANGED
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative File.join("qi", "move")
4
+
3
5
  # The Qi abstraction.
4
6
  #
5
- # @example
7
+ # @example Apply a move to a classic Shogi problem
6
8
  # Qi.call(
7
9
  # [43, 13, "+B"],
8
- # "in_hand": %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
9
- # "square": {
10
+ # in_hand: %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
11
+ # square: {
10
12
  # 3 => "s",
11
13
  # 4 => "k",
12
14
  # 5 => "s",
@@ -25,11 +27,11 @@ module Qi
25
27
  # @see https://developer.sashite.com/specs/portable-chess-notation
26
28
  # @see https://developer.sashite.com/specs/portable-move-notation
27
29
  #
28
- # @example A classic Shogi problem
30
+ # @example Apply a move to a classic Shogi problem
29
31
  # call(
30
32
  # [43, 13, "+B"],
31
- # *%w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
32
- # **{
33
+ # in_hand: %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
34
+ # square: {
33
35
  # 3 => "s",
34
36
  # 4 => "k",
35
37
  # 5 => "s",
@@ -39,30 +41,8 @@ module Qi
39
41
  # )
40
42
  # # => {:in_hand=>["S", "r", "r", "b", "g", "g", "g", "g", "s", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p"], :square=>{3=>"s", 4=>"k", 5=>"s", 22=>"+P", 13=>"+B"}}
41
43
  #
42
- # @return [Hash] The next position.
43
- def self.call(move, *in_hand, **square)
44
- actions = move.each_slice(4)
45
-
46
- actions.each do |action|
47
- src_square_id = action.fetch(0)
48
- dst_square_id = action.fetch(1)
49
- moved_piece_name = action.fetch(2)
50
- captured_piece_name = action.fetch(3, nil)
51
-
52
- if src_square_id.nil?
53
- piece_in_hand_id = in_hand.index(moved_piece_name)
54
- in_hand.delete_at(piece_in_hand_id) unless piece_in_hand_id.nil?
55
- else
56
- square.delete(src_square_id)
57
- end
58
-
59
- square[dst_square_id] = moved_piece_name
60
- in_hand.push(captured_piece_name) unless captured_piece_name.nil?
61
- end
62
-
63
- {
64
- in_hand: in_hand,
65
- square: square
66
- }
44
+ # @return [Hash] The piece set of the next position.
45
+ def self.call(move, in_hand:, square:)
46
+ Move.new(move).call(in_hand: in_hand, square: square)
67
47
  end
68
48
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qi
4
+ # The Action abstraction.
5
+ class Action
6
+ # Initialize an action instance.
7
+ #
8
+ # @param src_square_id [Integer, nil] The source square ID.
9
+ # @param dst_square_id [Integer] The target square ID.
10
+ # @param moved_piece_name [String] The moved piece name.
11
+ # @param captured_piece_name [String, nil] The captured piece name.
12
+ #
13
+ # @example Initialize a promoted bishop action from 43 to 13
14
+ # new(43, 13, "+B", nil)
15
+ #
16
+ # @see https://developer.sashite.com/specs/portable-action-notation
17
+ def initialize(src_square_id, dst_square_id, moved_piece_name, captured_piece_name = nil)
18
+ @src_square_id = src_square_id
19
+ @dst_square_id = dst_square_id
20
+ @moved_piece_name = moved_piece_name
21
+ @captured_piece_name = captured_piece_name
22
+ end
23
+
24
+ # Commit an action to the position.
25
+ #
26
+ # @param in_hand [Array] The list of pieces in hand.
27
+ # @param square [Hash] The index of each piece on the board.
28
+ #
29
+ # @example Commit a Shogi action to the piece set of a position
30
+ # call(
31
+ # 43, 13, "+B", nil,
32
+ # in_hand: %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
33
+ # square: {
34
+ # 3 => "s",
35
+ # 4 => "k",
36
+ # 5 => "s",
37
+ # 22 => "+P",
38
+ # 43 => "+B"
39
+ # }
40
+ # )
41
+ # # => {:in_hand=>["S", "r", "r", "b", "g", "g", "g", "g", "s", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p"], :square=>{3=>"s", 4=>"k", 5=>"s", 22=>"+P", 13=>"+B"}}
42
+ #
43
+ # @return [Hash] The next piece set.
44
+ def call(in_hand:, square:)
45
+ in_hand = in_hand.dup
46
+ square = square.dup
47
+
48
+ if @src_square_id.nil?
49
+ piece_in_hand_id = in_hand.index(@moved_piece_name)
50
+ in_hand.delete_at(piece_in_hand_id) unless piece_in_hand_id.nil?
51
+ else
52
+ square.delete(@src_square_id)
53
+ end
54
+
55
+ square[@dst_square_id] = @moved_piece_name
56
+ in_hand.push(@captured_piece_name) unless @captured_piece_name.nil?
57
+
58
+ { in_hand: in_hand, square: square }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "action"
4
+
5
+ module Qi
6
+ # The Move abstraction.
7
+ class Move
8
+ # Initialize a move instance.
9
+ #
10
+ # @param move [Array] The move to apply.
11
+ #
12
+ # @example Initialize a promoted bishop move from 43 to 13
13
+ # new([43, 13, "+B"])
14
+ #
15
+ # @see https://developer.sashite.com/specs/portable-move-notation
16
+ def initialize(move)
17
+ @actions = move.each_slice(4)
18
+ end
19
+
20
+ # Apply a move to the piece set of a position.
21
+ #
22
+ # @param in_hand [Array] The list of pieces in hand.
23
+ # @param square [Hash] The index of each piece on the board.
24
+ #
25
+ # @example Apply a move to a classic Shogi problem
26
+ # call(
27
+ # [43, 13, "+B"],
28
+ # in_hand: %w[S r r b g g g g s n n n n p p p p p p p p p p p p p p p p p],
29
+ # square: {
30
+ # 3 => "s",
31
+ # 4 => "k",
32
+ # 5 => "s",
33
+ # 22 => "+P",
34
+ # 43 => "+B"
35
+ # }
36
+ # )
37
+ # # => {:in_hand=>["S", "r", "r", "b", "g", "g", "g", "g", "s", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p"], :square=>{3=>"s", 4=>"k", 5=>"s", 22=>"+P", 13=>"+B"}}
38
+ #
39
+ # @return [Hash] The piece set of the next position.
40
+ def call(in_hand:, square:)
41
+ @actions.inject(in_hand: in_hand, square: square) do |piece_set, attrs|
42
+ Action.new(*attrs).call(**piece_set)
43
+ end
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qi
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0
4
+ version: 9.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-02 00:00:00.000000000 Z
11
+ date: 2020-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: brutal
@@ -117,6 +117,8 @@ files:
117
117
  - LICENSE.md
118
118
  - README.md
119
119
  - lib/qi.rb
120
+ - lib/qi/action.rb
121
+ - lib/qi/move.rb
120
122
  homepage: https://developer.sashite.com/specs/
121
123
  licenses:
122
124
  - MIT
@@ -135,9 +137,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
137
  version: 2.7.0
136
138
  required_rubygems_version: !ruby/object:Gem::Requirement
137
139
  requirements:
138
- - - ">="
140
+ - - ">"
139
141
  - !ruby/object:Gem::Version
140
- version: '0'
142
+ version: 1.3.1
141
143
  requirements: []
142
144
  rubygems_version: 3.1.2
143
145
  signing_key: