huffman_coding 1.0.0 → 1.1.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: 47e30f42beb607e9a5e7bdd29d4cd838b7ecf4fc927b52b3f2496ac668043092
4
- data.tar.gz: 257a61ddd2d6ae5f1886e03ce83b06a09d080e88d25bc5d857544a000c74d4f9
3
+ metadata.gz: 69c40c3a094b970779e30fcbfe69d35c7a4cf809c3c48e02c35f19b83b48f0f8
4
+ data.tar.gz: f07d0502b4fd076ce2bdd80bccf0859cd9efba9f3e33f969f7785ae282fded57
5
5
  SHA512:
6
- metadata.gz: 061ebc1c0ad93f774fb2ba5d0e73afa056e0d82b8472b8b95c41e63af637ee4bdd009ddbe338270aa7270ed1c5cc3accc72434e5ab1520355f5b53d4c96db4a1
7
- data.tar.gz: b76ec5e35b2e13f8ff03c7f6c3acee02e6df6ed7077381a78cec8a7381c5bc869c4b5f6073976d4ebdf765149045f97dab1d85a85bb2dbdd46de19f2310fbefb
6
+ metadata.gz: 986342ab4c5e9b97cbe5fcabd61565cc3495c1a234812afb4fab4e1d1f68b0bf6e90c3e6d596185e66a62f1509f1ce2e0039667cb16d2d896c5b279406d6398a
7
+ data.tar.gz: 793b94fae62acff621660ff6b0274ccff7cff513cb1b8936d82122840dc3fc82e2ac4b5100a74231aef1b15b43373ed6910236a7b871b75acdcdcc61f24ce035
@@ -1,4 +1,8 @@
1
- ## Change Log
2
-
3
- ### v0.0.1 2020/05/16
4
- - [#1](https://github.com/khiav223577/huffman_coding/pull/1) First implementation (@khiav223577)
1
+ ## Change Log
2
+
3
+ ### [v1.0.0](https://github.com/khiav223577/huffman_coding/compare/v0.0.1...v1.0.0) 2020/05/16
4
+ - [#3](https://github.com/khiav223577/huffman_coding/pull/3) add frozen_string_literal (@khiav223577)
5
+ - [#2](https://github.com/khiav223577/huffman_coding/pull/2) Doesn't need activerecord in runtime (@khiav223577)
6
+
7
+ ### v0.0.1 2020/05/16
8
+ - [#1](https://github.com/khiav223577/huffman_coding/pull/1) First implementation (@khiav223577)
data/README.md CHANGED
@@ -25,6 +25,26 @@ Or install it yourself as:
25
25
 
26
26
  ## Usage
27
27
 
28
+ ### Encode
29
+ ```rb
30
+ coding = HuffmanCoding.encode('A short test.'.each_char)
31
+ coding.binary
32
+ # => "6\x88BwV"
33
+
34
+ coding.last_byte_bits
35
+ # => 8
36
+
37
+ coding.code_table
38
+ # => {"e"=>"111", "."=>"110", "t"=>"10", " "=>"011", "s"=>"010", "A"=>"0011", "h"=>"0010", "o"=>"0001", "r"=>"0000"}
39
+ ```
40
+
41
+ ### Decode
42
+ ```rb
43
+ coding = HuffmanCoding.new("6\x88BwV", 8 "e"=>"111", "."=>"110", "t"=>"10", " "=>"011", "s"=>"010", "A"=>"0011", "h"=>"0010", "o"=>"0001", "r"=>"0000")
44
+ HuffmanCoding.decode(coding)
45
+ # => 'A short test.'
46
+ ```
47
+
28
48
 
29
49
  ## Development
30
50
 
@@ -5,6 +5,18 @@ require 'huffman_coding/level_nodes'
5
5
  require 'huffman_coding/node'
6
6
  require 'huffman_coding/utils/tally'
7
7
 
8
+ class HuffmanCoding
9
+ attr_reader :binary
10
+ attr_reader :last_byte_bits
11
+ attr_reader :code_table
12
+
13
+ def initialize(binary, last_byte_bits, code_table)
14
+ @binary = binary
15
+ @last_byte_bits = last_byte_bits
16
+ @code_table = code_table.freeze
17
+ end
18
+ end
19
+
8
20
  class << HuffmanCoding
9
21
  def encode(input_array, frequencies = HuffmanCoding::Utils.tally(input_array))
10
22
  if frequencies.size == 1
@@ -18,12 +30,12 @@ class << HuffmanCoding
18
30
  last_byte_bits = result_binary_string.size % 8
19
31
  last_byte_bits = 8 if last_byte_bits == 0
20
32
  binary = result_binary_string.scan(/.{1,8}/).map{|s| s.to_i(2) }.pack('C*')
21
- return binary, last_byte_bits, code_table
33
+ return new(binary, last_byte_bits, code_table)
22
34
  end
23
35
 
24
- def decode(binary, last_byte_bits, code_table)
36
+ def decode(coding)
25
37
  text = String.new
26
- code_table = code_table.invert
38
+ code_table = coding.code_table.invert
27
39
  previous = String.new
28
40
 
29
41
  add_binary_char = proc do |binary_char|
@@ -34,7 +46,7 @@ class << HuffmanCoding
34
46
  end
35
47
  end
36
48
 
37
- bytes = binary.bytes.map{|s| s.to_s(2) } # bytes = ['101000', '11', '10101111', ...]
49
+ bytes = coding.binary.bytes.map{|s| s.to_s(2) } # bytes = ['101000', '11', '10101111', ...]
38
50
  last_byte = bytes.pop
39
51
 
40
52
  bytes.each do |byte|
@@ -42,7 +54,7 @@ class << HuffmanCoding
42
54
  byte.each_char{|s| add_binary_char[s] }
43
55
  end
44
56
 
45
- (last_byte_bits - last_byte.size).times{ add_binary_char['0'] }
57
+ (coding.last_byte_bits - last_byte.size).times{ add_binary_char['0'] }
46
58
  last_byte.each_char{|s| add_binary_char[s] }
47
59
 
48
60
  return text
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module HuffmanCoding # huffman_coding
4
- VERSION = '1.0.0'
3
+ class HuffmanCoding # huffman_coding
4
+ VERSION = '1.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: huffman_coding
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-16 00:00:00.000000000 Z
11
+ date: 2020-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler