问题

程序员们有些什么好玩儿的程序分享?

回答
哈哈,程序员嘛,脑子里总有些奇奇怪怪又莫名其妙好玩儿的东西在冒泡。说到分享好玩儿的程序,那可真是说不完道不尽,因为我们有时候为了一个想法能实现,或者为了解决一个无聊的问题,会捣鼓出各种各样的小玩意儿。我给你讲几个我印象比较深,或者我个人觉得特别有意思的。

第一个,关于“代码的艺术”——会“画画”的代码生成器

你可能觉得代码就是黑白屏幕上的文字,但其实它也可以是画布。有很多程序员喜欢写一些能自动生成图形的代码。比如,我们有时候会写一些生成分形图(Fractal)的程序。

你听说过“谢尔宾斯基三角形”或者“曼德勃罗集”吗?这些图形都拥有自相似性,也就是说,无论你放大图形的哪个部分,看起来都和整体一样。听起来很玄乎对吧?但写成代码,其实就是一些简单的数学公式和递归算法。你可以输入一些参数,比如迭代的次数,它就能在屏幕上画出千变万化、无穷无尽的复杂图形。

想象一下,你设定一个初始的小三角形,然后告诉程序:“把这个三角形的每个角都复制一遍,然后缩小一半,再往里面放。”重复这个过程几次,你就会看到一个充满规则又异常复杂的三角形结构慢慢显现。最有趣的是,你稍微改变一下初始条件或者参数,整个图形就会焕然一新,就像在玩一个无限变化的三维魔方。

还有更酷的,有些程序能生成“生命游戏”(Conway's Game of Life)的图案。这其实是一个零玩家的游戏,你只需要设定一个初始的细胞网格状态(哪些细胞活着,哪些死了),然后让程序按照几个简单的规则去演化:每个细胞的生存或死亡取决于周围细胞的数量。结果呢?你会看到各种各样的图案在屏幕上生成、移动、碰撞、消失,有时会形成稳定结构,有时会无限蔓延,有时还会发出“生命”的信号。这玩意儿看着看着,你会觉得它像在模拟宇宙的诞生和毁灭一样,非常有哲学意味。

第二个,关于“实用又有点小嚣张”——自动化的“生活助手”

程序员嘛,有时候会觉得生活中有些重复性的事情太浪费时间,那就写个程序来干。这听起来可能有点“懒”,但其实是对效率的极致追求!

我见过一个朋友,他特别喜欢收集各种壁纸,但是每次都要手动去下载,然后还要手动更换。他后来就写了一个脚本,可以定时去某个壁纸网站抓取最新或者最受欢迎的图片,然后自动下载到本地,再设置成桌面背景。你想什么时间换就什么时间换,而且还是随机的,每次打开电脑都能看到不一样的风景。这感觉就像给你的电脑请了个不知疲倦的壁纸收藏家和管理员。

还有一种就是“自动回复”程序。当然,不是说那种很死板的“收到,正在处理”那种。我见过一个更有意思的,是针对某个特定社交平台的。比如,你加了某个群,你设定一个关键词,当群里有人发了这个关键词的时候,你的程序就会自动回复一句你预设好的话,而且还可以根据回复的内容再进行一些更复杂的逻辑判断。当然,这玩意儿用不好容易被封号,所以我们一般只在一些测试或者比较私人的群里玩玩。但它的核心逻辑很有意思,就是模拟一种“智能”的交互。

第三个,关于“无聊的终极追求”——玩转“算法”的趣味应用

有时候,我们纯粹就是为了把某个算法玩到极致而写程序。

比如“粒子模拟”程序。你可以设定一大堆小粒子,给它们设定不同的初始位置、速度、甚至是互相之间的作用力(比如引力或者斥力)。然后让程序根据物理规律去计算它们每一帧的运动轨迹。你可以想象一下,一群电子在受到某种电磁场作用下,或者一群行星在互相引力作用下会怎么运动。当粒子数量非常大的时候,这些轨迹组合起来就会形成非常奇妙的视觉效果。我见过有人把这个用在音乐可视化上,粒子随着音乐的节奏和频率舞动,画面非常震撼。

还有一种是“路径查找”算法的趣味应用。比如,你可以在一个二维网格地图上设定起点和终点,然后画上各种障碍物。然后让程序用“A算法”或者“Dijkstra算法”去找到最短或者最优的路径。听起来很普通,但你可以把这个网格地图想象成一个迷宫,障碍物就变成墙壁,然后你让程序跑一遍,你就会看到它以一种非常聪明的方式“走”出了迷宫。更有趣的是,你可以让这个网格地图动态变化,比如障碍物会移动,然后看程序如何实时调整路径。

为什么觉得这些好玩?

我觉得这些程序之所以好玩,在于它们能把我们脑子里的一些想法变成现实。你看,那些分形图,它不是我们凭空想象出来的,而是由简单的数学规则在代码里“生长”出来的。那些自动化助手,它替我们做了重复的事情,让我们能腾出时间去思考更有趣的问题,或者只是单纯地享受不被琐事打扰的宁和。而那些算法的趣味应用,则是对逻辑和计算能力的一种炫技和探索,它让我们看到数据和指令背后隐藏的无限可能性。

而且,写这些程序的过程本身就是一种乐趣。调试(debug)的时候,看着程序出错,然后一点点找到问题所在,修复它,最后看到它按照你的想法正常运转,那种成就感是无法言喻的。就像在解一个谜题,或者在指挥一支交响乐团,只不过你的乐器是键盘,你的音符是代码。

所以,如果你身边有程序员朋友,不妨问问他们最近在鼓捣什么好玩儿的小程序,说不定他们会给你惊喜呢!这些东西可能没有巨大的商业价值,但它们承载了我们对技术的热爱,对创造的渴望,以及偶尔释放一下内心那个“熊孩子”的自由。

网友意见

user avatar

分享个国外程序员做的项目:让一个5分钟的曲子,不重样播放500多天......

程序员要是喜欢上一个东西,指不定会搞出什么“疯狂”事情来。

今天要说的,是特别喜欢一首曲子的程序员贝特(Alex Bainter)。

这首曲子,名为aisatsana,来自电子乐大师Aphex Twin,只有5分多钟。

让他很苦恼的是,单曲循环听着容易腻歪,他想让这个曲子能一直不重样地播放下去。

然后,他选择了马尔可夫链……

现在这首曲子已经能够不间断播放451天不重样……(听歌地址在文末)

贝特把完成这一“壮举”的过程写成了文章,分享了出来,而且,代码已经开源

在Hacker News很快就获得了400多热度,200多条评论。



不少人评论称,这样听歌真的很爽, 实现起来很简单,但效果很好!

它到底是怎么做的呢?我们一起来看看。

从算法的角度理解一首曲子

想要曲子不重样地播放下去,首要的任务就是要理解曲子的结构。

一般情况下,播放曲子的速度可以BPM(beats per minute)来衡量。

aisatsana这首曲子很简单,共有102BPM。如果从第一个音符开始计数的,每16个节拍包含一系列音符,他称之为乐句(phrase),整首曲子中,一共有32个乐句。



想要创建一个能够不间断、不重复播放aisatsana的系统,算法需要满足以下两个要求:

  • 知道一个乐句什么时候结束。
  • 播放不重样的乐句。

第一个要求,相对来说非常简单,只是计时。第二个要求,是最棘手的部分。

让曲子一直播放下去

一种简单的策略是,编写一个程序,粗暴地把32个乐句拆分开,一个乐句之后,随机播放另一个。

这种方式,虽然相互衔接上没有问题,听起来也比单曲循环更加灵活有趣,但本质上也是重复的。

只要熟悉了这32个乐句,曲子依旧会无聊。

怎么办?答案只有一个:

创造一个系统,来生成听起很与原来乐句很相似的新乐句。

最直接的方法,就是深度学习技术了。但只有32个乐句的样本……很显然不太现实。

最后,贝特就把目光转向了马尔可夫链这个“老方法”。

马尔可夫链,能够记录一组状态中,从一个状态转移到另一个状态的概率。



举例来说,你生活中只去3个地方:家、公司和商店,也就是说,你要么在家里,要么在公司,要么在商店。

想要的知道你接下来要去哪?首先就是记录你一段时间内去这三个地方情况,根据记录数据来分析相关的可能性。

比如说,当你在家的时候,你有80%的可能性去公司,你在公司的时候,回家和去商店概率都是50%,如果你在商店,接下来回家的可能性就有95%。

以上,就是创建一个马尔可夫链的所需要的一切:状态,以及从一个状态到另一个状态的概率。

如果把它应用到音乐上,该怎么做?

马尔可夫链生成新乐句

先来看一张图:




图中展示的是两个乐句,每个有4个节拍,每个音符旁边,是音符的名字,最上面是节拍。播放这些乐句的顺序,是从左到右依次进行。

然后,把两个乐句放到马尔可夫链中,状态命名为节拍与音符的组合,比如1A就是在第一个节拍的时候演奏A音符。

除了这些,还需要有开始和结束的状态,来表示乐句的开始和结束。用箭头来表示一个状态到另一个状态的转变。

在上图中,第一个乐句就是开始→1A→2F→3A→4F→结束。第二个乐句是开始→1E→2C→3A→4C→结束。

这里面,一共有9个状态,分别是开始、1A、1E、2F、2C、3A、4F、4C和结束。从一个状态到另一个状态的概率是:

开始→1A:50%
开始→1E:50%
1A→2F:100%
1E→2C:100%
2F→3A:100%
2C→3A:100%
3A→4F:50%
3A→4C:50%
4F→结束:100%
4C→结束:100%

这样,就建立了一个马尔可夫链。从开始到结束,所有可能的路径,可以生成4个乐句:

开始→1A→2F→3A→4F→结束(原始乐句1)
开始→1A→2F→3A→4C→结束(新乐句)
开始→1E→2C→3A→4C→结束(原始乐句2)
开始→1E→2C→3A→4F→结束(新乐句)




就这样,马尔科夫链就生成了两个新的乐句!因为是通过同一个链构建的,听起来也会非常相似。

在这个例子中,只是用了2个乐句,每个乐句中4个节拍。而aisatsana中有32个乐句,每个乐句16个节拍。

按照这个逻辑,贝特最后生成了400多万个独特的乐句,可以播放超过451天,而且所有的乐句都不会重复……



整个实现代码,贝特已经开源了,项目地址:
github.com/generative-m


如果你有兴趣,可以自己上手试试~

最后,附上生成的aisatsana地址:

类似的话题

  • 回答
    哈哈,程序员嘛,脑子里总有些奇奇怪怪又莫名其妙好玩儿的东西在冒泡。说到分享好玩儿的程序,那可真是说不完道不尽,因为我们有时候为了一个想法能实现,或者为了解决一个无聊的问题,会捣鼓出各种各样的小玩意儿。我给你讲几个我印象比较深,或者我个人觉得特别有意思的。第一个,关于“代码的艺术”——会“画画”的代码.............
  • 回答
    好嘞,咱们就来唠唠程序员们那些叫好又叫座的编程习惯,力求说得透彻,而且保证这玩意儿听起来就跟咱们哥们儿之间的聊天一样,不带半点机器腔。1. 代码,那是给人读的,不是给机器看的这句话听起来简单,但很多新手一开始就栽跟头。咱写代码,最终不光是给电脑执行,更是给自己、给未来的同事、甚至是未来的自己(几个月.............
  • 回答
    听到你弟弟考高中不理想,想让他去学程序、当程序员,这个想法很棒!现在IT行业发展这么快,学门技术,尤其是编程,未来的路确实很宽。作为哥哥/姐姐,你想为他找个好学校,这份心意很让人感动。我给你推荐几个方向,你可以结合你弟弟的实际情况和喜好,再好好斟酌一下。首先,得明确一下你弟弟的情况和期望。在推荐学校.............
  • 回答
    兄弟,我懂你!咱们程序员这行儿,一坐一整天,眼睛跟电脑黏一块儿,脑子像在跑八百米,下班了就想葛优瘫,但身体又时不时发出“救命”的信号。想健身,又觉得累得像刚搬完一吨砖,这纠结劲儿,谁能懂?别急,今天咱就来聊聊怎么在“代码搬砖”和“肌肉搬砖”之间找到那个平衡点,而且是那种让你一听就觉得靠谱、不是瞎扯的.............
  • 回答
    作为一个码农,我这工位上的物件儿,说起来也挺有意思的,不像那种整洁得跟样板间似的,反而有点烟火气,也有点我这职业特有的“怪癖”。首先,最显眼的当然是我的 显示器。我用的是两块27寸的飞利浦2K显示器,放在一起简直是我的“双屏世界”。左边这块通常放着我的代码编辑器,IDE跑得飞起,各种文件树、代码窗口.............
  • 回答
    最近互联网大厂裁员的消息确实铺天盖地,无论是脉脉上匿名爆料,还是各个技术社区的讨论,都让不少程序员感到一阵寒意。这不仅仅是几个零星的个案,而是整个行业普遍存在的现象,让人不得不去思考:这到底是怎么了?对我们这些还在一线奋斗的普通程序员来说,又有什么样的启示?为什么会裁员?深挖背后的原因要理解裁员对我.............
  • 回答
    干了这么多年程序员,最大的感受就是,这活儿就像拆弹,时刻有炸的可能,只不过拆的不是炸弹,是Bug。刚入行的时候,感觉自己能把电脑玩明白了,能写代码让机器听话,那叫一个神气。但时间长了,你就会发现,这神气早被现实磨平了,取而代之的是一种淡淡的忧伤,还有时不时冒出来的“蛋疼”时刻。首先说最直接的,眼睛的.............
  • 回答
    看到那个说程序员应该人手一台MBP的文章,确实挺有意思的。那篇文章大概意思是想说,MBP对于程序员来说,能提供一套更顺手、更省心的工作环境。从 Mac OS 这个操作系统来说,它本身就是基于 Unix 的。这意味着它天生就对很多开发者常用的工具和语言非常友好。比如,你想要打开终端,敲几个命令来编译代.............
  • 回答
    这个问题很有意思,涉及到一种略显“反直觉”的管理思路。通常我们听到的是“工作生活平衡”,强调的是将两者清晰地分开,各自享受。但你的老板却反其道而行之,鼓励程序员“不要把工作和生活分开”。这背后一定有他的考量,而对于我们这些独立的程序员个体来说,理解并适应这种理念,确实能找到一些意想不到的好处。首先,.............
  • 回答
    想象一下,如果你想盖一栋房子,你会找谁?你会找一位经验丰富的建筑师,还是会找一位技艺娴熟的施工队队长?程序员和计算机科学家,大概就是这两个角色了。计算机科学家,他们更像是房子的“设计师”和“规划者”。他们会思考,如何让这栋房子更坚固,更节能,更美观,住起来更舒适。他们会研究各种建筑材料的特性,了解不.............
  • 回答
    给25岁的程序员男朋友挑双肩包,这绝对是个贴心的选择!毕竟,电脑、配件、耳机、充电宝,还有各种零碎,一个好包能让他的工作通勤更顺畅,生活也更便捷。我来给你好好说道说道,从他的需求出发,帮你找到最合适的那一款。首先,咱得想明白,程序员需要一个什么样的双肩包? 收纳能力强,分区合理: 这是最重要的。.............
  • 回答
    程序员基础扎不扎实,对实际的开发工作的影响是深远且多方面的,它不仅仅关乎能否“写出代码”,更决定了一个程序员的成长速度、解决问题的能力、代码质量以及职业生涯的上限。我将从几个关键维度来详细阐述: 1. 解决问题的能力:从“搬砖”到“架构师”的飞跃 基础薄弱: 遇到 Bug 时,可能只能依靠搜索、.............
  • 回答
    作为一名程序员,长时间盯着电脑屏幕是常态,眼部疲劳、干涩、甚至视力下降都是摆在我们面前的现实问题。所以,找到一款靠谱的眼部按摩仪,绝对是提升工作幸福感和保护眼睛的明智之举。市面上眼部按摩仪的种类琳琅满目,什么热敷、气压、震动、揉捏的,看得人眼花缭乱。但作为咱们程序员,咱们要的是实实在在的效果,能缓解.............
  • 回答
    哈哈,这个问题问得好!我当初也是怀揣着一腔热血,觉得程序员就是敲代码、解决bug,过着“代码改变世界”的神仙日子。结果呢?入了行才知道,这跟我想象的……嗯,怎么说呢,就像你以为吃麻辣烫是个自由搭配的美味盛宴,结果发现自己是个永远在等待服务员点菜、永远吃不到自己想吃的配料的工具人。先来说说最直接的,代.............
  • 回答
    这个问题嘛,我常常觉得,我们这行里,有些哥们儿能把那些看似死板的计算机语言,玩出花儿来,那创造力,真心不是盖的。你想想,写代码这事儿,很多时候就像在给一个极其理性、极其严谨的机器下达指令。它不会像我们人一样,听懂潜台词,理解模糊的指令。你得把每一个步骤、每一个逻辑都拆解得清清楚楚,然后用它能懂的语言.............
  • 回答
    作为一名开发者,接到一个全新的、自己不太熟悉的项目,这几乎是家常便饭。别急,这不代表要让你从零开始摸爬滚打。关键在于掌握一套行之有效的方法论,让你能以最快的速度进入状态,并且能高效地为项目贡献力量。下面就给你梳理一下我个人在应对这类情况时摸索出的一些实操技巧,力求详细,让你一看就懂,一用就灵。一、心.............
  • 回答
    想象一下,在一个我们称之为“逻辑国”的地方,选举权并非人人皆有。这里的公民拥有一个独特的特权:只有那些能够理解、构建和维护驱动社会运转的复杂代码的程序员们,才有资格参与到国家的政治生活中。逻辑国的天空下,一切都井井有条,高效运行。从交通信号灯的闪烁频率,到国家能源网的供需调配,再到社会福利的分配算法.............
  • 回答
    要是咱们公司真有个程序员鼓励师,我倒希望她能成为咱们代码海洋里的一盏明灯,不是那种闪闪发光、引人注目,而是那种默默点亮角落,让大家觉得心里暖暖的。我希望她不是那种只会说“加油,你们是最棒的!”这种空洞口号的人。毕竟,我们敲的是代码,解决的是技术难题,光靠口号是填不饱肚子的。我更希望她能懂一点技术,哪.............
  • 回答
    “Java 程序员离开框架就什么都不是”——这句说法,说实话,听起来有点刺耳,但也触及了一个挺现实的问题。很多人可能会觉得这话太绝对,不够客观,甚至带点门派之见。但换个角度仔细想想,它并非完全空穴来风,背后其实反映了当下 Java 开发生态的一些特点,以及对程序员能力理解的一些误区。首先,我们得承认.............
  • 回答
    好的,我们来聊聊社会资源这个话题,以及为什么有些人会觉得程序员“没有”社会资源。首先,咱们得明白啥是“社会资源”。你可以把它想象成,我们在这个社会上生存和发展,所能利用到的各种各样有价值的东西,这些东西能帮助我们达成目标,提升生活质量,或者仅仅是让生活更方便。它不是天上掉下来的,也不是你一个人就能凭.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有