冒泡.gif
2025年12月,预防用Uiua语言制作了一个冒泡排序演示动画GIF,我为其添加文字“冒泡”后当作动画表情,这个版本被一些群友传播使用。如果你见过这个动画表情,也许你我是有点缘分在的。而现在,我重新编写代码重制了这个动图。
起因是群友最近提起这个动画表情的历史,让我发现了旧版冒泡动图的打乱算法不是等概率的:
2025年12月,预防用Uiua语言制作了一个冒泡排序演示动画GIF,我为其添加文字“冒泡”后当作动画表情,这个版本被一些群友传播使用。如果你见过这个动画表情,也许你我是有点缘分在的。而现在,我重新编写代码重制了这个动图。
起因是群友最近提起这个动画表情的历史,让我发现了旧版冒泡动图的打乱算法不是等概率的:
是的,时隔六年,我决定重制一下本博客的第一篇文章。
2020年3月,B站推出了 bvid(BV号)来代替之前的 aid(AV号)作为每个视频的唯一编号。bvid 长 12 个字符,开头固定为“BV1”,之后 9 位为 58 进制编码,可通过算法与 aid 相互转换。
时过境迁啊,当初最早被披露的算法已不适用于后来 aid 值较大的视频。这次我用我们的老朋友文言和新朋友 WhatLang、Uiua 三种语言了实现番号转换,三种语言各有特点,一起来看看吧!
Uiua 99bottlesUiua 是一门还在迭代开发中的、基于堆栈(stack-based)的阵列编程(array programming)语言,在设计上借鉴了 BQN、APL、J 语言。
瓶 ← (
⍣("No" @s °0|1 "" °1|:@s)
$"_ bottle_ of beer"
)
墙 ← $"_ on the wall" 瓶
拿 ← ⍣(
⍩($"Go to the store, buy some more,\n_" 墙99) °0
| ⍩($"Take one down, pass it around,\n_" 墙-1)
)
⇌⇡100
&p /$"_\n\n_" ≡(□$"_,\n_.\n_." ⊃(墙|瓶|拿))
$><<(""<<~-~-~-~-~-~-~-~-(-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<-~-~-~-~-~(-~
-~-~([]<=>[])<<-~-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~(
[]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<~-(-~-~-~-~-~-~
-~([]<=>[])<<-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<(
([[]]<=>[])<<-~-~-~-~-~([]<=>[]))<<-~-~-~-~-~-~-~(-~-~-~-~-~([]<=>[])<<-~-~-~-~(
[]<=>[]))<<~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<-~-~(-~-~-~-~-~-~-~([
]<=>[])<<-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[])
)<<-~-~-~-~(-~-~-~([]<=>[])<<-~-~-~-~-~([]<=>[]))<<-~(([[]]<=>[])<<-~-~-~-~-~([
]<=>[]))<<-~-~-~-~-~-~-~-~-~-~([]<=>[]))
Hello, World!
(lambda cod, _, inp: (lambda *, _cp = 0, _mp = 0, _ip = 0, _mem = {}, _inp = inp
.encode(), _out = b"": next(__import__("sys").stdout.buffer.write(_out) and None
or None for _ in __import__("itertools").count() if not (_mem.__setitem__(_mp, (
(_mem[_mp] if _mp in _mem else 0) + (1 if cod[_cp] == "+" else -1 if cod[_cp] ==
"-" else 0)) & 255) and 0 or (_mp := _mp + (1 if cod[_cp] == ">" else -1 if cod[
_cp] == "<" else 0)) and 0 or ((_cp := (lambda si, *, _d = 0: next(i for i in (
range(si, len(cod)) if cod[si] == "[" else range(si, -1, -1)) if cod[i] in "[]"
and ((_d := _d + (1 if cod[i] == "[" else -1)) == 0)))(_cp)) if cod[_cp] in "[]"
and bool(_mem[_mp] if _mp in _mem else 0) == bool(cod[_cp] == "]") else 0) and 0
or ((_out := _out + bytes((_mem[_mp],))) if cod[_cp] == "." else _mem.__setitem__
(_mp, _inp[_ip]) and 0 or (_ip := _ip + 1) if cod[_cp] == "," and _ip < len(_inp)
else 0) and 0 or (_cp := _cp + 1) < len(cod))))())(*__import__("sys").stdin.read
().partition("!"))
new int[len] 来创建类型化数组int* arr = new int[20];
🤔…
const array = new int[20]
console.log(array) // ==> Int32Array(20)
近日我给这个博客添加了评论区。因为是使用 Github Pages 和 Jekyll 构建的静态网页博客,不方便实时地把评论添加到网站上。
给静态博客添加评论区的一个常见方法是使用 Disqus。这是一个博客评论平台,只需在自己的静态站上引用相应的脚本,就可以创建一个评论区。
我在 Derpibooru 做了一个图集“M6就要整整齐齐”,里面的图片都是每6张为一组。我今天写了一个自动脚本来给这个图集的图片整理排序。
Derpibooru 官方没有提供修改图集内图片顺序的 API;我通过浏览器开发者工具找到了这个 API。它的工作原理很迷,我没有看懂……废话,我不会 Elixir。这是它的源代码。
……2022-04-15 更新……
前两天想起之前写的brainfuck 99bottles还有很大优化空间,就改进了一下。
比起之前的版本,这次的版本有效指令数更少,运行用时更短。这得利于在开始主循环开始前提前保存好一些字符串“常量”,而不是每次用到都重新计算一遍。
之前那篇关于自产生程序的博客表述不清,现决定重新讲解一下。
这里的“自产生程序”是指输出自身源代码的程序。自产生程序有几种不同的思路,而我使用的这种思路可以类比为……“噬菌体”。
我们知道,噬菌体是一种简单的病毒,它专门感染细菌,在结构上由蛋白质外壳和遗传物质(一般是DNA)组成。这些遗传物质记录了整个蛋白质外壳的内容,而在蛋白质外壳的帮助下,噬菌体才能去感染细菌,并生产出新的DNA和蛋白质外壳,从而繁殖出新的噬菌体。
musicpy是国人写的一个不错的库,操作音符挺方便的,运算符重载很到位,只是IDE太寒碜了(×)(建议开发VSCode插件(
今天呢就用它解决了困扰了我一段时间的问题——按几何图形绘制音符画。之前尝试拿鼠标手动画每个音符,到最后就发现画得一点也不像。现在就可以用musicpy自动画出来。
……2022-09-07 更新……
Richard在他的新作品中使用一种可逆的加密算法来把源代码中的文本加密成乱码。其实质很简单,类似于异或加密——把字符编码“最高的一个有效位”(即最高的一个1)以下的每一位都反转,如:
……2023-11-18 更新……
Ruby
encodeOpt = { :invalid => :replace, :undef => :replace }
str = "你好,世界!"
str.encode!('gbk', encodeOpt)
str.force_encoding('utf-8')
str.encode!('utf-8', encodeOpt)
str.force_encoding('gbk')
puts str.encode('utf-8', encodeOpt)
这是12月17日写的几个brainf程序,只加了少量注释。参考上篇关于brainf的博客。
诶――朋友们好啊,我是普通的高中生DGCK81LNN。刚才有个朋友问我L老师发生甚么事了,我说怎么回事,给我发过来一……几张截图,我一看,嗷,原来是昨天,有一个同学,塔说,诶……我写了个程序,二进制转十进制:
JvavScript是我提出的一个基于JavaScript的深奥编程语言,是JavaScript的一个子集,也是JSFuck的一个超集。JvavScript代码符合JavaScript表达式的语法,然而只能使用有限的几种字符:
( ) [ ] < > + - ! , = ? : _ $
……2022-12-04 更新……
所谓ECMAScript(ES),就是JavaScript(JS)的核心部分:语法、基本原理、基本对象,负责核心的语言功能;而DOM(文档对象模型)提供了访问和操作网页内容的方法和接口,BOM(浏览器对象模型)提供了与浏览器交互的方法和接口,ES加上DOM和BOM就是JS。
今天写了个粗略鉴别ES版本的代码。
关于Befunge和brainfuck是什么我就不说了,Esolangs上有详细说明
今天随便写了这个Befunge程序,它可以生成一段会输出指定文字的brainfuck代码。
console.log((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]); // "fail"
这就nm离谱