文档章节

Haskell生成数字的LED字符形式

hell0cat
 hell0cat
发布于 2017/03/17 21:34
字数 421
阅读 55
收藏 0

单独写一个生成LED字符的比较简单,要实现放大就稍微复杂了一些: 运行效果: Haskell字符LED效果

代码:

import Data.List
import Data.Char
import System.Environment

-- 参数说明:z表示zoom放大倍数,p表示间隔padding spaces,xs为数字字符串
digitsToLED :: Int -> Int -> String -> String
digitsToLED z p xs = concatMap (++"\n") $ map joinS $ transpose $ map (zoom z) $ map figlet $ xs where
            -- padW n 将字符串中间的那个字符扩充n倍,保持两端字符不动,用来扩充宽度。
            padW n = \x -> [x!!0] ++ replicate n (x!!1) ++ [x!!2]
            -- padH n 将每一个扩充宽度的,扩充数量 n-1,并将这些的中间横线去掉,然后在加上扩充宽度后的字符,用来拉伸高度
            padH n = \x -> map (map (\c -> if c == '_' then ' ' else c)) (replicate (n-1) x) ++ [x]
            zoom n st = let 
                            hd = padW n $ st !! 0
                            bd = padH n $ padW n $ st !! 1
                            ft = padH n $ padW n $ st !! 2
                        in [hd] ++ bd ++ ft
            joinS = intercalate $ concat $ replicate p " "
            -- 将字符串映射成图    
            figlet x    | x == '0'  = [" _ ", "| |", "|_|"]
                        | x == '1'  = ["   ", "  |", "  |"]
                        | x == '2'  = [" _ ", " _|", "|_ "]
                        | x == '3'  = [" _ ", " _|", " _|"]
                        | x == '4'  = ["   ", "|_|", "  |"]
                        | x == '5'  = [" _ ", "|_ ", " _|"]
                        | x == '6'  = [" _ ", "|_ ", "|_|"]
                        | x == '7'  = [" _ ", "  |", "  |"]
                        | x == '8'  = [" _ ", "|_|", "|_|"]
                        | x == '9'  = [" _ ", "|_|", " _|"]
                        | otherwise = ["   ", "   ", "   "] -- 或者替换成 ["   ", [' ',x,' '], [' ',x,' ']] 以保留特殊字符


main :: IO ()                            
main = do
    args <- getArgs
    let n = if length args > 0 then (\x -> read x :: Int) $ head args else 1
    let p = if length args > 1 then (\x -> read x :: Int) $ args !! 1 else 0
    let s = if length args > 2 then args !! 2 else "0123456789"
    putStrLn $ digitsToLED (max n 1) p s

运行命令:

[jesse@Jesse-iMac:~/project/test/haskell$] runhaskell led.hs
 _     _  _     _  _  _  _  _ 
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|
[jesse@Jesse-iMac:~/project/test/haskell$] runhaskell led.hs 2
 __      __  __      __  __  __  __  __ 
|  |   |   |   ||  ||   |      ||  ||  |
|  |   | __| __||__||__ |__    ||__||__|
|  |   ||      |   |   ||  |   ||  |   |
|__|   ||__  __|   | __||__|   ||__| __|

[jesse@Jesse-iMac:~/project/test/haskell$] runhaskell led.hs 3
 ___       ___  ___       ___  ___  ___  ___  ___ 
|   |    |    |    ||   ||    |        ||   ||   |
|   |    |    |    ||   ||    |        ||   ||   |
|   |    | ___| ___||___||___ |___     ||___||___|
|   |    ||        |    |    ||   |    ||   |    |
|   |    ||        |    |    ||   |    ||   |    |
|___|    ||___  ___|    | ___||___|    ||___| ___|

非常有意思。

配上watch命令,就可以有一个简单的LED时钟了,mac要brew install watch命令。 编译,然后执行:

[jesse@Jesse-iMac:~/project/test/haskell$] ghc -o led led.hs
[jesse@Jesse-iMac:~/project/test/haskell$] watch -n 1 './led 2 1 $(date "+%T")'

led time

© 著作权归作者所有

共有 人打赏支持
hell0cat
粉丝 37
博文 48
码字总数 24082
作品 0
徐汇
程序员
私信 提问
加载中

评论(3)

蓝水晶飞机
蓝水晶飞机

引用来自“蓝水晶飞机”的评论

还有另一种方法:在画布上面填充白色背景,设置笔触颜色为黑色,然后将文字画在上面,然后取的文字的模,画到界面上。
这样的,就可以显示任意文字啦。

引用来自“hell0cat”的评论

听起来好复杂,有代码可以参考么?
木有了,几年前的空间被该屎的小熊掌关掉了文章都不见了。😣
hell0cat
hell0cat

引用来自“蓝水晶飞机”的评论

还有另一种方法:在画布上面填充白色背景,设置笔触颜色为黑色,然后将文字画在上面,然后取的文字的模,画到界面上。
这样的,就可以显示任意文字啦。
听起来好复杂,有代码可以参考么?
蓝水晶飞机
蓝水晶飞机
还有另一种方法:在画布上面填充白色背景,设置笔触颜色为黑色,然后将文字画在上面,然后取的文字的模,画到界面上。
这样的,就可以显示任意文字啦。
Haskell学习-函数式编程初探

原文地址:Haskell学习-函数式编程初探   为什么要学习函数式编程?为什么要学习Haskell?   .net到前端,C#和JavaScript对我来说如果谈不上精通,最起码也算是到了非常熟悉的程度。这两...

Jeff.Zhong
2018/08/08
0
0
手把手教你智能硬件开发(三) 控制LED灯

第3节 控制LED灯 现在我们开始尝试用代码控制一个真正的直观的硬件设备。 第一个例子:让Arduino开发板上的一个LED小灯周期性的打开、关闭。 第二个例子:让LED灯亮度逐渐的变亮变暗。 3.1 ...

anddlecn
2016/09/06
0
0
使用 Haskell 将十进制数字转成罗马数字

最近一边看「Haskell 函数式编程入门」一边自学 Haskell。函数式编程对笔者这种受OOP毒害颇深(虽然我完全不会 Java,但是经常会被别人来自 Java 背景的(:」∠))的菜鸟来说,还是很难适应的...

0x11901
2018/07/01
0
0
【目录】电子发烧友, 持续更新

目录内容: 1)Geek 2)C51单片机学习平台搭建 3)入门 4)提高 5)红外发射 6)树莓派 7)物联网 8)模电基础 【Geek】 C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新...

990487026
2015/09/26
0
0
pcDuino运行LED Matrix Kit

LED Matrix Kit是一种串行驱动的 8×8 LED 点阵屏套件,由MAX7219供电,使用只需要简单的三根数据线和两根电源线,并且兼容于Arduino。现在我想在pcDuino上运行 LED Matrix ,让它显示一个完...

pc朵拉
2013/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hanlp中N最短路径分词详细介绍

N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法算法基本思想很简单,就是给定...

左手的倒影
32分钟前
1
0
es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好...

架构师springboot
33分钟前
7
0
php面试题常见面试题

又是跳槽季,跳槽就有面试,面试难免会问一些理论问题,前面面试了几家,做了一些面试题,记住了一部分,整理了一下: 1.cookie 和session区别 session存在服务器,cookie存在浏览器;sessi...

后盾风云
39分钟前
3
0
华为Mate X显示适配指导来了!带你完美适配折叠屏

华为Mate X一经发布便引发了世界级的关注,除了史无前例的交互体验外,作为一款可以变形的手机,它还拥有多种不同的形态:展开时是8英寸全面屏,折叠后又变身为6.6英寸和6.38英寸两块屏幕。 ...

安卓绿色联盟
50分钟前
1
0
安装redis

#个人习惯或要求安装目录cd /usr/local/mkdir rediscd redis#下载rediswget http://download.redis.io/releases/redis-5.0-rc4.tar.gz#解压tar -zxvf redis-5.0-rc4.tar.gz ...

其实oscer的名字可以起这么长的你造吗
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部