[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/7Gf5N1I2    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Mar 29:
(define morse-code '(
  (#\A    ".-") (#\B  "-...") (#\C  "-.-.") (#\D   "-..")
  (#\E     ".") (#\F  "..-.") (#\G   "--.") (#\H  "....")
  (#\I    "..") (#\J  ".---") (#\K   "-.-") (#\L  ".-..")
  (#\M    "--") (#\N    "-.") (#\O   "---") (#\P  ".--.")
  (#\Q  "--.-") (#\R   ".-.") (#\S   "...") (#\T     "-")
  (#\U   "..-") (#\V  "...-") (#\W   ".--") (#\X  "-..-")
  (#\Y  "-.--") (#\Z  "--..") (#\1 ".----") (#\2 "..---")
  (#\3 "...--") (#\4 "....-") (#\5 ".....") (#\6 "-....")
  (#\7 "--...") (#\8 "---..") (#\9 "----.") (#\0 "-----")
  (".-"    #\A) ("-..."  #\B) ("-.-."  #\C) ("-.."   #\D)
  ("."     #\E) ("..-."  #\F) ("--."   #\G) ("...."  #\H)
  (".."    #\I) (".---"  #\J) ("-.-"   #\K) (".-.."  #\L)
  ("--"    #\M) ("-."    #\N) ("---"   #\O) (".--."  #\P)
  ("--.-"  #\Q) (".-."   #\R) ("..."   #\S) ("-"     #\T)
  ("..-"   #\U) ("...-"  #\V) (".--"   #\W) ("-..-"  #\X)
  ("-.--"  #\Y) ("--.."  #\Z) (".----" #\1) ("..---" #\2)
  ("...--" #\3) ("....-" #\4) ("....." #\5) ("-...." #\6)
  ("--..." #\7) ("---.." #\8) ("----." #\9) ("-----" #\0)
  (#\space "")))

(define (morse str)
  (let loop ((cs (string->list str)) (result '()))
    (if (null? cs) (list->string (cdr (reverse result)))
      (loop (cdr cs) (append (reverse (string->list
            (cadr (assoc (char-upcase (car cs)) morse-code))))
            (list #\space) result)))))

(define (un-morse str)
  (let loop ((cs (string->list str)) (ms '()) (result '()))
    (cond ((null? cs)
            (if (null? ms)
                (list->string (reverse result))
                (list->string (reverse (cons (cadr (assoc
                    (list->string (reverse ms)) morse-code)) result)))))
          ((char=? (car cs) #\space)
            (if (null? ms)
                (loop (cdr cs) ms (cons #\space result))
                (loop (cdr cs) '() (cons (cadr (assoc (list->string
                    (reverse ms)) morse-code)) result))))
          ((or (char=? (car cs) #\.) (char=? (car cs) #\-))
            (loop (cdr cs) (cons (car cs) ms) result)))))

(display (un-morse (morse "Programming Praxis")))


Output:
1
PROGRAMMING PRAXIS


Create a new paste based on this one


Comments: