Skip to content

Instantly share code, notes, and snippets.

@RoshanNindrai
Last active October 1, 2018 16:25
Show Gist options
  • Select an option

  • Save RoshanNindrai/9e6b8994796e02c36127682707e9a790 to your computer and use it in GitHub Desktop.

Select an option

Save RoshanNindrai/9e6b8994796e02c36127682707e9a790 to your computer and use it in GitHub Desktop.
Basic Morse Code translator - letters
//
// Morse.swift
// Morse
//
// Created by Roshan Nindrai on 9/30/18.
// Copyright © 2018 Roshan Nindrai. All rights reserved.
//
import Foundation
enum MorseCode {
case dot
case dash
}
final class MorseCodeNode<Element> {
var data: Element?
var dot: MorseCodeNode<Element>?
var dash: MorseCodeNode<Element>?
init() {
data = nil
dot = nil
dash = nil
}
convenience init(_ data: Element) {
self.init()
self.data = data
}
}
extension MorseCodeNode {
func insert(_ element: Element) {
var queue = [self]
while !queue.isEmpty {
let node = queue.removeFirst()
if node.dot == nil {
node.dot = MorseCodeNode(element)
break
} else {
queue.append(node.dot!)
}
if node.dash == nil {
node.dash = MorseCodeNode(element)
break
} else {
queue.append(node.dash!)
}
}
}
func constructTree(_ data: [Element]) {
for element in data {
self.insert(element)
}
}
}
final class MorseCodeLetterTraslator {
private let root = MorseCodeNode<String>()
init() {
root.constructTree([
"e", "t",
"i", "a", "n", "m",
"s", "u", "r", "w", "d", "k", "g", "o",
"h", "v", "f", "u", "l", "a", "p", "j", "b", "x", "c", "y", "z", "q"
])
}
func translate(_ codes: [MorseCode]) -> String? {
var currentNode: MorseCodeNode<String>? = root
for code in codes {
switch code {
case .dot:
currentNode = currentNode?.dot
case .dash:
currentNode = currentNode?.dash
}
}
return currentNode?.data
}
func translate(_ codes: [[MorseCode]]) -> String {
return codes.compactMap { translate($0) }.reduce("") { result, code in
return result.appending(code)
}
}
}
let translator = MorseCodeLetterTraslator()
translator.translate([[.dot, .dot, .dot], [.dash, .dash, .dash], [.dot, .dot, .dot]]) // SOS
translator.translate([.dash, .dot, .dash, .dash]) // Y
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment