Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commite7817a9a9646331b7a7de401d1cab9e69f5ed041 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-12-22 12:06:30 +0200
Committer
 Syndamia <kamen@syndamia.com>
2022-12-22 12:06:30 +0200
Files2331b04ae1ecd6abb4b8007b3fe652ba10171764
uni-projects-e7817a9a9646331b7a7de401d1cab9e69f5ed041.tar
uni-projects-e7817a9a9646331b7a7de401d1cab9e69f5ed041.tar.gz
uni-projects-e7817a9a9646331b7a7de401d1cab9e69f5ed041.zip
Parentde88ed815e26ef76868c2e0fb6fd069511d311d2 (diff)
[FP/HW3] Fixed missing generation in first exercise
1 files changed, 20 insertions, 16 deletions
-rw-r--r--Year 2/Functional Programming/hw3.hs36
diff --git a/Year 2/Functional Programming/hw3.hs b/Year 2/Functional Programming/hw3.hs
index 446c83c..90d30f5 100644
--- a/Year 2/Functional Programming/hw3.hs
+++ b/Year 2/Functional Programming/hw3.hs
@@ -1,22 +1,26 @@
-- Задача 1
generate :: [Int] -> [Int] -> [[Int]]
-generate as bs = [x : take (takelen - skiplen) (drop skiplen alx) | x <- as,
- -- Най-дългата последователност от редуващи се числа, започвайки от x, без x
- -- Примерно: [20, 25, 30, 35, 40]
- let alx = tail (alterconif x as bs []),
- -- Вземаме първите няколко от тях за да образуваме по-къса редуваща се последователност
- -- Вземаме нечетен брой, понеже x винаги го долепяме в началото
- -- Примерно ще вземем: [20], [20, 25, 30], [20, 25, 30, 35, 40]
- takelen <- [1,3..(length alx)],
- -- За всяка по-къса редуваща се последователност, взимаме брой елементи от края,
- -- за да изброим всички възможности, при които числото от bs е по-голямо от x
- -- (може да има повече от едно число от bs > x и може да има достатъчно числа в
- -- bs и as за да се продължи построението)
- -- Примерно: за [20] взимаме само [20]
- -- за [20, 25, 30] взимаме [20, 25, 30] и [30]
- -- за [20, 25, 30, 35, 40] взимаме [20, 25, 30, 35, 40], [30, 35, 40] и [40]
- skiplen <- [0,2..(takelen - 1)]]
+generate as bs = [x : take (takelen - skiplen) (head dropped : dropped !! trailingStart : (drop (1 + trailingStart + trailingContinue) dropped)) |
+ x <- as,
+ -- Най-дългата последователност от редуващи се числа, започвайки от x, без x
+ -- Примерно: [20, 25, 30, 35, 40]
+ let alx = tail (alterconif x as bs []),
+ -- Вземаме първите няколко от тях за да образуваме по-къса редуваща се последователност
+ -- Вземаме нечетен брой, понеже x винаги го долепяме в началото
+ -- Примерно ще вземем: [20], [20, 25, 30], [20, 25, 30, 35, 40]
+ takelen <- [1,3..(length alx)],
+ -- За всяка по-къса редуваща се последователност, взимаме брой елементи от края,
+ -- за да изброим всички възможности, при които числото от bs е по-голямо от x
+ -- (може да има повече от едно число от bs > x и може да има достатъчно числа в
+ -- bs и as за да се продължи построението)
+ -- Примерно: за [20] взимаме само [20]
+ -- за [20, 25, 30] взимаме [20, 25, 30] и [30]
+ -- за [20, 25, 30, 35, 40] взимаме [20, 25, 30, 35, 40], [30, 35, 40] и [40]
+ skiplen <- [0,2..(takelen - 1)],
+ let dropped = drop skiplen alx,
+ trailingStart <- if takelen >= 5 then [1,3..(takelen - skiplen - 1)] else [1],
+ trailingContinue <- if takelen >= 5 then [0,2..(takelen - skiplen - 1 - trailingStart)] else [0]]
where
-- Създава лист, където елементите на четни индекси са от a, нечетните са от b, и всички са в растящ ред
-- cn се използва за осигуряване на растящия ред, така че първоначалната му стойност ще премахне всички елементи по-малки от него