菱形

菱形

簡單

說明

鑽石 kata 的輸入是一個字母,輸出則是鑽石形狀。 給定一個字母,它會印出一個以 'A' 開頭、並讓傳入的字母落在最寬處的鑽石。

需求

  • 第一列包含一個 'A'。
  • 最後一列包含一個 'A'。
  • 除了第一列和最後一列之外,每一列都恰好有兩個相同的字母。
  • 每一列的前導空格數和尾隨空格數相同。(可能是 0。)
  • 鑽石左右對稱。
  • 鑽石上下對稱。
  • 鑽石是正方形(寬度等於高度)。
  • 字母排成鑽石形狀。
  • 上半部的字母依升序排列。
  • 下半部的字母依降序排列。
  • 四個角落(空白的部分)是三角形。

範例

在以下範例中,空白以·字元表示。

字母 'A' 的鑽石:

A

字母 'C' 的鑽石:

··A··
·B·B·
C···C
·B·B·
··A··

字母 'E' 的鑽石:

····A····
···B·B···
··C···C··
·D·····D·
E·······E
·D·····D·
··C···C··
···B·B···
····A····

提示

你需要實作diamond函式,它會印出一個菱形,這個菱形從A開始,並在最寬處使用指定的字元。如果你不確定型別,可以使用提供的簽名,但別讓它限制了你的創意:

diamond :: Char -> Maybe [String]

這個練習處理的是文字資料。基於歷史因素,Haskell 的String型別與[Char]同義,也就是字元陣列。若要更有效率地處理文字資料,可以使用Text型別。

作為這個練習的選用延伸,你可以

  • 閱讀 Haskell 的字串型別。
  • 在 package.yaml 的相依清單中加入- text。
  • 依照下列方式匯入Data.Text:
import qualified Data.Text as T
import           Data.Text (Text)
  • 現在你可以寫出例如diamond :: Char -> Maybe [Text],並用例如T.pack來取用Data.Text的組合子,
  • 查閱Data.Text的文件,
  • 接著你可以在 Diamond.hs 中,把所有String的出現位置替換成Text:
diamond :: Char -> Maybe [Text]

這部分完全是選用的喔。


出處

Seb Rose連結會在新視窗或分頁中開啟
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Haskell Exercism

準備好開始 菱形 了嗎?

註冊 Exercism,透過 107 個練習 和真人引導來學習並精通 Haskell,全部免費。