huffman_coding 0.0.1 → 1.0.0

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: 8866a9b9cab08920b83a3b7fd9d08ff56fe6309ba5501cd883976ffe86c5a197
4
- data.tar.gz: 385067bbe91d56e78b5bc278b385219a6bd5b177e0cea057795c05a865c97cf7
3
+ metadata.gz: 47e30f42beb607e9a5e7bdd29d4cd838b7ecf4fc927b52b3f2496ac668043092
4
+ data.tar.gz: 257a61ddd2d6ae5f1886e03ce83b06a09d080e88d25bc5d857544a000c74d4f9
5
5
  SHA512:
6
- metadata.gz: 3cef3df9bc0968df39db9c799eda45f93035e3648672978d0d95779009bc59950ddd9230100d6b53378973fc1a0117a54589e2586f6caa02c7ef87a2aea76371
7
- data.tar.gz: 9029091c62d577ab3c3b5b75cb20ce5aa2cb68fb21a8c228f3245a13ab50a395dc61cbc9133238ef88f24d052ea912be6e9ea7e51ea30bd1fc1d3f05115f3b35
6
+ metadata.gz: 061ebc1c0ad93f774fb2ba5d0e73afa056e0d82b8472b8b95c41e63af637ee4bdd009ddbe338270aa7270ed1c5cc3accc72434e5ab1520355f5b53d4c96db4a1
7
+ data.tar.gz: b76ec5e35b2e13f8ff03c7f6c3acee02e6df6ed7077381a78cec8a7381c5bc869c4b5f6073976d4ebdf765149045f97dab1d85a85bb2dbdd46de19f2310fbefb
data/.gitignore CHANGED
File without changes
data/.rubocop.yml CHANGED
File without changes
data/.travis.yml CHANGED
File without changes
data/CHANGELOG.md CHANGED
@@ -1 +1,4 @@
1
- ## Change Log
1
+ ## Change Log
2
+
3
+ ### v0.0.1 2020/05/16
4
+ - [#1](https://github.com/khiav223577/huffman_coding/pull/1) First implementation (@khiav223577)
data/CODE_OF_CONDUCT.md CHANGED
File without changes
data/LICENSE CHANGED
File without changes
data/README.md CHANGED
@@ -7,8 +7,7 @@
7
7
  [![Test Coverage](https://codeclimate.com/github/khiav223577/huffman_coding/badges/coverage.svg)](https://codeclimate.com/github/khiav223577/huffman_coding/coverage)
8
8
 
9
9
  ## Supports
10
- - Ruby 2.2 ~ 2.7
11
- - Rails 3.2, 4.2, 5.0, 5.1, 5.2, 6.0
10
+ - Ruby 1.8 ~ 2.7
12
11
 
13
12
  ## Installation
14
13
 
data/Rakefile CHANGED
File without changes
data/bin/console CHANGED
File without changes
data/bin/setup CHANGED
File without changes
data/gemfiles/Gemfile CHANGED
File without changes
File without changes
@@ -38,6 +38,4 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency 'rake', '>= 10.5.0'
39
39
  spec.add_development_dependency 'minitest', '~> 5.0'
40
40
  spec.add_development_dependency 'backports', '~> 3.17.1'
41
-
42
- spec.add_dependency 'activerecord', '>= 3'
43
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class LevelNodes
2
4
  attr_reader :size
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Node
2
4
  attr_reader :weight
3
5
 
@@ -1,15 +1,17 @@
1
- require 'huffman_coding/utils'
2
-
3
- class << HuffmanCoding::Utils
4
- if Enumerable.method_defined?(:tally)
5
- def tally(enumerable)
6
- enumerable.tally
7
- end
8
- else
9
- def tally(enumerable)
10
- hash = Hash.new(0)
11
- enumerable.each{|key| hash[key] += 1 }
12
- return hash
13
- end
14
- end
15
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'huffman_coding/utils'
4
+
5
+ class << HuffmanCoding::Utils
6
+ if Enumerable.method_defined?(:tally)
7
+ def tally(enumerable)
8
+ enumerable.tally
9
+ end
10
+ else
11
+ def tally(enumerable)
12
+ hash = Hash.new(0)
13
+ enumerable.each{|key| hash[key] += 1 }
14
+ return hash
15
+ end
16
+ end
17
+ end
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HuffmanCoding::Utils
2
4
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module HuffmanCoding # huffman_coding
2
- VERSION = '0.0.1'
4
+ VERSION = '1.0.0'
3
5
  end
@@ -1,65 +1,67 @@
1
- require 'huffman_coding/version'
2
- require 'huffman_coding/level_nodes'
3
- require 'huffman_coding/node'
4
- require 'huffman_coding/utils/tally'
5
-
6
- class << HuffmanCoding
7
- def encode(input_array, frequencies = HuffmanCoding::Utils.tally(input_array))
8
- if frequencies.size == 1
9
- code_table = { frequencies.keys[0] => '0' }
10
- else
11
- code_table = {}
12
- build_tree(frequencies).traverse('', code_table)
13
- end
14
-
15
- result_binary_string = input_array.map{|char| code_table[char] }.join
16
- last_byte_bits = result_binary_string.size % 8
17
- last_byte_bits = 8 if last_byte_bits == 0
18
- binary = result_binary_string.scan(/.{1,8}/).map{|s| s.to_i(2) }.pack('C*')
19
- return binary, last_byte_bits, code_table
20
- end
21
-
22
- def decode(binary, last_byte_bits, code_table)
23
- text = ''
24
- code_table = code_table.invert
25
- previous = ''
26
-
27
- add_binary_char = proc do |binary_char|
28
- previous << binary_char
29
- if (char = code_table[previous])
30
- text << char
31
- previous = ''
32
- end
33
- end
34
-
35
- bytes = binary.bytes.map{|s| s.to_s(2) } # bytes = ['101000', '11', '10101111', ...]
36
- last_byte = bytes.pop
37
-
38
- bytes.each do |byte|
39
- (8 - byte.size).times{ add_binary_char['0'] }
40
- byte.each_char{|s| add_binary_char[s] }
41
- end
42
-
43
- (last_byte_bits - last_byte.size).times{ add_binary_char['0'] }
44
- last_byte.each_char{|s| add_binary_char[s] }
45
-
46
- return text
47
- end
48
-
49
- private
50
-
51
- def build_tree(frequencies)
52
- level_nodes = LevelNodes.new(frequencies.map{|letter, frequency| Node.new(letter, frequency) })
53
-
54
- while level_nodes.size > 1
55
- left_level, left_node = level_nodes.pop_min_node
56
- right_level, right_node = level_nodes.pop_min_node
57
- next_level = (left_level > right_level ? left_level : right_level) + 1
58
-
59
- new_node = Node.new(nil, left_node.weight + right_node.weight, left_node, right_node)
60
- level_nodes.push_node(next_level, new_node)
61
- end
62
-
63
- return new_node
64
- end
65
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'huffman_coding/version'
4
+ require 'huffman_coding/level_nodes'
5
+ require 'huffman_coding/node'
6
+ require 'huffman_coding/utils/tally'
7
+
8
+ class << HuffmanCoding
9
+ def encode(input_array, frequencies = HuffmanCoding::Utils.tally(input_array))
10
+ if frequencies.size == 1
11
+ code_table = { frequencies.keys[0] => '0' }
12
+ else
13
+ code_table = {}
14
+ build_tree(frequencies).traverse('', code_table)
15
+ end
16
+
17
+ result_binary_string = input_array.map{|char| code_table[char] }.join
18
+ last_byte_bits = result_binary_string.size % 8
19
+ last_byte_bits = 8 if last_byte_bits == 0
20
+ binary = result_binary_string.scan(/.{1,8}/).map{|s| s.to_i(2) }.pack('C*')
21
+ return binary, last_byte_bits, code_table
22
+ end
23
+
24
+ def decode(binary, last_byte_bits, code_table)
25
+ text = String.new
26
+ code_table = code_table.invert
27
+ previous = String.new
28
+
29
+ add_binary_char = proc do |binary_char|
30
+ previous << binary_char
31
+ if (char = code_table[previous])
32
+ text << char
33
+ previous = String.new
34
+ end
35
+ end
36
+
37
+ bytes = binary.bytes.map{|s| s.to_s(2) } # bytes = ['101000', '11', '10101111', ...]
38
+ last_byte = bytes.pop
39
+
40
+ bytes.each do |byte|
41
+ (8 - byte.size).times{ add_binary_char['0'] }
42
+ byte.each_char{|s| add_binary_char[s] }
43
+ end
44
+
45
+ (last_byte_bits - last_byte.size).times{ add_binary_char['0'] }
46
+ last_byte.each_char{|s| add_binary_char[s] }
47
+
48
+ return text
49
+ end
50
+
51
+ private
52
+
53
+ def build_tree(frequencies)
54
+ level_nodes = LevelNodes.new(frequencies.map{|letter, frequency| Node.new(letter, frequency) })
55
+
56
+ while level_nodes.size > 1
57
+ left_level, left_node = level_nodes.pop_min_node
58
+ right_level, right_node = level_nodes.pop_min_node
59
+ next_level = (left_level > right_level ? left_level : right_level) + 1
60
+
61
+ new_node = Node.new(nil, left_node.weight + right_node.weight, left_node, right_node)
62
+ level_nodes.push_node(next_level, new_node)
63
+ end
64
+
65
+ return new_node
66
+ end
67
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: huffman_coding
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
@@ -72,20 +72,6 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 3.17.1
75
- - !ruby/object:Gem::Dependency
76
- name: activerecord
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '3'
82
- type: :runtime
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '3'
89
75
  description: A ruby gem that implements Huffman Coding.
90
76
  email:
91
77
  - mrtmrt15xn@yahoo.com.tw
@@ -136,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
122
  - !ruby/object:Gem::Version
137
123
  version: '0'
138
124
  requirements: []
139
- rubygems_version: 3.0.6
125
+ rubygems_version: 3.0.3
140
126
  signing_key:
141
127
  specification_version: 4
142
128
  summary: A ruby gem that implements Huffman Coding.