デジタル表示
SICPは、もともと大学の教科書のため、数学的な問題が前半多いです。
なので、たまには違うジャンルのプログラムでも書いてみます。
今回は、Best of Ruby Quizという本に出てくる問題。
Quiz2。数字の文字を引数で受け取り、電卓の様な表示を行うというプログラム。
方針としては、数字をAAで表現するリストをつくり、
順に表示させてみます。
import Data.Char list0 = [" -- " ," " ," -- " ," -- " ," " ,\ " -- " ," -- " ," -- " ," -- " ," -- "] list1 = ["| |" ," |" ," |" ," |" ,"| |" ,\ "| " ,"| " ," |" ,"| |" ,"| |"] list2 = ["| |" ," |" ," |" ," |" ,"| |" ,\ "| " ,"| " ," |" ,"| |" ,"| |"] list3 = [" " ," " ," -- " ," -- " ," -- " ,\ " -- " ," -- " ," " ," -- " ," -- "] list4 = ["| |" ," |" ,"| " ," |" ," |" ,\ " |" ,"| |" ," |" ,"| |" ," |"] list5 = ["| |" ," |" ,"| " ," |" ," |" ,\ " |" ,"| |" ," |" ,"| |" ," |"] list6 = [" -- " ," " ," -- " ," -- " ," " ,\ " -- " ," -- " ," " ," -- " ," -- "] lists = [list0,list1,list2,list3,list4,list5,list6] printLine lnum snum = putStr (last (take snum (last(\ take lnum lists)))) >> putStr " " char2printLine lnum str = printLine lnum ((digitToInt str)+1) mapPrint str lnum = mapM_ (char2printLine lnum) str\ >>putStrLn "" printDigit numStr = mapM_ ( mapPrint numStr) [1..7]
表示サイズの都合で、バックスラッシュを入れて改行しているところは、本当は1行で書いています。
文字と文字の間にスペース入れるとか、改行入れるとかに、なんとなく恥ずかしい処理が。(w
実行結果はこうなります。
*Main> printDigit "12345" -- -- -- | | | | | | | | | | | | -- -- -- -- | | | | | | | | | | -- -- -- *Main> printDigit "67890" -- -- -- -- -- | | | | | | | | | | | | | | | | -- -- -- | | | | | | | | | | | | | | | | -- -- -- --
Best of Ruby Quiz (Pragmatic Programmers)
- 作者: James Edward Gray
- 出版社/メーカー: Pragmatic Bookshelf
- 発売日: 2006/03/01
- メディア: ペーパーバック
- クリック: 4回
- この商品を含むブログ (7件) を見る