0votos

KataBankOCR en Haskell

por josejuan hace 6 años

Como lo interesante está en decodificar los números, aquí va una función que rota los caracteres que forman cada dígito para obtener claves únicas.

You work for a bank, which has recently purchased an ingenious machine to assist in reading letters and faxes sent in by branch offices. The machine scans the paper documents, and produces a file with a number of entries.

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
import Data.Char 
import Data.List.Split 
 
-- Decodifica un número de cualquier longitud: 
decodeNumber s = map toNum $ z a b c 
  where (a:b:c:_) = splitOn "\n" s 
        z [] _ _ = [] 
        z (d:e:f:g) (h:i:j:k) (l:m:n:o) = [d:e:f:h:i:j:l:m:n:[]] ++ z g k o 
 
 
toNum " _ | ||_|" = '0' 
toNum "     |  |" = '1' 
toNum " _  _||_ " = '2' 
toNum " _  _| _|" = '3' 
toNum "   |_|  |" = '4' 
toNum " _ |_  _|" = '5' 
toNum " _ |_ |_|" = '6' 
toNum " _   |  |" = '7' 
toNum " _ |_||_|" = '8' 
toNum " _ |_| _|" = '9' 
toNum _ = '?' 
 
-- ---------------------------------------------------------------------------- 
-- Por ejemplo: 
 
test1 = decodeNumber ("    _  _     _  _  _  _  _ \n" ++ 
                      "  | _| _||_||_ |_   ||_||_|\n" ++ 
                      "  ||_  _|  | _||_|  ||_| _|\n") 
-- genera: 123456789 
 
 
test2 = decodeNumber ("    _  _  _  _  _     _  _  _  _  _ \n" ++ 
                      "  ||_| _||_ | | _||_||_  _||_   ||_|\n" ++ 
                      "  ||_||_  _||_| _|  | _| _||_|  | _|\n") 
 
-- genera: 182503453679 
 
 
test3 = decodeNumber ("    _  _  _  _  _     _  _  _  _  _ \n" ++ 
                      "  ||_   ||_ |   _|| ||_  _||_   ||_|\n" ++ 
                      "  ||_ |_  _||_| _|  | _| _||_|  | _|\n") 
 
-- genera: 1??5?3?53679 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.