code_morse 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1a42a31e170a1f9c77ad2c0bf69e002e2b70f058
4
+ data.tar.gz: 959d75b69902d90d8157f2928975ca50695f079e
5
+ SHA512:
6
+ metadata.gz: 473fa228dc934c6424cbf86918938541846aa7800dbb8aaf5c52143c18fad8dc8c59d74b3a2df4c699b3769de16e89bd6cd7dc219333af2dc57d707c7567e87d
7
+ data.tar.gz: 022b8fd5e4bccc4e93c5cc1e71ac53e08af0fdfa0cf9cd3ab100f35bf523a267fce9a5029fc4eaf3c4d5bb39ca5835eaa96cae28a50b1de28d076f9669479039
data/lib/code_morse.rb ADDED
@@ -0,0 +1,22 @@
1
+ require_relative './morse/chars'
2
+ require_relative './morse/tree'
3
+ require_relative './morsify'
4
+
5
+ at_exit { puts("\nbye bye!") }
6
+
7
+ resp = []
8
+
9
+ morse_tree = Morse::Tree.new
10
+ morse_tree.learn(MORSE_CHARS)
11
+
12
+ # TODO: wrap morse characters in sigle string
13
+
14
+ ARGV.each do |param|
15
+ if param =~ /\w/
16
+ resp.push(Morsify.new.call(param))
17
+ else # TODO: add regex for recognizing morse code only
18
+ resp.push(morse_tree.humanize(param))
19
+ end
20
+ end
21
+
22
+ puts(resp.join(' '))
@@ -0,0 +1,51 @@
1
+ MORSE_CHARS = {
2
+ 'a' => '.-',
3
+ 'b' => '-...',
4
+ 'c' => '-.-.',
5
+ 'd' => '-..',
6
+ 'e' => '.',
7
+ 'f' => '..-.',
8
+ 'g' => '--.',
9
+ 'h' => '....',
10
+ 'i' => '..',
11
+ 'j' => '.---',
12
+ 'k' => '-.-',
13
+ 'l' => '.-..',
14
+ 'm' => '--',
15
+ 'n' => '-.',
16
+ 'o' => '---',
17
+ 'p' => '.--.',
18
+ 'q' => '--.-',
19
+ 'r' => '.-.',
20
+ 's' => '...',
21
+ 't' => '-',
22
+ 'u' => '..-',
23
+ 'v' => '...-',
24
+ 'w' => '.--',
25
+ 'x' => '-..-',
26
+ 'y' => '-.--',
27
+ 'z' => '--..',
28
+ '0' => '-----',
29
+ '1' => '.----',
30
+ '2' => '..---',
31
+ '3' => '...--',
32
+ '4' => '....-',
33
+ '5' => '.....',
34
+ '6' => '-....',
35
+ '7' => '--...',
36
+ '8' => '---..',
37
+ '9' => '----.',
38
+ '?' => '..--..',
39
+ '_' => '..--.-',
40
+ '"' => '.-..-.',
41
+ '.' => '.-.-.-',
42
+ '+' => '.-.-.',
43
+ '@' => '.--.-.',
44
+ "'" => '.----.',
45
+ '-' => '-....-',
46
+ '=' => '-...-',
47
+ '/' => '-..-.',
48
+ ';' => '-.-.-.',
49
+ '!' => '-.-.--',
50
+ ',' => '--..--'
51
+ }
data/lib/morse/tree.rb ADDED
@@ -0,0 +1,72 @@
1
+ module Morse
2
+ MORSE_RUBY_ADAPTER = { '.' => :dot, '-' => :dash, ' ' => :break }
3
+
4
+ class Tree
5
+ attr_reader :root
6
+
7
+ def initialize
8
+ @root = Node.new(nil, ' ')
9
+ end
10
+
11
+ def learn(morse_table = {})
12
+ morse_table.each do |letter,morse|
13
+ @root = push_recursively(@root, letter, morse, 0)
14
+ end
15
+ end
16
+
17
+ def humanize(morse_string)
18
+ out = get_recursively(morse_string, @root)
19
+ out
20
+ end
21
+
22
+ private
23
+
24
+ def push_recursively(node, letter, morse, index)
25
+ morse_char = morse[index]
26
+ node = Node.new(@root) if node.nil?
27
+ if index < morse.length
28
+ node.send("#{mra[morse_char]}=", push_recursively(node.send("#{mra[morse_char]}"), letter, morse, index+1))
29
+ else
30
+ node.value = letter
31
+ end
32
+ node
33
+ end
34
+
35
+ def get_recursively(morse_string = '', node = nil, letters = [], index = 0)
36
+ # "... --- ... ... --- ..."
37
+ node = @root if node.nil?
38
+ char = morse_string[index]
39
+
40
+ letters.push(node.value) if char == ' '
41
+
42
+ if index < morse_string.length
43
+ node = node.send("#{mra[char]}")
44
+ get_recursively(morse_string, node, letters, index+1)
45
+ else
46
+ letters.push(node.value)
47
+ letters.join()
48
+ end
49
+
50
+ rescue => e
51
+ p(e)
52
+ letters.join()
53
+ end
54
+
55
+ def mra
56
+ MORSE_RUBY_ADAPTER
57
+ end
58
+
59
+ class Node
60
+ attr_accessor :value, :dot, :dash, :root
61
+
62
+ def initialize(root = nil, value = '')
63
+ @root = root
64
+ @value = value
65
+ end
66
+
67
+ def break
68
+ @root || self
69
+ end
70
+ end
71
+ end
72
+ end
data/lib/morsify.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative './morse/chars'
2
+
3
+ class Morsify
4
+ def call(str)
5
+ str.chars.map { |i| MORSE_CHARS.merge({ ' ' => ' '})[i.downcase] }.join(' ').strip
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: code_morse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alex Miasoiedov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple 'Morse Code' back and forth converter.
14
+ email: alexmiasoiedov@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/code_morse.rb
20
+ - lib/morse/chars.rb
21
+ - lib/morse/tree.rb
22
+ - lib/morsify.rb
23
+ homepage: http://rubygems.org/AlexMiasoiedov/code_morse
24
+ licenses:
25
+ - MIT
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 2.4.5.1
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: ".... . .-.. .-.. --- -- --- .-. ... . -.-.--"
47
+ test_files: []