«рисование» фигур чарса / строки по переменной длине диагонали в haskell - PullRequest
1 голос
/ 12 марта 2012

Я ищу функцию (назовем ее ромбом), которая "рисует" ромбовидный "объект", определяя только длину его диагонали (например, как показано ниже, поэтому длина диагонали в этом регистр 5 "*", но видны только 3):

Main> diamond 5

Output:
   *
  ***
 *****
  ***
   *

У меня есть эти функции:

stars x 
    | (x mod 2 == 1) = (firstHalf x) ++ [x] ++ reverse(firstHalf x)
    | otherwise = (firstHalf x) ++ reverse(firstHalf x)`

firstHalf x = take (x div 2) (iterate (2+) 1)

space x = map (div 2) (map ((x+1)-) (stars x))

Пример вывода:

space 5 = [2,1,0,1,2]
stars 5 = [1,3,5,3,1]

Эта функция может работать, но я не знаю, как исправить эту ошибку:

Ошибка типа в приложении:

  • Выражение: replicate (stars x) ['*']
  • Срок: звезды x
  • Тип: [Int]
  • Не соответствует: Int

diamond x = mapM_ putStrLn $ (replicate (space x) [' ']) ++ (replicate (star x) ['*'])

И я думаю, что даже если бы эта ошибка была исправлена, ей все равно потребовалась бы настройка, которая бы объединяла эти два списка, чтобы получить желаемый результат. Есть идеи?

1 Ответ

5 голосов
/ 12 марта 2012

Вы можете сгенерировать количество звездочек с помощью replicate:

ghci> replicate 5 '*'
"*****"

Вы также можете сделать это с любым другим символом, например пробелом (' ').

Вы можете напечатать строку на экране с помощью putStrLn:

ghci> putStrLn (replicate 5 '*')
*****

Вот программа, которая генерирует звезду выше:

main = do
    putStrLn $ replicate 2 ' ' ++ replicate 1 '*'
    putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
    putStrLn $ replicate 0 ' ' ++ replicate 5 '*'
    putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
    putStrLn $ replicate 2 ' ' ++ replicate 1 '*'

Вы можете определить функции с помощью =:

hello x = putStrLn $ "Hello " ++ x
main = do
    hello "Bob"  -- prints "Hello Bob"

(Если вы делаете это из подсказки ghci, вы должны сначала сказать let: например, let hello x = putStrLn $ "Hello " ++ x)

Я не знаю, почему я потратил так много времени на этот вопрос, но мне так хотелось. Обычно мы хотим, чтобы вопросы предоставили некоторые доказательства того, что вы потратили некоторое время, пытаясь решить проблему, прежде чем обращаться за помощью. Счастливого Рождества ...

Я дал вам все кусочки. Теперь вы должны собрать их вместе.

...