qi 9.0.0 → 10.0.0.beta2
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/LICENSE.md +2 -2
- data/README.md +13 -18
- data/lib/kernel.rb +18 -0
- data/lib/qi/action.rb +33 -46
- data/lib/qi.rb +1 -47
- metadata +15 -156
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eac5eea8bb1218d4db55138e7d80a4dcba2feb9ebe300e78235df8e558879856
|
4
|
+
data.tar.gz: b81aece5af901f081d598a1e40a128ebff19dca023a61385a5b46de2648a4df6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4c7e2919813e59af6f4d45bde55bcb575512026a525a2994c3a62f21becbc85c5b95cecbd44a9de96cabc6c379dd92765fce6fad9c99cf21d98ef24aaa88df8
|
7
|
+
data.tar.gz: '0562650908ba50fd11cc086899170a69542b5d459bd49c9c4c3e189e028a33a25087dfb419d4df0e00d57e1058b7b832360d465e7ec89a86cb614013d1956ffb'
|
data/LICENSE.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
The MIT License
|
1
|
+
# The MIT License
|
2
2
|
|
3
|
-
Copyright (c) 2015-
|
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
|
[](https://github.com/sashite/qi.rb/actions?query=workflow%3Arubocop+branch%3Amain)
|
7
7
|
[](https://github.com/sashite/qi.rb/raw/main/LICENSE.md)
|
8
8
|
|
9
|
-
> `Qi` (
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
49
|
+
## About Sashité
|
55
50
|
|
56
|
-
This [gem](https://rubygems.org/gems/qi) is maintained by [
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
|
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
|
-
# @
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
56
|
-
|
33
|
+
[captures, squares.compact]
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def capture(item, *items)
|
39
|
+
[item] + items
|
40
|
+
end
|
57
41
|
|
58
|
-
|
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
|
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:
|
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:
|
12
|
-
dependencies:
|
13
|
-
|
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://
|
24
|
+
homepage: https://github.com/sashite/qi.rb
|
164
25
|
licenses:
|
165
26
|
- MIT
|
166
27
|
metadata:
|
167
|
-
|
168
|
-
|
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.
|
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:
|
42
|
+
version: 1.3.1
|
184
43
|
requirements: []
|
185
|
-
rubygems_version: 3.
|
186
|
-
signing_key:
|
44
|
+
rubygems_version: 3.4.1
|
45
|
+
signing_key:
|
187
46
|
specification_version: 4
|
188
|
-
summary:
|
47
|
+
summary: An abstraction that could help to update positions for games like Shogi.
|
189
48
|
test_files: []
|