Проблема
Я пытаюсь реализовать модифицированную Кривую дракона из AoC Day 16 в виде бесконечного списка в Haskell.
Список состоит из True
и False
. Начнем с некоторого списка s0
:
s1 = s0 ++ [False] ++ (map not . reverse) s0
s2 = s1 ++ [False] ++ (map not . reverse) s1
s3 = s2 ++ [False] ++ (map not . reverse) s2
В целом
sn = s(n-1) ++ [0] ++ (map not . reverse) s(n-1)
= s0 ++ [0] ++ (f s0) ++ [0] ++ (f (s0 ++ [0] ++ (f s0))) ++ ...
where f = (map not . reverse)
Попытка реализации
Я могу легко получить sn
, используя функцию iterate
.
modifiedDragonCurve :: [Bool] -> Int -> [Bool]
modifiedDragonCurve s n = (iterate f s)!!n
where f s = s ++ [False] ++ (map not . reverse) s
Это дает мне список [s0, s1, s2, ...]
. Однако, поскольку s(n-1)
является префиксом sn
, его можно построить как бесконечный список, но я не могу понять, как к нему подойти. Я думаю, мне нужно что-то вроде
modifiedDragonCurve :: [Bool] -> [Bool]
modifiedDragonCurve s = s ++ [False] ++ (map not . reverse) listSoFar
Но не могу понять, как обратиться к уже сгенерированному списку (listSoFar
).
Любые предложения будут ценны.
[Bool] -> [Bool]
, которая (данный начальный список) генерирует бесконечный список. По сути, я хочу реализовать последовательностьsn = s(n-1) ++ [0] ++ (map not . reverse) s(n-1)
- person Bart Platak   schedule 16.12.2016(iterate f s)!!n
- person freestyle   schedule 16.12.2016