Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
1

Ревью небольшого кода

02.02.2016, 03:56. Показов 2069. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хаскелл я изучаю совсем недавно, поэтому хотелось бы узнать, что и как можно было написать лучше.

Задача такая.
Задается входной файл и длина маски.
Во входном файле строки вида <бинарная маска> <значение>.
Например, в файле одна строка "0*1* ADD".
Нужно получить результат вида
0000 INVALID
0001 INVALID
0010 ADD
0011 ADD
0100 INVALID
0101 INVALID
0110 ADD
0111 ADD
1000 INVALID
1001 INVALID
1010 INVALID
1011 INVALID
1100 INVALID
1101 INVALID
1110 INVALID
1111 INVALID
Вывести на экран только значения ADD и INVALID в порядке возрастания.
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
module Main where
 
import Control.Applicative
import Control.Monad
import Data.Char
import Data.List
import qualified Data.Vector as V
import System.Environment
import System.IO
 
generateOpcodesFromMask :: String -> [String]
generateOpcodesFromMask ('*':ms) = [((head $ show x):y) | x <- [0, 1], y <- generateOpcodesFromMask ms]
generateOpcodesFromMask (m:ms) = [(m:y) | y <- generateOpcodesFromMask ms]
generateOpcodesFromMask [] = [""]
 
convertOpcodes :: [String] -> [Int]
convertOpcodes opcodes = foldl (\a b -> 2*a + digitToInt b) 0 <$> opcodes
 
addNameToOpcodes :: String -> [Int] -> [(Int, String)]
addNameToOpcodes name = map (\x -> (x, name))
 
getOpcodesWithName :: [String] -> [(Int, String)]
getOpcodesWithName [mask, name] = addNameToOpcodes name $ convertOpcodes $ generateOpcodesFromMask mask
getOpcodesWithName _ = error "getOpcodesWithName: invalid line"
 
fillFreeOpcodes :: Int -> [(Int, String)] -> [String]
fillFreeOpcodes maskLength opcodes = V.toList $ V.replicate (2 ^ maskLength) "INVALID" V.// opcodes
 
solveProblem :: Int -> [[String]] -> [String]
solveProblem maskLength contents = fillFreeOpcodes maskLength $ contents >>= getOpcodesWithName
 
main :: IO ()
main = do
  [inputFile, maskLength] <- getArgs
  withFile inputFile ReadMode $ \fd -> do
    contents <- hGetContents fd
    putStrLn "const std::vector<InstructionType> instructions_decoding_table{";
    putStr $ unlines $ (\name -> "InstructionType::" ++ name ++ ",") <$>
                       (solveProblem (read maskLength) $ words <$> (lines contents))
    putStrLn "};"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2016, 03:56
Ответы с готовыми решениями:

Проведите ревью кода?
Посмотрите, пожалуйста, код - не прошёл испытательный срок - жалуются на качество. Всё ли так...

Прошу сделать ревью кода
Всем доброго времени суток. Есть код, который очень далек от идеала и мне хотелось бы что бы гуру...

Написал крестики-нолики. Сделайте ревью кода
Добрый день. В качестве изучения C# написал крестики-нолики на основе MVC, но, пока без...

Перевод небольшого кода из C# в C++
Здравствуйте. Не знаю туда ли я обращаюсь. Имею код, сделанный в Virtual Studio. Необходимо...

45
pycture
03.02.2016, 17:38     Ревью небольшого кода
  #21

Не по теме:

Кликните здесь для просмотра всего текста
Цитата Сообщение от ct0r Посмотреть сообщение
Почему там-то?
функциональщина, императифщина и объектнооринтированность в одном флаконе. такой цепепе с человечьим лицом. о чем еще можно мечтать? :)

0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
03.02.2016, 17:45 22
Цитата Сообщение от ct0r Посмотреть сообщение
Я вот смотрю на свой код - вообще сразу понятно, что * заменяется на 0 и 1, остальные символы пропускаются.
Не могу судить, где понятнее. Возможно, если бы я, действительно, типы прописал, то стало бы яснее...

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
Но ведь я могу судить о производительности по выбранным алгоритмам и структурам данных?
С одной стороны да... Но должны быть определённые гарантии со стороны компилятора. В половине случаев, в реальной ситуации, "на глаз", по исходному коду даже производительность Java нельзя оценить, а она императивная. А в Haskell и структуры данных другие... Боюсь, что если гнаться за предсказуемостью производительности, то код из функционального превратиться в процедурный...

0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
03.02.2016, 18:02 23
Цитата Сообщение от ct0r Посмотреть сообщение
Вектор - это тупо непрерывный блок памяти, очень эффективная хэш-таблица по индексу.
При чём тут хэш-таблица?
Смотрим время замены элемента в векторе - О(n+1).
Смотрим время вставки элемента в Map - O(log n).
Извлечение из вектора, конечно, быстрее. И, для вектора, можно сразу все элементы для одной маски вставить. Но, в начале, когда элементов ещё мало, Map выигрывает. А дальше, уже в зависимости от того, сколько неиспользуемых кодов останется. Считаем и думаем.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.02.2016, 19:34  [ТС] 24

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
функциональщина, императифщина и объектнооринтированность в одном флаконе. такой цепепе с человечьим лицом. о чем еще можно мечтать?
О STM конечно же! :D



Цитата Сообщение от mporro Посмотреть сообщение
Но должны быть определённые гарантии со стороны компилятора
Вроде какие-то есть

Цитата Сообщение от mporro Посмотреть сообщение
А в Haskell и структуры данных другие...
В каком смысле другие?

Цитата Сообщение от mporro Посмотреть сообщение
Боюсь, что если гнаться за предсказуемостью производительности, то код из функционального превратиться в процедурный...
А разве дело в этом? Я думал, что в дефолтной ленивости.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
При чём тут хэш-таблица?
При том, что это альтернативная реализация ассоциативного массива.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Извлечение из вектора, конечно, быстрее. И, для вектора, можно сразу все элементы для одной маски вставить. Но, в начале, когда элементов ещё мало, Map выигрывает. А дальше, уже в зависимости от того, сколько неиспользуемых кодов останется. Считаем и думаем.
Так, давай разберемся, а то я вижу, что мы запутались.
Мутабельный вектор - Data.Vector.Mutable. У него не самый удобный интерфейс, нужно манипулировать с монадами. Его рассматриваем в крайнем случае.
Иммутабельный вектор - Data.Vector. Все замечательно. У меня всего лишь tolist, replicate, //. Это O(n) - и лучше не получится сделать.
Data.Map.Strict - O(nlogn). (кстати есть более интересный вариант Data.IntMap.Strict)
1
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
03.02.2016, 20:03 25
Цитата Сообщение от ct0r Посмотреть сообщение
При том, что это альтернативная реализация ассоциативного массива.
Vector - это именно непрерывный блок памяти. Ассоциативный массив - это Data.Array.
Цитата Сообщение от ct0r Посмотреть сообщение
Мутабельный вектор - Data.Vector.Mutable
Вот Вам с Data.Vector.Mutable
Кликните здесь для просмотра всего текста
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
42
43
44
import System.Environment
import System.IO
import Data.Bits
import qualified Data.Vector.Mutable as M
import Control.Monad
 
showBin:: Int -> Int -> String
showBin width val = 
    let go i | i < 0 = ""
             | otherwise = (if testBit val i then '1' else '0') : go (i-1)
    in go $ width - 1
 
parseMask:: String -> [Int]
parseMask = fst . go 
    where go [] = ([0],0)
          go ('0':xs) = let (r,n)= go xs in (r,n+1)
          go ('1':xs) = let (r,n)= go xs 
                            m = bit n   
                        in (map (m .|.) r,n+1)
          go ('*':xs) = let (r,n)= go xs 
                            m = bit n   
                        in (r ++ map (m .|.) r,n+1)
          go _ = error "invalid mask" 
 
main :: IO ()
main = do
  [inputFile, maskLength'] <- getArgs
  let maskLength = read maskLength'
      arraySz = bit maskLength
  withFile inputFile ReadMode $ \fd -> do 
    a <- M.replicate arraySz " INVALID"
    let byLine = do
            eof <- hIsEOF fd
            unless eof $ do
                s <- hGetLine fd
                let (mask,instr) = splitAt maskLength s
                    wrA i = M.unsafeWrite a i instr 
                unless (null instr) $ 
                    mapM_ wrA $ parseMask mask
                byLine
    byLine
    forM_ [0..  arraySz-1] $ \k -> do
        putStr $ showBin maskLength k
        M.unsafeRead a k >>= putStrLn
Цитата Сообщение от ct0r Посмотреть сообщение
Data.Map.Strict - O(nlogn)
Я использовал функцию insert, для неё O(log n).
Цитата Сообщение от ct0r Посмотреть сообщение
кстати есть более интересный вариант Data.IntMap.Strict
Да, с ним быстрее чем с Data.Map.
1
mporro
03.02.2016, 20:21
  #26

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
В каком смысле другие?
В том смысле, что естественным способом для Haskell представления данных является описание методов конструирования этих данных, а не хранения данных в коробочках. Я бы сказал так.

Цитата Сообщение от ct0r Посмотреть сообщение
А разве дело в этом? Я думал, что в дефолтной ленивости.
Так дело именно в том, что для предсказуемости в производительности придётся отказываться от ленивости, потому что непонятно заранее ускорит ли это выполнение или замедлит. Ведь аппликативная редукция всегда завершается быстрее (если, конечно, вообще завершается)... Но вдруг мы сможем и не вычисляя отбросит аргумент? Я бы не стал на это делать ставки.

Также придётся отказаться от представления данных процедурами их порождения, потому что хорошо работающие на запускаемой архитектуре алгоритмы эффективно работают именно на коробочках.

Но это всё злые языки говорят... Я сам не проверял.

0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.02.2016, 20:52  [ТС] 27
KolodeznyDiver,

Vector можно считать эффективной реализацией ассоциативного массива, если ключи являются числами и есть биекция между ними и целыми числами из множества 0..n-1

С insert я так и считал. n вставок по logn - итого nlogn для алгоритма. С вектором просто n.

mporro, но сами структуры данных там самые обычные - computer science одна для всех.
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
03.02.2016, 21:42 28
Цитата Сообщение от ct0r Посмотреть сообщение
С insert я так и считал. n вставок по logn - итого nlogn для алгоритма.
Не а. Вначале вставляется один элемент в пустой мап, потом один элемент в мап с одним элементом...
Для вектора (не мутабельного) тогда n*(n+1)
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.02.2016, 22:04  [ТС] 29
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Не а. Вначале вставляется один элемент в пустой мап, потом один элемент в мап с одним элементом...
Ну я немного упростил. Могу показать, что не неа, а ага
log 1 + log 2 + log 3 + ... + log n = log (1*2*3*...*n) = log n!
А вот http://stackoverflow.com/quest... roximation доказательство того, что O(log n!) и O(n log n) одно и то же.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Для вектора (не мутабельного) тогда n*(n+1)
А вот это неа Я же не вставляю по одному элементу, у меня одна bulk операция. Она O(m + n) = O(n + n) = O(n)
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
03.02.2016, 22:34 30
Цитата Сообщение от ct0r Посмотреть сообщение
log 1 + log 2 + log 3 + ... + log n = log (1*2*3*...*n) = log n!
А вот http://stackoverflow.com/quest... roximation доказательство того, что O(log n!) и O(n log n) одно и то же.
Конгениально! получается, что
log 1 + log 2 + log 3 + ... + log n = log n + log n + log n + ... + log n

Цитата Сообщение от ct0r Посмотреть сообщение
Я же не вставляю по одному элементу, у меня одна bulk операция. Она O(m + n) = O(n + n) = O(n)
Я считал, что делалось бы у меня в коде, если заменить Map на Vector. У Вас, в СП, основная работа со списками (тормоза!), а вектор только для вставки неиспользованных значений, для этого он и не нужен.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.02.2016, 22:46  [ТС] 31
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
получается, что
log 1 + log 2 + log 3 + ... + log n = log n + log n + log n + ... + log n
Да, в асимптотике так и есть (то есть не забываем про О).

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
У Вас, в СП, основная работа со списками (тормоза!), а вектор только для вставки неиспользованных значений, для этого он и не нужен.
Где именно тормоза? А вектор нужен для вставки и сортировки. Это как раз львиная часть работы от всего. И он тут решает.
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
03.02.2016, 23:18 32
Цитата Сообщение от ct0r Посмотреть сообщение
Да, в асимптотике так и есть (то есть не забываем про О).
при чём тут асимптотика? log 1 + log 2 + log 3 + ... + log n не может быть равно n * log n
Цитата Сообщение от ct0r Посмотреть сообщение
Где именно тормоза?
В использовании списка списков, show.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.02.2016, 23:27  [ТС] 33
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
log 1 + log 2 + log 3 + ... + log n не может быть равно n * log n
А где утверждается, что может?

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
В использовании списка списков, show.
Я поисследую этот вопрос.

Добавлено через 1 минуту
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
при чём тут асимптотика?
В смысле? При том https://ru.wikipedia.org/wiki/... 0%BE%D0%B5

Добавлено через 2 минуты
А вот еще кстати:
https://en.wikipedia.org/wiki/Big_O_notation
Находим параграф Orders of common functions.
Смотрим: O(nlogn) = O(logn!)
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
04.02.2016, 01:04 34
Цитата Сообщение от ct0r Посмотреть сообщение
А где утверждается, что может?
Я про время выполнения при вполне конкретных, не ассимптотических n.

Не по теме:

Не исключено, что я чего то не понимаю, по этому пойду спать. :)



Добавлено через 1 час 25 минут

Не по теме:

Уснёшь тут, когда всякие асимптоты в голове прыгают ...


О(), они, да, справедливы в пределах. Но суть то в чём.
Допустим, длина маски 8, вариантов 256.
Для Map, первые элементы вставляются очень быстро, потому что всех данных словаря мало.
А для вектора, он сразу размером в 256. И каждая замена его элемента выполняется копированием всего вектора (он же не мутабельный). Особенно будет заметна разница (в пользу Map), если " INVALID"-ов останется много и Map даже в конце его заполнения окажется небольшим.
Вы же спрашивали
Цитата Сообщение от ct0r Посмотреть сообщение
почему использование Map лучше использования Vector в данной программе?
Вот, я и отвечаю, про данную программу - (свой первый вариант в этой теме).
0
pycture
04.02.2016, 06:40
  #35

Не по теме:

Кликните здесь для просмотра всего текста
STM ... разве его гдето нету?
Цитата Сообщение от ct0r Посмотреть сообщение
Смотрю на твой код - мне нужно время, чтобы в это врубиться. Представь, что ты видишь эти коды в первый раз. В логику какого ты быстрее врубишься? Я хочу понять, твой код действительно требует большего вдупления, или это у меня просто от недостатка практики?
все познается в сравнении, грю же что конченым плюсистам вот такое должно быть гораздо ближе (для разнообразия) http://ideone.com/GwuQPy

0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.02.2016, 15:30  [ТС] 36
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
А для вектора, он сразу размером в 256. И каждая замена его элемента выполняется копированием всего вектора (он же не мутабельный). Особенно будет заметна разница (в пользу Map), если " INVALID"-ов останется много и Map даже в конце его заполнения окажется небольшим.
Я использую массовую замену. Это лишь одно копирование вектора.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
В использовании списка списков, show.
Надо изменить
Haskell
1
generateOpcodesFromMask ('*':ms) = [((head $ show x):y) | x <- [0, 1], y <- generateOpcodesFromMask ms]
на
Haskell
1
generateOpcodesFromMask ('*':ms) = [(x:y) | x <- ['0', '1'], y <- generateOpcodesFromMask ms]
Это я нехило тупанул
В списках не вижу пока проблемы. У меня только операции либо доступа к голове списка, либо прохода по всем элементам.
Вот может рассмотреть замену String на Data.ByteString.Char8?

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
все познается в сравнении, грю же что конченым плюсистам вот такое должно быть гораздо ближе
Ну да, смахивает :D Но пока у меня план познать Haskell и Common Lisp, а вот дальше можно будет посмотреть и на остальное, вдруг что на основе приобретенного опыта понравится еще больше: Racket, OCaml, Elixir, Rust, Scala, Clojure...

0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
04.02.2016, 16:53 37
Цитата Сообщение от ct0r Посмотреть сообщение
Вот может рассмотреть замену String на Data.ByteString.Char8?
Попробуйте, отчего же не попробовать? Если цель - самообучение, то попробуйте читать файл conduit-ом, к примеру. А то целиком файл в строку Вы и сами прочитали. Я "по сишному", с построчным чтением, изобразил.
А "по взрослому" - большие последовательности данных (возможно бесконечные) conduit-ами или пайпами.
Ну, я так, к примеру. В этом разделе примеры есть.

И, кстати, по какой книжке(ам) Вы Haskell учили?
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.02.2016, 19:00  [ТС] 38
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И, кстати, по какой книжке(ам) Вы Haskell учили?
Я прочитал Learn You a Haskell for Great Good! и читаю Haskell Programming from First Principles.
Прогнал себя через этот курс: http://www.cis.upenn.edu/~cis1... tures.html
Начал читать Симона Марлоу, почти дочитал про монаду Eval (дошел до распараллеливания k-средних).
Иногда заглядываю в What I Wish I Knew When Learning Haskell.

Сейчас, когда я дошел до монадных трансформеров, я решил устаканить свои знания, налегая на практику. Вот пробую понаписать чего-нибудь и получить обратную связь.
1
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.02.2016, 19:24  [ТС] 39
Немного переписал:
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
42
43
{-# LANGUAGE OverloadedStrings #-}
 
module Main where
 
import Control.Applicative
import Control.Monad
import qualified Data.ByteString.Char8 as S8
import Data.Char
import Data.List
import qualified Data.Vector as V
import System.Environment
import System.IO
 
generateOpcodesFromMask :: S8.ByteString -> [S8.ByteString]
generateOpcodesFromMask mask
  | S8.null mask = [""]
  | S8.head mask == '*' = [S8.cons x y | x <- ['0', '1'], y <- generateOpcodesFromMask (S8.tail mask)]
  | otherwise = [S8.cons (S8.head mask) y | y <- generateOpcodesFromMask (S8.tail mask)]
 
convertOpcodes :: [S8.ByteString] -> [Int]
convertOpcodes opcodes = S8.foldl' (\a b -> 2 * a + digitToInt b) 0 <$> opcodes
 
addNameToOpcodes :: S8.ByteString -> [Int] -> [(Int, S8.ByteString)]
addNameToOpcodes name = fmap (\x -> (x, name))
 
getOpcodesWithName :: [S8.ByteString] -> [(Int, S8.ByteString)]
getOpcodesWithName [mask, name] = addNameToOpcodes name $ convertOpcodes $ generateOpcodesFromMask mask
getOpcodesWithName _ = error "getOpcodesWithName: invalid line"
 
fillFreeOpcodes :: Int -> [(Int, S8.ByteString)] -> [S8.ByteString]
fillFreeOpcodes maskLength opcodes = V.toList $ V.replicate (2 ^ maskLength) "INVALID" V.// opcodes
 
solveProblem :: Int -> [[S8.ByteString]] -> [S8.ByteString]
solveProblem maskLength contents = fillFreeOpcodes maskLength $ contents >>= getOpcodesWithName
 
main :: IO ()
main = do
  [inputFile, maskLength] <- getArgs
  contents <- S8.readFile inputFile
  S8.putStrLn $ S8.concat ["const std::vector<InstructionType> instructions_decoding_table{",
                           S8.unlines $ (\name -> S8.concat ["InstructionType::", name, ","]) <$>
                             (solveProblem (read maskLength) $ S8.words <$> (S8.lines contents)),
                           "};"]
PS Читал недавно про свободные монады, неподвижную точку функтора и Y-комбинатор, семантику денотации и комбинаторы парсеров. Это жесть, мой мозг гудит
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
10.02.2016, 23:39 40
Изменения "просто так"
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{-# LANGUAGE OverloadedStrings,ViewPatterns #-}
 
-- ...
 
generateOpcodesFromMask (S8.uncons -> Just('*',t)) = do
    x <- ['0', '1']
    y <- generateOpcodesFromMask t
    [S8.cons x y]
generateOpcodesFromMask (S8.uncons -> Just(h,t)) = do
    y <- generateOpcodesFromMask t
    [S8.cons h y]
generateOpcodesFromMask _ = [""]
 
-- ...
 
addNameToOpcodes name = map (flip (,) name)

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
Читал недавно про свободные монады, неподвижную точку функтора и Y-комбинатор, семантику денотации и комбинаторы парсеров.
Такими темпами можно будет скоро к сложным вещам переходить. :)

1
10.02.2016, 23:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2016, 23:39
Помогаю со студенческими работами здесь

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

Разбор строчек небольшого кода
Помогите разобрать каждую строку ( что она делает - описание ) #include &lt;iostream&gt; using...

Анализ небольшого кода по файлам
Помогите пожалуйста с кодом! Все вроде правильно и без синтаксических ошибок, но выдает &quot;Abnormal...

Оптимизация небольшого кода, out of memory
За основу был взят вот этот код, точнее процедура: var MyStringList: TStringList; i, j,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru