В сумме потеря информации. Первый '0'
не входит. Во-вторых, диапазон ['1'..'9']
и ['a'..'i']
одинаков в сумме.
Кроме того, если бы я собирался написать это, я бы
import Data.Char (ord)
sol x | elem x ['0'..'9'] = mod (ord x) 16
| elem x ['a'..'z'] = mod (ord x) 32
| elem x ['A'..'Z'] = mod (ord x) 64
| otherwise = 0
Этим можно продемонстрировать предшествующие факты
sol 'd' produces 4
sol '4' produces 4
sol '@' produces 0
sol '0' produces 0
Теперь, когда сказано, ord
- это индекс в наборе символов ASCII.
Можно создать свой собственный индекс только с теми символами, которые вас интересуют.
tlz = zip [1..] $ concat [['0'..'9'],['a'..'z']]
Тогда вы можете искать символы, и каждый из них будет иметь уникальный индекс, даже ноль «0» будет зарегистрирован как один. Если символа нет в таблице, он просто не засчитывается. Сжатие списка просто выдает ноль []
.
Создайте следующую функцию для использования списка. Выходной сигнал больше, чем исходная функция, длина tls
равна 36, а первоначально длина равна 26.
smmat = sum.concat.map (\x->[a|(a,b)<-tlz,x == b])
Просто напишите ему список.
smmat "This is 42% sure"
226
Будьте уверены, в предыдущем списке было 11 "попаданий". выньте sum
из списка, чтобы увидеть или измените a
в списке, чтобы увидеть символы b.