ichigo663
ichigo663

Reputation: 79

Haskell flag pattern writing function?

I really need help in writing this function in Haskell, I don't even know where to start. Here are the specs:

Define a function flagpattern that takes a positive Int value greater than or equal to five and returns a String that can be displayed as the following `flag' pattern of dimension n, e.g.

Main> putStr (flagpattern 7)

#######  
##   ##  
# # # #  
#  #  #  
# # # #  
##   ##  
#######

Upvotes: 0

Views: 801

Answers (3)

Dan Burton
Dan Burton

Reputation: 53665

Start with the type signature.

flagpattern :: Int -> String

Now break the problem into subproblems. For example, suppose I told you to produce row 2 of a size 7 flag pattern. You would write:

XX   XX

Or row 3 of a size 7 flag pattern would be

X X X X

So suppose we had a function that could produce a given row. Then we'd have

flagpattern :: Int -> String
flagpattern size = unlines (??? flagrow ???)

flagrow :: Int -> Int -> String
flagrow row size = ???

unlines takes a list of Strings and turns it into a single String with newlines between each element of the list. See if you can define flagrow, and get it working correctly for any given row and size. Then see if you can use flagrow to define flagpattern.

Upvotes: 1

Matvey Aksenov
Matvey Aksenov

Reputation: 3900

You should start from your problem definition:

main :: IO ()
main = putStr . flagPattern $ 7

Then, you should ask yourself about how much dots flag has:

flagPattern :: Int -> String
flagPattern = magic $ [1..numberOfDots]

Then, (hard) part of magic function should decide for each dot whether it is   or #:

partOfMagic ...
  | ...       = "#" -- or maybe even "#\n" in some cases?
  | otherwise = " "

Then, you can concatenate parts into one string and get the answer.

Upvotes: 1

sdcvvc
sdcvvc

Reputation: 25644

Assuming you want a "X" enclosed in 4 lines, you need to write a function that given a coordinate (x,y) returns what character should be at that position:

coordinate n x y = if i == 0 then 'X' else ' '

(This version outputs only the leftmost X'es, modify it, remember indices start with 0)

Now you want them nicely arranged in a matrix, use a list comprehension, described in the linked text.

Upvotes: 1

Related Questions