單字計數

單字計數

中等

簡介

你在高中教英文,學生都把英文當成外語來學。

你決定整份課程大綱都以電視節目為基礎。 你需要分析節目裡用到了哪些單字,以及這些單字重複出現的頻率有多高。

這樣一來,你就能挑出最簡單的節目作為起點,再隨著時間慢慢提高難度。

說明

你的任務是計算某部戲劇字幕中每個單字出現的次數。

這些戲劇的字幕只使用 ASCII 字元。

角色們常常用隨性的英文說話,並使用 they're 或 it's 這類縮寫。雖然這些縮寫來自兩個單字(例如 we are),但縮寫本身(we're)會被視為一個單字。

單字之間可以用任何形式的標點符號(例如 ":"、"!" 或 "?")或空白(例如 "\t"、"\n" 或 " ")分隔。唯一不會分隔單字的標點符號,是縮寫裡的撇號。

數字也算單字。如果字幕寫著 It costs 100 dollars.,那麼 100 就是一個單字。

單字不分大小寫。例如,單字 you 在下面這句話中出現了三次:

You come back, you hear me? DO YOU HEAR ME?

結果中單字計數的順序並不重要。

以下範例涵蓋了上面討論的幾個要素:

  • 簡單的單字
  • 縮寫
  • 數字
  • 不分大小寫的單字
  • 用來分隔單字的標點符號(包括撇號)
  • 用來分隔單字的不同空白形式

"That's the password: 'PASSWORD 123'!", cried the Special Agent.\nSo I fled.

這段字幕的對應結果會是:

123: 1
agent: 1
cried: 1
fled: 1
i: 1
password: 2
so: 1
special: 1
that's: 1
the: 2

提示

要完成這道練習,你需要實作wordCount這個函式,它會接收一段文字,並回傳每個單字出現的次數。

如果這是你第一次解這道練習,建議先沿用題目提供的函式簽章:

wordCount :: String -> [(String, Int)]

之後,不妨回過頭重新看看這個問題,玩玩其他的資料型態和函式庫:

  • Text,來自 text 套件。
  • Map,來自 containers 套件。
  • MultiSet,來自 multiset 套件

測試套件刻意設計成能接受幾乎任何合理的型別簽章,所以歡迎你找出自己認為最好的那一種。


出處

這是個經典的玩具問題,但我們是在 Go Tour 中看到它才想起來的。
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Haskell Exercism

準備好開始 單字計數 了嗎?

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