Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 12
1

Подскажите с задачей, поделитесь решением у кого есть

23.12.2014, 15:09. Просмотров 2296. Ответов 8
Метки нет (Все метки)

Клавиши на клавиатуре могут быть либо управляющими, либо алфавитно-цифровыми. Нажатие алфавитно-цифровой клавиши может сопровождаться нажатием клавиши Shift, Из управляющих клавиш нас интересует только клавиша CapsLock, остальные можно не различать. Каждое нажатие алфавитно-цифровой клавиши несет с собой информацию в виде символа. После нажатия CapsLock последующие символы переводятся в верхний регистр (если они не были нажаты вместе с Shift) до следующего нажатия CapsLock, Если режим CapsLock не активирован, символы, нажатые с Shift, переводятся в верхний регистр. Разработайте тип данных, представляющий указанную информацию. Последовательность нажатий клавиш представляется в виде списка. Основная задача состоит в том, чтобы разработать функцию, переводящую эту последовательность в строку символов. Например, последовательность нажатий

Shift+'h' 'e' CapsLock 'l' 'l' Shift+'o' CapsLock

должна дать в результате строку HeLLo. Определите следующие функции:

1) getAlNum, возвращающая из списка нажатий только нажатия алфавитно-цифровых клавиш,

2) getRaw, возвращающая строку, составленную из нажатых символов без учета информации о Shift и CapsLock.

3) isCapsLocked, по последовательности нажатий определяющая, остался ли после нее режим CapsLock в активированном состоянии,

4) getString, переводящая последовательность нажатий в строку.

При реализации функций можно воспользоваться стандартными функциями toUpper и toLower, переводящими символ в верхний и нижний регистры соответственно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2014, 15:09
Ответы с готовыми решениями:

Подскажите с задачей, поделитесь решением у кого есть
Иерархия должностей в некоторой организации образует древовидную структуру. Каждый работник,...

Ищу De Decompiler поделитесь если у кого есть
ищу De decompiler поделитесь если у кого есть! в интернете не могу найти(( может у кого завалялся...

Чертежи корпусов - поделитесь, если у кого есть
Всем ПрИвЕт :) У же 2 месяца ищу чертежи (схемы) Корпусов всех формат факторов но без...

У кого есть PowerShell WMI Explorer? Поделитесь!
Хочу скачать PowerShell WMI Explorer (это павершельный скрипт), но оф сайт не доступен. У кого есть...

__________________
8
4455 / 2074 / 263
Регистрация: 01.03.2013
Сообщений: 5,511
Записей в блоге: 22
23.12.2014, 16:06 2
В типах не силен, всегда обходился списками и кортежами. У вас прямо сказано -
Цитата Сообщение от SeraFinN Посмотреть сообщение
Последовательность нажатий клавиш представляется в виде списка.
Но список может быть только из элементов одного типа. А вам надо хранить или символы или клавиши типа капс. Можете хранить пару - символ и код капса, можете просто код клавиши строкой типа "в" и "caps", можете просто числовой код - да как угодно. А потом просто ваши функции будут бежать по списку по хронологии нажатия - то есть с головы до хвоста и возвращать все что надо.
0
4135 / 2711 / 388
Регистрация: 01.06.2013
Сообщений: 5,712
Записей в блоге: 9
23.12.2014, 16:15 3
Haskell
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
{-# LANGUAGE LambdaCase #-}
data Keys =    NoShift Char
             | Shift Char
             | CapsLock
        deriving (Show, Eq)
 
getAlNum = filter   (\case
                        (NoShift c) -> isNumLet c
                        (Shift c) -> isNumLet c
                        _ -> False
                    )
    where isNumLet = (`elem` (['0'..'9']++['a'..'z']))
    
getRaw [] = []
getRaw (NoShift c:xs) = c:getRaw xs
getRaw (Shift c:xs) = c:getRaw xs
getRaw (_:xs) = getRaw xs 
 
--isCapsLocked = (1==) . (`mod` 2) .  length . filter (CapsLock==)
 
isCapsLocked = foldl  (curry (\case 
                              (b,CapsLock) -> not b
                              (b,_) -> b)) False
 
getString = go False
    where go _ [] = []
          go False (NoShift c:xs) = c:go False xs
          go True (NoShift c:xs) = toUpper c :go True xs
          go False (Shift c:xs) = toUpper c :go False xs
          go True (Shift c:xs) = c:go True xs
          go cs (CapsLock:xs) = go (not cs) xs
- А теперь у меня вопрос: чего то я не понял как использовать лямду с несколькими аргументами, при LambdaCase? Выше я выкрутился с помощью curry , но наверняка можно напрямую шаблонить по нескольким аргументам лямбды.

И, да, я предполагаю что буквы в исходных списках только строчные.
1
4455 / 2074 / 263
Регистрация: 01.03.2013
Сообщений: 5,511
Записей в блоге: 22
23.12.2014, 16:47 4
ЗЫ кстати, в процедурном Си принципиально никаких отличий я пока не вижу - надо создать структуру с парой-тройкой полей, которая будет определять - нажата ли клавиша и какая, при шифте/без шифта, символьная она или капсо/табо/эскейпная. А потом массив этих структур, а потом последовательная обработка этого массива - все так же просто.

Добавлено через 1 минуту
Пока предлагал свою кустарщину, подоспели специалисты в типах.

Добавлено через 29 минут
KolodeznyDiver, так неспортивно?
Haskell
1
2
3
isCapsLocked = foldl (\a c -> case c of
                                  CapsLock -> not a
                                  _ -> a) False
1
4135 / 2711 / 388
Регистрация: 01.06.2013
Сообщений: 5,712
Записей в блоге: 9
23.12.2014, 16:57 5
Цитата Сообщение от _Ivana Посмотреть сообщение
KolodeznyDiver, так неспортивно?
Так то само собой можно. Но есть GHC расширение {-# LANGUAGE LambdaCase #-} и при нём можно сразу (\case. Как для унарной лямбды понятно, как для N-арной пока не понял.
1
4455 / 2074 / 263
Регистрация: 01.03.2013
Сообщений: 5,511
Записей в блоге: 22
23.12.2014, 17:54 6
All the while, discussions on mailing lists were taking place. Max Bolingbroke notified Haskell Cafe of the ticket, resulting in an explosion of ideas and discussion. Back on trac, it was suggested that LambdaCase could support multiple arguments:

\case { (Just x) (Just y) -> x + y; _ _ -> 1 }
==>
\a b -> case (a, b) of { (Just x, Just y) -> x +y; (_, _) -> 1 }
Now, I believe there were two grave mistakes that caused this ticket to be derailed. First, it introduced a patch that implemented two separate features: lambda-case and lambda-if. Second, as it was discussed, the scope of it never seemed to stop growing. People kept dreaming up new features that could be added into the original idea, causing it to swell in complexity, making it difficult to pinpoint what exactly should be implemented and whether it was a good idea at all.
http://unknownparallel.wordpre... bdacase-2/

Добавлено через 25 минут
(field report by Mikhail Vorozhtsov) I've been using \case for over a year and tried MultiClauseLambdas for about two months. In my code base \case seems to cover 99% of cases (no pun intended) and curry $ \case ... does the job for the rest, so having only a single-argument solution may be not as restrictive as it seems. On the other hand, I had a hard time with MultiClauseLambdas extra clauses: I just kept writing Just x -> Expr instead of the correct (Just x) -> Expr. It seems that lines like [spaces]Pat -> Expr are just hardwired to case-expressions in my brain.
https://ghc.haskell.org/trac/g... rnMatching

PS я попробовал написать в стиле MultiClauseLambdas, но или ошибся в синтаксисе, или надо его дополнительно скачивать и докабаливать, что не очень хочется. Проблема синтаксического сахара, которая имеет множество решений с существующем синтаксисе все-таки кажется мне на 2 порядка более надуманной, чем попытка разобраться в рекурсивных типах как неподвижных точках функторов.
1
Модератор
Эксперт Python
28532 / 15402 / 3044
Регистрация: 12.02.2012
Сообщений: 25,232
Записей в блоге: 4
23.12.2014, 21:09 7
Лучший ответ Сообщение было отмечено SeraFinN как решение

Решение

До кучи:

Haskell
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
data KeyCode = Sym Char | CapsLock | Shift Char deriving (Eq,Show)
 
typCode :: KeyCode -> Int
typCode (Sym _)   = 0
typCode CapsLock  = -1
typCode (Shift _) = 1 
 
getSym :: KeyCode -> Char
getSym (Sym   a) = a
getSym (Shift a) = a
 
getString :: [KeyCode] -> Bool -> String
getString [] _ = ""
getString (k:ks) cl | ((typCode k) == -1) = getString ks (not cl)
                    | ((typCode k) == 0) =  if cl then (toUpper (getSym k)) : gks else  (getSym k) : gks 
                    | otherwise = if (not cl) then (toUpper (getSym k)) : gks else  (getSym k) : gks
                      where gks=(getString ks cl)
 
getRaw :: [KeyCode] -> [KeyCode]
getRaw [] = []
getRaw (k:ks) | (typCode k) == 0  = k : (getRaw ks)
              | (typCode k) == -1 = getRaw ks
              | otherwise = (Sym (getSym k)) : getRaw ks
 
isCapsLocked  :: [KeyCode] -> Bool -> Bool
isCapsLocked [] cl = cl
isCapsLocked (k:ks) cl | (typCode k) == -1  = isCapsLocked ks (not cl)
                       | otherwise = isCapsLocked ks cl
1
Curry
24.12.2014, 00:00
  #8

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Проблема синтаксического сахара, которая имеет множество решений с существующем синтаксисе все-таки кажется мне на 2 порядка более надуманной, чем попытка разобраться в рекурсивных типах как неподвижных точках функторов.
Ну ладно, не прикрутили ещё. В конце концов, должны же и у Haskell-а быть недостатки. Вот и на солнце есть пятна.
(Реплика в сторону: Не могли типы с контролем диапазона ввести! Со статическими границами. Ни чем, ведь, ФП не противоречат. Ну кидались бы исключениями).

Проблема множественного сахара существует до тех пор, пока не включат в стандарт или просто не выпустят очередной GHC с хоть каким то сахаром. А точки эти - это ж теория категорий, тут нужно переливание подходящих мозгов себе делать! У меня, пока не получается. :(

0
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 12
29.12.2014, 20:16  [ТС] 9
Спасибо всем откликнувшимся, за основу взял ответ Catstail, в итоге получилось
Haskell
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
import Data.Char
data KeyCode = Sym Char | CapsLock | Shift Char deriving (Eq,Show)
 
getSym :: KeyCode -> Bool -> Char
getSym (Sym a) False = a
getSym (Sym a) True = toUpper a
getSym (Shift '1') _ = '!'
getSym (Shift '2') _ = '@'
getSym (Shift '3') _ = '#'
getSym (Shift '4') _ = '$'
getSym (Shift '5') _ = '%'
getSym (Shift '6') _ = '^'
getSym (Shift '7') _ = '&'
getSym (Shift '8') _ = '*'
getSym (Shift '9') _ = '('
getSym (Shift '0') _ = ')'
getSym (Shift '-') _ = '_'
getSym (Shift '=') _ = '+'
getSym (Shift a) cl | cl == False = if (toUpper a == a) then toLower a else toUpper a
                    | cl == True = if (toUpper a == a) then toUpper a else toLower a
 
getString :: [KeyCode] -> Bool -> String
getString [] _ = ""
getString (CapsLock:ks) cl = getString ks (not cl)
getString (k:ks) cl = (getSym k cl) : getString ks cl
                        
getAlNum :: [KeyCode] -> [KeyCode]
getAlNum [] = []    
getAlNum (CapsLock:ks) = getAlNum ks
getAlNum (k:ks)            = k : getAlNum ks
 
getRaw :: [KeyCode] -> String
getRaw [] = ""
getRaw (CapsLock:ks) = getRaw ks
getRaw (Sym k:ks) = k : getRaw ks
getRaw (Shift k:ks)  = k : getRaw ks
 
isCapsLocked  :: [KeyCode] -> Bool -> Bool
isCapsLocked [] cl  = cl
isCapsLocked (CapsLock:ks) cl = isCapsLocked ks (not cl)
isCapsLocked (k:ks) cl = isCapsLocked ks cl
Может кому пригодится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2014, 20:16

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

У кого есть опыт использования C++ Builder XE2, поделитесь впечатлениями (отзывы) - FireMonkey
Кто юзал этого зверя? Меня он подкупил своим красивым дизайном... но что то они его криво...

Хочу поучится верстать. Если у кого есть макеты дизайнов в PSD, поделитесь.
Собственно все в теме. Дизайны не будут использоваться нигде, кроме как в учебных целях.

Как научиться писать грамотно программы со смыслом?)Почему у кого то получается,а у кого то нет?Мож поделитесь Хитростями:)
Интересно просто,или расскажите вашу историю скоко учились,скоко ошибок было в изучении С++,а то...

Подскажите есть у кого готовое решение ТОРГ12
Здравствуйте, подскажите пожалуйста Есть ли у кого готовое решение ТОРГ12 (Возвратная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.