ac-library-rb 0.5.0 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a727abb00ad78ee815885a24058313b8d5d2d74dca890a7f86acec05a1409c29
4
- data.tar.gz: 2cf27a5f5c961d3c66c42327820046ee282d461bab07fcc5d3137c1ef070667c
3
+ metadata.gz: 4f2e1122b67c3de38764556c098f3baca940daf337deae414b37ca57c0d23066
4
+ data.tar.gz: a5623bda479b49cd40885aa202b64c3075b292db06c3f0b2fea6ba2882e8e281
5
5
  SHA512:
6
- metadata.gz: 409b1168b103fcfb0addb14166550ea6558481e19cd614996952b0059f488a2244dfec992686039e8b84e573c24639a0722dcf1898988335b52896645b524af5
7
- data.tar.gz: 9ada51ba77c9101ca49a91a086b9204407ca526621e7a5621e797a16f1399e330aeb7ef9fdbb1ae2b8b5a1825f2bc06c6b82efe9367a961e97531d899ab6b6fe
6
+ metadata.gz: 5f38c20da10aa7b69cc140b8c79e7f3152271b77fe265f6ad8b93114a986b714b7b004cec5365477d6661192ed319da126868e8151ac00236633a5e5c6ac22a6
7
+ data.tar.gz: ed0b8ff7db0eff11fdf751acba9b111488d14babb845c747fb7856888d600b34e5f53208b6aa2fdbddb9ad1001996040dafb6a240498d59a5517fd6d8dfa0229
data/.rubocop.yml CHANGED
@@ -100,6 +100,9 @@ Naming/MethodName:
100
100
  - 'test/convolution_test.rb'
101
101
  Naming/MethodParameterName:
102
102
  Enabled: false
103
+ Naming/VariableNumber:
104
+ Exclude:
105
+ - 'test/max_flow_test.rb'
103
106
  Style/AndOr:
104
107
  Enabled: false
105
108
  Style/ArrayCoercion:
data/README.ja.md CHANGED
@@ -15,13 +15,88 @@ ACLの詳細は、以下をご覧ください.
15
15
 
16
16
  [ライブラリ目次: index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)
17
17
 
18
- `lib`ディレクトリにコードがあります。
18
+ 公式に、ac-library-rbの利用として、以下の方法を想定しています。
19
+ - 直接コピペして使う方法
20
+ - `lib`ディレクトリに、ac-library-rbのライブラリのコードがあります。
21
+ - `lib_lock`ディレクトリに、Gem用にモジュール化されたコードがあります。
22
+ (別途モジュール化するの、ちょっとトリッキーですが……)
23
+ - Gemとして使う方法(詳細は後述)
19
24
 
20
- 現状、この中から探してもらい、コピペして使って下さい。
25
+ 他に、有志作成のバンドルツール[expander-rb](https://github.com/surpace/expander-rb)(by surpaceさん)を利用する方法もあります。
21
26
 
22
- 目次(および進捗情報)は、[index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)をご覧ください。
27
+ 目次は、[index.md](https://github.com/universato/ac-library-rb/blob/master/document_ja/index.md)をご覧ください。
23
28
 
24
- また、コピペ以外の方法として、バンドルツール[expander-rb](https://github.com/surpace/expander-rb)(by surpaceさん)を利用する方法もあります。
29
+ ## Gemとなったac-library-rbを使う方法
30
+
31
+ コピペ以外にGemとなったac-library-rbを使う方法を紹介します。
32
+
33
+ ### gemのインストール方法
34
+
35
+ ac-library-rbに限った話ではないですが、一般的な2種類のgemのインストール方法を紹介します。
36
+
37
+ - Gemとして使う方法
38
+ - `gem`コマンドにより、`gem install ac-library-rb`
39
+ - gemのbundlerを用いる方法
40
+
41
+ #### gemコマンドによるインストール方法
42
+
43
+ Ruby本体に付属のgemコマンドを用い、そのまま`gem install ac-library-rb`を実行します。
44
+
45
+ #### gemのbundlerを用いたインストール方法
46
+
47
+ bundlerをインストールしてない場合は、`gem install bundler`というコマンドを打ちインストールします。
48
+
49
+ 次に、ac-library-rbを使いたいディレクトリ配下にGemfileを置きます。Gemfileという名称のファイルです。
50
+ このGemfileの中で、次のように書きます。
51
+ ```
52
+ gem "ac-library-rb"
53
+ ```
54
+ そして、`budnle install`というコマンドにより、Gemfileに書かれたac-library-rbをインストールします。
55
+
56
+ このとき、bundlerを通してRubyファイルを実行する必要があるため、`bundle exec`コマンドを用います。
57
+
58
+ `$ bundle exec ruby sample.rb`
59
+
60
+ ### (インストール後の)Rubyファイルでの書き方
61
+
62
+ #### 一括ロード
63
+
64
+ Rubyファイル上で一括でac-library-rbのライブラリを使えるようにするには、下記のように書きます。
65
+
66
+ ```ruby
67
+ require "ac-library-rb/all"
68
+
69
+ dsu = AcLibraryRb::DSU.new
70
+
71
+ include AcLibraryRb
72
+ dsu = DSU.new
73
+ ```
74
+
75
+ `include AcLibraryRb`とモジュールをインクルードすることで、
76
+ 何度も`AcLibraryRb`といわゆる名前空間を書く必要がなくなります。
77
+
78
+ また、`/all`なしで`require "ac-library-rb"`とした場合は、`include AcLibraryRb`も同時に実行されます。
79
+ ```ruby
80
+ require "ac-library-rb"
81
+
82
+ dsu = DSU.new
83
+ ```
84
+
85
+ #### 個別ロード
86
+
87
+ 特定のライブラリのみをインストールしたいときは下記のように`ac-library-rb/`のあとにライブラリ名を指定します。
88
+
89
+ ```ruby
90
+ require "ac-library-rb/dsu"
91
+ dsu = AcLibraryRb::DSU.new
92
+
93
+ require "ac-library-rb/priority_queue"
94
+ pq = AcLibraryRb::PriorityQueue.new
95
+ ```
96
+
97
+ 本gem名はハイフン区切りですが、ac-library-rb内のライブラリ名はアンダースコア区切りであるため、注意して下さい。
98
+ 一般的にRubyのライブラリ名はアンダースコアが推奨されていますが、
99
+ ACL本家のレポジトリ名がac-libraryとハイフン区切りで、それに合わせているため、レポジトリ名・gem名がハイフン区切りとなっています。
25
100
 
26
101
  ## Rubyバージョン
27
102
 
data/README.md CHANGED
@@ -25,6 +25,69 @@ Therefore, 2.7.1 is recommended and may not work with other versions.
25
25
 
26
26
  Please read [index.md](https://github.com/universato/ac-library-rb/blob/master/document_en/index.md).
27
27
 
28
+ ## How to use ac-library-rb as a Gem
29
+
30
+ We will show you how to use ac-library-rb as a gem.
31
+ ## How to install
32
+
33
+ This is not limited to ac-library-rb, but I will show you how to install the two common types of gem.
34
+
35
+ - By `gem` command, `gem install ac-library-rb`.
36
+ - By using the gem bundler's commands.
37
+
38
+ By #### gem command, `gem install ac-library-rb`
39
+
40
+ Execute `gem install ac-library-rb` by using the gem command included in Ruby itself.
41
+
42
+ #### How to use the gem bundler
43
+
44
+ If you have not installed bundler, type `gem install bundler` to install it.
45
+
46
+ Next, place Gemfile under the directory where you want to use ac-library-rb.
47
+
48
+ In this Gemfile, write:
49
+
50
+ ```ruby
51
+ gem "ac-library-rb".
52
+ ```
53
+
54
+ Then, install ac-library-rb by using the command `budnle install`.
55
+
56
+ At this point, we need to run the Ruby file through bundler, so we use the command `bundle exec`.
57
+
58
+ `$ bundle exec ruby sample.rb`.
59
+
60
+ ### How to write in Ruby files (after installation)
61
+
62
+ #### Bulk loading
63
+
64
+ To enable the ac-library-rb library to be used in bulk on Ruby files, write as follows.
65
+
66
+ ```ruby
67
+ require "ac-library-rb/all"
68
+
69
+ dsu = AcLibraryRb::DSU.new
70
+
71
+ include AcLibraryRb
72
+ dsu = DSU.new
73
+ ```
74
+
75
+ #### Individual loading
76
+
77
+ If you want to install only a specific library, specify the library name after `ac-library-rb/` as shown below.
78
+
79
+ ```ruby
80
+ require "ac-library-rb/dsu"
81
+ dsu = AcLibraryRb::DSU.new
82
+
83
+ require "ac-library-rb/priority_queue"
84
+ pq = AcLibraryRb::PriorityQueue.new
85
+ ```
86
+
87
+ Note that the gem names are separated by hyphens, but the library names in ac-library-rb are separated by underscores.
88
+ In general, underscores are recommended for Ruby library names.
89
+ However, the repository names in the original ACL are separated by a hyphen, ac-library, so ac-library-rb is also separated by a hyphen.
90
+
28
91
  ## Development
29
92
 
30
93
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -2,7 +2,8 @@ require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- require_relative "./bin/lock_lib.rb"
5
+ # require_relative "./bin/lock_lib.rb"
6
+ t.warning = false
6
7
  t.libs << "test"
7
8
  t.libs << "lib"
8
9
  t.test_files = FileList["test/**/*_test.rb"]
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = gem_description
14
14
  spec.homepage = "https://github.com/universato/ac-library-rb"
15
15
  spec.license = "CC0"
16
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
17
17
 
18
18
  spec.metadata["homepage_uri"] = spec.homepage
19
19
  spec.metadata["source_code_uri"] = "https://github.com/universato/ac-library-rb"
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  # Specify which files should be added to the gem when it is released.
25
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
28
  end
29
29
  spec.bindir = "exe"
data/bin/lock_lib.rb CHANGED
@@ -1,22 +1,24 @@
1
1
  require 'pathname'
2
2
 
3
3
  # copy libraries from `lib` to `lib_lock/ac-library` and add `module AcLibraryRb`
4
- lib_path = File.expand_path('../../lib/**', __FILE__)
5
- lock_dir = File.expand_path('../../lib_lock/ac-library-rb', __FILE__)
4
+ lib_path = File.expand_path('../lib/**', __dir__)
5
+ lock_dir = File.expand_path('../lib_lock/ac-library-rb', __dir__)
6
6
  Dir.glob(lib_path) do |file|
7
7
  next unless FileTest.file?(file)
8
8
 
9
9
  path = Pathname.new(lock_dir) + Pathname.new(file).basename
10
10
  File.open(path, "w") do |f|
11
+ library_code = File.readlines(file).map{ |line| line == "\n" ? "\n" : ' ' + line }
12
+
11
13
  f.puts "module AcLibraryRb"
12
- f.puts File.readlines(file).map{ |line| line == "\n" ? "\n" : ' ' + line }
14
+ f.puts library_code
13
15
  f.puts "end"
14
16
  end
15
17
  end
16
18
 
17
- # cope library from `lib/core_ext` to `lib_lock/ac-library-rb/core_ext`
18
- lib_path = File.expand_path('../../lib/core_ext/**', __FILE__)
19
- lock_dir = File.expand_path('../../lib_lock/ac-library-rb/core_ext', __FILE__)
19
+ # copy library from `lib/core_ext` to `lib_lock/ac-library-rb/core_ext`
20
+ lib_path = File.expand_path('../lib/core_ext/**', __dir__)
21
+ lock_dir = File.expand_path('../lib_lock/ac-library-rb/core_ext', __dir__)
20
22
  Dir.glob(lib_path) do |file|
21
23
  next unless FileTest.file?(file)
22
24
 
@@ -1,3 +1,3 @@
1
1
  module AcLibraryRb
2
- VERSION = "0.5.0".freeze
2
+ VERSION = "0.5.1".freeze
3
3
  end
data/lib/modint.rb CHANGED
@@ -161,7 +161,9 @@ class ModInt < Numeric
161
161
 
162
162
  def inv_internal(a)
163
163
  if $_mod_is_prime
164
- a != 0 ? a.pow($_mod - 2, $_mod) : raise(RangeError, 'no inverse')
164
+ raise(RangeError, 'no inverse') if a == 0
165
+
166
+ a.pow($_mod - 2, $_mod)
165
167
  else
166
168
  g, x = ModInt.inv_gcd(a, $_mod)
167
169
  g == 1 ? x : raise(RangeError, 'no inverse')
data/lib/suffix_array.rb CHANGED
@@ -76,9 +76,7 @@ def sa_is(s, upper)
76
76
  end_l = lms[lms_map[l] + 1] || n
77
77
  end_r = lms[lms_map[r] + 1] || n
78
78
  same = true
79
- if end_l - l != end_r - r
80
- same = false
81
- else
79
+ if end_l - l == end_r - r
82
80
  while l < end_l
83
81
  break if s[l] != s[r]
84
82
 
@@ -86,6 +84,8 @@ def sa_is(s, upper)
86
84
  r += 1
87
85
  end
88
86
  same = false if l == n || s[l] != s[r]
87
+ else
88
+ same = false
89
89
  end
90
90
  rec_upper += 1 if not same
91
91
  rec_s[lms_map[sorted_lms[i]]] = rec_upper
@@ -100,7 +100,11 @@ end
100
100
 
101
101
  # suffix array for array of integers or string
102
102
  def suffix_array(s, upper = nil)
103
- if not upper
103
+ if upper
104
+ s.each{ |s|
105
+ raise ArgumentError if s < 0 || upper < s
106
+ }
107
+ else
104
108
  case s
105
109
  when Array
106
110
  # compression
@@ -118,10 +122,6 @@ def suffix_array(s, upper = nil)
118
122
  upper = 255
119
123
  s = s.bytes
120
124
  end
121
- else
122
- s.each{ |s|
123
- raise ArgumentError if s < 0 || upper < s
124
- }
125
125
  end
126
126
 
127
127
  return sa_is(s, upper)
@@ -162,7 +162,9 @@ module AcLibraryRb
162
162
 
163
163
  def inv_internal(a)
164
164
  if $_mod_is_prime
165
- a != 0 ? a.pow($_mod - 2, $_mod) : raise(RangeError, 'no inverse')
165
+ raise(RangeError, 'no inverse') if a == 0
166
+
167
+ a.pow($_mod - 2, $_mod)
166
168
  else
167
169
  g, x = ModInt.inv_gcd(a, $_mod)
168
170
  g == 1 ? x : raise(RangeError, 'no inverse')
@@ -77,9 +77,7 @@ module AcLibraryRb
77
77
  end_l = lms[lms_map[l] + 1] || n
78
78
  end_r = lms[lms_map[r] + 1] || n
79
79
  same = true
80
- if end_l - l != end_r - r
81
- same = false
82
- else
80
+ if end_l - l == end_r - r
83
81
  while l < end_l
84
82
  break if s[l] != s[r]
85
83
 
@@ -87,6 +85,8 @@ module AcLibraryRb
87
85
  r += 1
88
86
  end
89
87
  same = false if l == n || s[l] != s[r]
88
+ else
89
+ same = false
90
90
  end
91
91
  rec_upper += 1 if not same
92
92
  rec_s[lms_map[sorted_lms[i]]] = rec_upper
@@ -101,7 +101,11 @@ module AcLibraryRb
101
101
 
102
102
  # suffix array for array of integers or string
103
103
  def suffix_array(s, upper = nil)
104
- if not upper
104
+ if upper
105
+ s.each{ |s|
106
+ raise ArgumentError if s < 0 || upper < s
107
+ }
108
+ else
105
109
  case s
106
110
  when Array
107
111
  # compression
@@ -119,10 +123,6 @@ module AcLibraryRb
119
123
  upper = 255
120
124
  s = s.bytes
121
125
  end
122
- else
123
- s.each{ |s|
124
- raise ArgumentError if s < 0 || upper < s
125
- }
126
126
  end
127
127
 
128
128
  return sa_is(s, upper)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ac-library-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - universato
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-16 00:00:00.000000000 Z
11
+ date: 2021-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -144,14 +144,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: 2.3.0
147
+ version: 2.5.0
148
148
  required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  requirements: []
154
- rubygems_version: 3.2.11
154
+ rubygems_version: 3.2.15
155
155
  signing_key:
156
156
  specification_version: 4
157
157
  summary: ac-library-rb is a ruby port of AtCoder Library (ACL).