qi 9.0.0 → 10.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +2 -2
  3. data/README.md +13 -18
  4. data/lib/kernel.rb +18 -0
  5. data/lib/qi/action.rb +33 -46
  6. data/lib/qi.rb +1 -47
  7. metadata +15 -156
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52024f72e11787560aa6fc8bed990c359e49d3e995f2d3cfea875de5febaeba5
4
- data.tar.gz: d04a6301684f284f29aa1b67c811ca596006a6aa0f33e22d1c67790da55418ef
3
+ metadata.gz: eac5eea8bb1218d4db55138e7d80a4dcba2feb9ebe300e78235df8e558879856
4
+ data.tar.gz: b81aece5af901f081d598a1e40a128ebff19dca023a61385a5b46de2648a4df6
5
5
  SHA512:
6
- metadata.gz: e9afd43466c2ea7b6608d0f94996bffd40622fa2ff98bc008098c78375074c4ae8c6e12235520053a35619fca22b3588ccc120d06910f9b8af10cf349273af6c
7
- data.tar.gz: 4264fd4ff0e12bc86b1451b1a411bea1e700cb58581f87e0216a0b601bd26c2443e144c44ddb765e8e6428ae0bdc2f406342248851a5c36c9f9c00494c8c1253
6
+ metadata.gz: e4c7e2919813e59af6f4d45bde55bcb575512026a525a2994c3a62f21becbc85c5b95cecbd44a9de96cabc6c379dd92765fce6fad9c99cf21d98ef24aaa88df8
7
+ data.tar.gz: '0562650908ba50fd11cc086899170a69542b5d459bd49c9c4c3e189e028a33a25087dfb419d4df0e00d57e1058b7b832360d465e7ec89a86cb614013d1956ffb'
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
- The MIT License (MIT)
1
+ # The MIT License
2
2
 
3
- Copyright (c) 2015-2021 Sashite
3
+ Copyright (c) 2015-2023 Sashité
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -6,26 +6,26 @@
6
6
  [![RuboCop](https://github.com/sashite/qi.rb/workflows/RuboCop/badge.svg?branch=main)](https://github.com/sashite/qi.rb/actions?query=workflow%3Arubocop+branch%3Amain)
7
7
  [![License](https://img.shields.io/github/license/sashite/qi.rb?label=License&logo=github)](https://github.com/sashite/qi.rb/raw/main/LICENSE.md)
8
8
 
9
- > `Qi` () is an abstraction for updating positions of chess variants (including Chess, Janggi, Markruk, Shogi, Xiangqi), with a move.
9
+ > `Qi` (Chinese: 棋; pinyin: _qí_) is an abstraction that could help to update positions for games like Shogi.
10
10
 
11
11
  ## Installation
12
12
 
13
13
  Add this line to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
- gem "qi"
16
+ gem "qi", ">= 10.0.0.beta2"
17
17
  ```
18
18
 
19
19
  And then execute:
20
20
 
21
21
  ```sh
22
- bundle
22
+ bundle install
23
23
  ```
24
24
 
25
25
  Or install it yourself as:
26
26
 
27
27
  ```sh
28
- gem install qi
28
+ gem install qi --pre
29
29
  ```
30
30
 
31
31
  ## Example
@@ -33,26 +33,21 @@ gem install qi
33
33
  ```ruby
34
34
  require "qi"
35
35
 
36
- Qi.call(
37
- 43, 13, "+B",
38
- 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],
39
- square: {
40
- 3 => "s",
41
- 4 => "k",
42
- 5 => "s",
43
- 22 => "+P",
44
- 43 => "+B"
45
- }
46
- )
47
- # => {: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"}}
36
+ captures = %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]
37
+ squares = { "3": "s", "4": "k", "5": "s", "22": "+P", "43": "+B" }
38
+
39
+ captures, squares = Qi(*captures, **squares).call("43": nil, "13": "+B")
40
+
41
+ captures # => ["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"]
42
+ squares # => {:"3"=>"s", :"4"=>"k", :"5"=>"s", :"22"=>"+P", :"13"=>"+B"}
48
43
  ```
49
44
 
50
45
  ## License
51
46
 
52
47
  The code is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
53
48
 
54
- ## About Sashite
49
+ ## About Sashité
55
50
 
56
- This [gem](https://rubygems.org/gems/qi) is maintained by [Sashite](https://sashite.com/).
51
+ This [gem](https://rubygems.org/gems/qi) is maintained by [Sashité](https://sashite.com/).
57
52
 
58
53
  With some [lines of code](https://github.com/sashite/), let's share the beauty of Chinese, Japanese and Western cultures through the game of chess!
data/lib/kernel.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ # shareable_constant_value: none
3
+
4
+ # warn_indent: true
5
+
6
+ require_relative File.join("qi", "action")
7
+
8
+ # The Kernel module.
9
+ module Kernel
10
+ # Abstraction to build positions.
11
+ #
12
+ # @return [Array] An action to change the position.
13
+ #
14
+ # @api public
15
+ def Qi(*captures, **squares)
16
+ ::Qi::Action.new(*captures, **squares)
17
+ end
18
+ end
data/lib/qi/action.rb CHANGED
@@ -3,59 +3,46 @@
3
3
  module Qi
4
4
  # The Action abstraction.
5
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
6
+ CAPTURE_CHAR = "&"
7
+ DROP_CHAR = "*"
8
+
9
+ # Action initializer.
10
+ def initialize(*captures, **squares)
11
+ @captures = captures
12
+ @squares = squares
22
13
  end
23
14
 
24
15
  # Commit an action to the position.
25
16
  #
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)
17
+ # @return [Array] An action to change the position.
18
+ def call(**diffs)
19
+ captures = @captures
20
+ squares = @squares
21
+
22
+ diffs.each do |k, v|
23
+ case String(k)
24
+ when CAPTURE_CHAR
25
+ captures = capture(v, *captures)
26
+ when DROP_CHAR
27
+ captures = drop(v, *captures)
28
+ else
29
+ squares = squares.merge(k => v)
30
+ end
53
31
  end
54
32
 
55
- square[@dst_square_id] = @moved_piece_name
56
- in_hand.push(@captured_piece_name) unless @captured_piece_name.nil?
33
+ [captures, squares.compact]
34
+ end
35
+
36
+ private
37
+
38
+ def capture(item, *items)
39
+ [item] + items
40
+ end
57
41
 
58
- { in_hand: in_hand, square: square }
42
+ def drop(item, *items)
43
+ item_id = items.index(item) || raise(::IndexError, "Piece #{item.inspect} not found!")
44
+ items.delete_at(item_id)
45
+ items
59
46
  end
60
47
  end
61
48
  end
data/lib/qi.rb CHANGED
@@ -1,53 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative File.join("qi", "action")
3
+ require_relative "kernel"
4
4
 
5
5
  # The Qi abstraction.
6
- #
7
- # @example Apply a move to a classic Shogi problem
8
- # Qi.call(
9
- # 43, 13, "+B",
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: {
12
- # 3 => "s",
13
- # 4 => "k",
14
- # 5 => "s",
15
- # 22 => "+P",
16
- # 43 => "+B"
17
- # }
18
- # )
19
- # # => {: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"}}
20
6
  module Qi
21
- # Apply an action to the position.
22
- #
23
- # @param src_square_id [Integer] A source square index.
24
- # @param dst_square_id [Integer] A target square index.
25
- # @param moved_piece_name [String] A piece name.
26
- # @param captured_piece_name [String] A captured piece name.
27
- # @param in_hand [Array] The list of pieces in hand.
28
- # @param square [Hash] The index of each piece on the board.
29
- #
30
- # @see https://developer.sashite.com/specs/portable-chess-notation
31
- # @see https://developer.sashite.com/specs/portable-move-notation
32
- #
33
- # @example Apply a move to a classic Shogi problem
34
- # call(
35
- # 43,
36
- # 13,
37
- # "+B",
38
- # 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],
39
- # square: {
40
- # 3 => "s",
41
- # 4 => "k",
42
- # 5 => "s",
43
- # 22 => "+P",
44
- # 43 => "+B"
45
- # }
46
- # )
47
- # # => {: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"}}
48
- #
49
- # @return [Hash] The piece set of the next position.
50
- def self.call(src_square_id, dst_square_id, moved_piece_name, captured_piece_name = nil, in_hand:, square:)
51
- Action.new(src_square_id, dst_square_id, moved_piece_name, captured_piece_name).call(in_hand: in_hand, square: square)
52
- end
53
7
  end
metadata CHANGED
@@ -1,156 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qi
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.0.0
4
+ version: 10.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-26 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: brutal
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: byebug
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rubocop-md
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop-performance
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-thread_safety
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: yard
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- description: Instantiate PCN's positions and apply PMN's moves.
11
+ date: 2023-02-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: An abstraction that could help to update positions for games like Shogi.
154
14
  email: contact@cyril.email
155
15
  executables: []
156
16
  extensions: []
@@ -158,16 +18,15 @@ extra_rdoc_files: []
158
18
  files:
159
19
  - LICENSE.md
160
20
  - README.md
21
+ - lib/kernel.rb
161
22
  - lib/qi.rb
162
23
  - lib/qi/action.rb
163
- homepage: https://developer.sashite.com/specs/
24
+ homepage: https://github.com/sashite/qi.rb
164
25
  licenses:
165
26
  - MIT
166
27
  metadata:
167
- bug_tracker_uri: https://github.com/sashite/qi.rb/issues
168
- documentation_uri: https://rubydoc.info/gems/qi/index
169
- source_code_uri: https://github.com/sashite/qi.rb
170
- post_install_message:
28
+ rubygems_mfa_required: 'true'
29
+ post_install_message:
171
30
  rdoc_options: []
172
31
  require_paths:
173
32
  - lib
@@ -175,15 +34,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
34
  requirements:
176
35
  - - ">="
177
36
  - !ruby/object:Gem::Version
178
- version: 3.0.0
37
+ version: 3.2.0
179
38
  required_rubygems_version: !ruby/object:Gem::Requirement
180
39
  requirements:
181
- - - ">="
40
+ - - ">"
182
41
  - !ruby/object:Gem::Version
183
- version: '0'
42
+ version: 1.3.1
184
43
  requirements: []
185
- rubygems_version: 3.2.22
186
- signing_key:
44
+ rubygems_version: 3.4.1
45
+ signing_key:
187
46
  specification_version: 4
188
- summary: Update positions with a move.
47
+ summary: An abstraction that could help to update positions for games like Shogi.
189
48
  test_files: []