教會孩子「偷懶」的藝術 — 用畫框框學會文字壓縮(Text Compression)

如果你要罰寫「我以後上課不講話」一百遍,你會不會覺得手很痠?你會不會希望有一個魔法,只要寫一次,剩下的用箭頭指一下就好?

恭喜你,你的想法跟電腦科學家一模一樣!

電腦的硬碟空間有限,網路傳輸也需要時間。為了「省空間」和「省時間」,電腦發明了一種把文字變短的魔法,我們稱為「壓縮(Compression)」。今天我們不用電腦,只用紙筆,來破解這個魔法。

第一階段:發現痛點 (The Need for Speed)

  • 聽寫挑戰:準備一首重複性很高的兒歌(例如中的《The Rain》或《Baby Shark》)。
  • 老師:「我現在要唸一首詩,請你把每一個字都寫下來,比比看誰寫得快。」
  • 念稿:刻意唸快一點。「Pitter patter, pitter patter, listen to the rain…」
  • 觀察:孩子會抱怨來不及寫,或者手很痠。

建構式提問:

  • 老師:「這首詩有沒有讓你覺得很特別的地方?」
  • 孩子:「有!一直重複 Pitter patter!」
  • 老師:「如果你是個超級聰明的抄寫員,你有沒有辦法少寫幾個字,但還是讓別人看得懂這首詩?」
  • (聆聽孩子的創意:他們可能會寫 ” x 2 “,或是畫箭頭)

第二階段:發明符號 (The “Box and Pointer” Method)

現在引入「框框與箭頭」概念,但要把它描述成一種「省力工具」。

1. 示範:

  • 老師:「你的箭頭畫得很棒!電腦也用類似的方法。當它看到前面已經出現過的字,它就會畫一個框框把它『框起來』,然後在下一次要寫的時候,用一個箭頭指回去說:『嘿,跟那裡一樣!』」

2. 實作練習:

  • 老師:「看這張圖,有些字不見了,只剩下指路標(箭頭)。請你當解碼員,順著箭頭回去找,把原本的字填回來。」
  • 觀察重點
    • 孩子是否有發現箭頭是指向「幾個字」?
    • 孩子是否有發現箭頭的起點和終點代表什麼?

第三階段:挑戰極限 (The “Banana” Problem)

這個 Ban(2,3) 變成 Banana 的例子,是整個文字壓縮活動中最燒腦、但也最精華的部分。

這在電腦科學中稱為「LZ77 演算法的自我指涉(Self-reference)」。

對孩子(甚至大人)來說,這裡的邏輯障礙在於:

「電腦叫我往回數 2 個字,然後複製 3 個字。可是往回數只有 a 和 n 這 2 個字啊?第 3 個字根本還沒寫出來,我要怎麼複製?」

為了幫助您用建構式的方法教導這一點,我們要將「一次貼上」的觀念,轉變為「一個字一個字搬運」的動態過程。

1. 核心概念:不是「拍照貼上」,是「跟屁蟲機器人」

傳統教法會把 (2,3) 解釋為一個靜態指令。但實際上,這是一個動態指令

  • 前面的數字 (2):代表「跟屁蟲」距離筆尖多遠(往回看幾格)。
  • 後面的數字 (3):代表機器人要走幾步路(重複幾次動作)。
2. 視覺化慢動作分解 (Step-by-Step Visualization)

我們拿一張紙條,寫上 B、a、n,然後在後面畫三個空格 _ _ _。
指令是:往回 2 格,複製 3 次

第一步
  • 現況:B a n [ ] _ _
  • 動作:游標往回看 2 格。
    • n (1格前) ← a (2格前)
    • 機器人看到了 a
  • 寫下:把 a 寫在[ ]裡。
  • 結果:B a n [a] _ _
第二步
  • 現況:B a n a [ ] _
  • 關鍵點:機器人依然遵守「往回看 2 格」的規則。
  • 動作:游標往回看 2 格。
    • a (1格前) ← n (2格前)
    • 機器人看到了 n
  • 寫下:把 n 寫在[ ]裡。
  • 結果:B a n a [n] _
第三步 —— 最神奇的一刻
  • 現況:B a n a n [ ]
  • 動作:機器人繼續遵守「往回看 2 格」。
    • n (1格前) ← a (2格前)
    • 注意! 這個 a 是誰?這個 a 就是我們在第一步剛剛寫出來的那個 a
    • 我們正在複製「剛剛才產生的新東西」。
  • 寫下:把 a 寫在[ ]裡。
  • 結果:B a n a n [a]
Try it

COMMAND_MODULE

MEMORY_BUFFER ADDR: 0x0000 – 0x0005

SYSTEM_LOG
3. 深入意涵:這代表什麼?(The "Pattern" Insight)

當 複製長度 (Length) > 往回距離 (Distance) 時,就會發生這種「自我抄襲」的現象。這在電腦科學中代表什麼?

它代表「重複模式 (Repeating Pattern)」。

  • Ban(2, 3) 意思就是:請把最後 2 個字 an,當作一個印章,連續蓋下去,直到蓋滿 3 個字為止。
  • 如果是 Ban(2, 10) 呢?
    • 就會變成 B + an an an an an... = Bananananana...

教導 Banana 例子的關鍵在於打破「靜態複製」的迷思

請使用「時間軸」或「慢動作」的概念,讓孩子親手一個字、一個字地寫出來。當他們發現第三個字 a 是來自於他們第一步寫下的 a 時,他們就懂了壓縮演算法中最精妙的「滑動視窗(Sliding Window)」概念了。

第四階段:連結現實 (Why does it matter?)

老師:「你知道為什麼我們需要這麼麻煩嗎?」

  • 提問:「想像你要把整個圖書館的書裝進一個行李箱。如果書裡面有很多重複的句子,我們用這種『畫箭頭』的方法,書本會變薄還是變厚?」
  • 總結:「這就是為什麼你可以很快地下載遊戲,或是看 YouTube 不會一直轉圈圈。因為聰明的電腦先把重複的資料『壓縮』了,傳到你家再『解壓縮』還原回來。這就是 ZIP 檔和 PNG 圖片的原理!」

教學觀察重點表 (Clinical Interview Guide)

觀察點較無效的反應 (Less Effective)較有效的引導 (More Effective)
當孩子看不懂箭頭指向哪裡「你看,箭頭指著 P,所以你要填 P。」(直接給答案)「試著用手指頭沿著這條線走走看。它最後停在哪個字上面?那個字是誰?」
處理 Banana 難題 (重疊複製)「公式是 (2,3),往前 2 個,長度 3 個。」「我們來當個機器人,指令只有一個:『抄襲前面第 2 個字』。我們做三次這個動作看看會發生什麼事?」
討論壓縮效率「文字壓縮率計算公式是...」「你覺得哪一種文章最容易被壓縮?是一本字典,還是一本一直在說『吃葡萄不吐葡萄皮』的書?」(引導發現重複性越高,壓縮越有效)

給家長/老師的建議:

這篇文章的核心在於「視覺化」。不要急著跳到數字(例如挑戰極限中的 Ban(2,3)),先讓孩子習慣畫框框和拉線。

當孩子能夠熟練地用線條把《小星星》(Twinkle Twinkle Little Star)畫得亂七八糟(充滿箭頭)時,他們就已經掌握了現代網路傳輸最核心的技術之一:LZ 編碼(Ziv-Lempel Coding)

告訴孩子:「下次被罰寫的時候,試試看寫第一遍,後面全部畫箭頭,看看老師會不會佩服你的『運算思維』!(但可能會被打,請自行負責 XD)」

參考來源:csunplugged text_compression