huffman_coding 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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.