-- NAME: Alex Price MATRIC NUMBER: 0561823 -- To run the competition entry, simply run the command runcomp import LSystem -- 1. join :: [Command] -> Command join commandlist = foldr1 (:#) commandlist -- 2. split :: Command -> [Command] split command = reverse (split' command) split' :: Command -> [Command] split' (command :# commandlist) = commandlist: (reverse (split command)) split' command = command:[] -- 3. copy :: Int -> Command -> Command copy number command = join (replicate number command) -- 4. hexagon :: Distance -> Command hexagon distance = copy 6 (Go distance :# Turn 60) -- 5. polygon :: Distance -> Int -> Command polygon distance number = copy number (Go distance :# Turn (fromIntegral (div 360 number))) -- 6. spiral :: Distance -> Int -> Distance -> Angle -> Command spiral distance times loweredby angle = join [Go (distance - ((loweredby) * (fromIntegral x))) :# Turn angle | x <- [0..(times - 1)]] -- 7. optimise :: Command -> Command optimise command = join (removesits (join (optimise' (removesits command)))) removesits :: Command -> [Command] removesits command = [item | item <- (split command), item /= Sit, item /= Go 0, item /= Turn 0] optimise' :: [Command] -> [Command] optimise' [] = [] optimise' (Go x:Go y:xs) = optimise' (Go (x+y):xs) optimise' (Turn x:Turn y:xs) = optimise' (Turn (x+y):xs) optimise' (Turn x:Go y:xs) = Turn x: optimise' (Go y:xs) optimise' (Go x:Turn y:xs) = Go x: optimise' (Turn y:xs) optimise' (x:xs) = x:optimise' xs -- 8. arrowhead :: Int -> Command arrowhead x = n :# f x where f 0 = GrabPen red :# Go 10 f (x+1) = g x :# p :# f x :# p :# g x g 0 = GrabPen blue :# Go 10 g (x+1) = f x :# n :# g x :# n :# f x n = Turn 60 p = Turn (-60) -- 9. branch :: Int -> Command branch x = g x where g 0 = GrabPen red :# Go 10 g (x+1) = f x :# n :# Branch (Branch (g x) :# p :# g x) :# p :# f x :# Branch (p :# f x :# g x) :# n :# g x f 0 = GrabPen blue :# Go 10 f (x+1) = f x :# f x n = Turn 22.5 p = Turn (-22.5) -- 10. hilbert :: Int -> Command hilbert x = l x where l 0 = GrabPen red :# Go 10 l (x+1) = p :# r x :# f x :# n :# l x :# f x :# l x :# n :# f x :# r x :# p r 0 = GrabPen blue :# Go 10 r (x+1) = n :# l x :# f x :# p :# r x :# f x :# r x :# p :# f x :# l x :# n f x = GrabPen green :# Go 10 n = Turn 90 p = Turn (-90) -- To run the competition entry, simply run the command runcomp runcomp = display 0.52 competition competition :: Command competition = GrabPen Inkless :# Go (200) :# GrabPen black :# competition' 5 :# Turn 20 :# GrabPen Inkless :# Go 400 :# p :# Go 330 :# n :# b :# GrabPen black :# ff :# GrabPen Inkless :# b :# n :# GrabPen black :# f :# n :# f :# Turn 180 :# GrabPen Inkless :# f :# GrabPen black :# f :# n :# GrabPen Inkless :# Go 20 :# Turn 70 :# GrabPen black :# Go 106 :# Turn (-140) :# Go 106 :# GrabPen Inkless :# Go (-53) :# Turn 70 :# GrabPen black :# Go (-35) :# GrabPen Inkless :# Go 70 :# Turn 90 :# Go 50 :# Turn (-90) :# Go 50 :# drawans :# Go 70 :# Turn 90 :# GrabPen black :# Go 100 :# GrabPen Inkless :# Go (-50) :# Turn (-35) :# GrabPen black :# Go 60 :# GrabPen Inkless :# Go (-60) :# Turn (-110) :# GrabPen black :# Go 60 :# Turn 55 :# GrabPen Inkless :# Go 20 :# GrabPen black :# Go 50 :# GrabPen Inkless :# Go (-50) :# Turn 90 :# GrabPen black :# Go 50 :# Turn (-90) :# Go 50 :# GrabPen Inkless :# Go (-50) :# Turn 90 :# GrabPen black :# Go 50 :# Turn (-90) :# Go 50 :# GrabPen Inkless :# Go 20 :# Turn (-90) :# drawanl :# Go 20 :# Turn 90 :# Go 100 :# Turn 180 :# drawanl :# Go 100 :# Turn 90 :# GrabPen black :# Go 100 :# GrabPen Inkless :# Turn (-90) :# Go 70 :# drawans :# Go 160 :# GrabPen black :# Go 80 :# GrabPen Inkless :# Go (-80) :# Turn 90 :# GrabPen black :# Go 100 :# Turn (-90) :# Go 80 :# GrabPen Inkless :# Go 20 :# drawano :# Go 90 :# drawano :# Go 90 :# Turn (-90) :# drawanl :# Go 20 :# GrabPen black :# Go 5 :# Turn 90 :# Go 5 :# Turn 90 :# Go 5 :# Turn 90 :# Go 5 :# Turn 90 :# GrabPen Inkless :# Go 2.5 :# Turn 90 :# Go 10 :# GrabPen black :# Go 90 :# GrabPen Inkless :# Turn 50 :# Go 920 :# Turn (40) :# GrabPen black :# Go 50 :# Turn 90 :# Go 30 :# Turn 90 :# Go 30 :# Turn (-70) :# Go 50 :# Turn (-40) :# Go 140 :# Turn 110 :# Go 30 :# Turn 70 :# Go 100 :# Turn (-140) :# Go 100 :# Turn 70 :# Go 30 :# Turn 108 :# Go 220 :# Turn (75) :# Go 10 where n = Turn 90 drawans = GrabPen black :# Go (-50) :# Turn (-90) :# Go (50) :# Turn 90 :# Go 50 :# Turn (-90) :# Go 50 :# Turn 90 :# Go (-50) :# GrabPen Inkless drawanl = GrabPen black :# Go 100 :# Turn 90 :# Go 60 :# GrabPen Inkless drawano = GrabPen black :# Go 70 :# Turn (-90) :# Go 100 :# Turn (-90) :# Go 70 :# Turn (-90) :# Go 100 :# Turn (-90) :# GrabPen Inkless p = Turn (-90) f = Go 50 ff = Go 100 b = Go (-50) bb = Go (-100) competition' :: Int -> Command competition' x = a x where a 0 = GrabPen blue :# polygon 10 8 :# GrabPen red a (x+1) = a x :# c x :# a x c x = GrabPen red :# spiral 10 100 0.1 4 -- To run the competition entry, simply run the command runcomp