1votos

Codigo Morse en Haskell

por josejuan hace 1 año

.

Codigo Morse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import Sound.ALUT 
 
import Data.List 
import Data.Char 
import Control.Monad 
 
main :: IO () 
main = 
   withProgNameAndArgs runALUT $ \_ _ -> do 
      let t = 0.1 
          w x = do k <- createBuffer (Sine 500.0 0.0 (x * t)) 
                   ks <- genObjectName 
                   buffer ks $= Just k 
                   return ks 
      p <- w 1 
      r <- w 3 
      let s P = play  [p] >> sleep t 
          s R = play  [r] >> sleep (3 * t) 
          s S = return () >> sleep t 
      mapM_ s $ ephrase "En Solveet hay algunos desafios divertidos!" 
 
-- pulso, raya, silencio 
data Pulso = P | R | S deriving Show 
 
-- tipos de pulsos: punto, interpunto, raya, interletra, interpalabra 
pulsos '·' = [P] 
pulsos '~' = [S] 
pulsos '—' = [R] 
pulsos ':' = [S, S, S] 
pulsos ' ' = [S, S, S, S, S, S] 
pulsos  _  = error "BUG en duration" 
 
-- codificar una frase es separar la codificación de sus palabras por cierta separación 
ephrase = concatMap pulsos . concat . intersperse " " . map eword . words 
 
-- codificar una palabra es separar la codificación de sus letras por cierta separación 
eword = concat . intersperse ":" . map (intersperse '~') . echar . map toUpper 
 
-- codificar una letra es usar directamente tabla de códigos 
echar ('!':xs) = "——··——": echar xs 
echar (',':xs) = "—·—·——": echar xs 
echar ('.':xs) = "·—·—·—": echar xs 
echar ('0':xs) = "—————":  echar xs 
echar ('1':xs) = "·————":  echar xs 
echar ('2':xs) = "··———":  echar xs 
echar ('3':xs) = "···——":  echar xs 
echar ('4':xs) = "····—":  echar xs 
echar ('5':xs) = "·····":  echar xs 
echar ('6':xs) = "—····":  echar xs 
echar ('7':xs) = "——···":  echar xs 
echar ('8':xs) = "———··":  echar xs 
echar ('9':xs) = "————·":  echar xs 
echar ('?':xs) = "··——··": echar xs 
echar ('A':xs) = "·—":     echar xs 
echar ('B':xs) = "—···":   echar xs 
echar ('C':xs) = "—·—·":   echar xs 
echar ('D':xs) = "—··":    echar xs 
echar ('E':xs) = "·":      echar xs 
echar ('F':xs) = "··—·":   echar xs 
echar ('G':xs) = "——·":    echar xs 
echar ('H':xs) = "····":   echar xs 
echar ('I':xs) = "··":     echar xs 
echar ('J':xs) = "·———":   echar xs 
echar ('K':xs) = "—·—":    echar xs 
echar ('L':xs) = "·—··":   echar xs 
echar ('M':xs) = "——":     echar xs 
echar ('N':xs) = "—·":     echar xs 
echar ('O':xs) = "———":    echar xs 
echar ('P':xs) = "·——·":   echar xs 
echar ('Q':xs) = "——·—":   echar xs 
echar ('R':xs) = "·—·":    echar xs 
echar ('S':xs) = "···":    echar xs 
echar ('T':xs) = "—":      echar xs 
echar ('U':xs) = "··—":    echar xs 
echar ('V':xs) = "···—":   echar xs 
echar ('W':xs) = "·——":    echar xs 
echar ('X':xs) = "—··—":   echar xs 
echar ('Y':xs) = "—·——":   echar xs 
echar ('Z':xs) = "——··":   echar xs 
echar ('Ñ':xs) = "——·——":  echar xs 
echar (  _:xs) =           echar xs 
echar      []  =                 [] 
3 comentarios
0votos

Escrito por josejuan hace 1 año

Un ejemplo de cómo se escucha el programa:
https://youtu.be/Cfg4qZmSyOM
0votos

Escrito por Lp hace 1 año

Me gusto que lo hicieras sonar de verdad, aún que lo encuentro muy rápido, habría que ser maestro de morse para poder entenderlo, o alcanzara a anotarlo, pero es un detalle.
0votos

Escrito por josejuan hace 1 año

Cierto, creo que el record del mund está en t=0.26 y yo he puesto t=0.1 pero bueno xD

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.