跳至正文
LNN的博客!

esolang

Esoteric programming language,简称Esolang,它们的设计被用于测试计算机语言设计的极限,作为一个概念的证明,或仅仅是一个玩笑。Esolang创作者[……]几乎不会在意语言的可用性,甚至恰恰相反,会故意增加使用难度。

——张凯强《文言文编程火了,可我完全学不懂》

我最喜欢的 esolang 有 brainfuck、Befunge-93 和文言。

外部链接

温馨提示:以下链接无特别注明的均为英文。

文言

Befunge-93

brainfuck

文章列表

编程 日常写代码 esolang

奇怪的AV号-BV号转换程序增加了!REMASTERED

是的,时隔六年,我决定重制一下本博客的第一篇文章。

2020年3月,B站推出了 bvid(BV号)来代替之前的 aid(AV号)作为每个视频的唯一编号。bvid 长 12 个字符,开头固定为“BV1”,之后 9 位为 58 进制编码,可通过算法与 aid 相互转换。

时过境迁啊,当初最早被披露的算法已不适用于后来 aid 值较大的视频。这次我用我们的老朋友文言和新朋友 WhatLangUiua 三种语言了实现番号转换,三种语言各有特点,一起来看看吧!

编程 日常写代码 esolang

Uiua 99bottles

Uiua 是一门还在迭代开发中的、基于堆栈(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_." (||))
编程 esolang

“ruby,一款好用的 esolang”

$><<(""<<~-~-~-~-~-~-~-~-(-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<-~-~-~-~-~(-~
-~-~([]<=>[])<<-~-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~(
[]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<~-(-~-~-~-~-~-~
-~([]<=>[])<<-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<(
([[]]<=>[])<<-~-~-~-~-~([]<=>[]))<<-~-~-~-~-~-~-~(-~-~-~-~-~([]<=>[])<<-~-~-~-~(
[]<=>[]))<<~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[]))<<-~-~(-~-~-~-~-~-~-~([
]<=>[])<<-~-~-~-~([]<=>[]))<<~-~-~-~-(-~-~-~-~-~-~-~([]<=>[])<<-~-~-~-~([]<=>[])
)<<-~-~-~-~(-~-~-~([]<=>[])<<-~-~-~-~-~([]<=>[]))<<-~(([[]]<=>[])<<-~-~-~-~-~([
]<=>[]))<<-~-~-~-~-~-~-~-~-~-~([]<=>[]))
Hello, World!
编程 esolang

brainf 解释器,但它是一个 Python 表达式

(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("!"))
编程 esolang

文言标准输入语法糖《閱文秘術》使用例

前情提要:“文言”编程语言能读取标准输入了 | LNN的博客!

去年底(2021-12)我给文言写了个读取标准输入的库,名之曰“閱文秘術”,发布在“文淵閣”。有了这个库就可以用文言愉快地 scanf 了,再也不需要 require('fs').readFileSync("/dev/stdin").toString().trim().split(/\s+/g).map(parseInt)」。名之曰輸入 了。这里通过几道非常简单的题目演示一下“閱文秘術”的实际使用。我们使用文言的编译器将代码编译成 JavaScript 后在洛谷按 Node.js 提交。

编程 esolang

“文言”编程语言能读取标准输入了

前不久我给“文言”写了个扩展库,让它能够通过 Node.js 读取标准输入。现已被收入“文言”的包管理系统“文淵閣”

研究过这门深奥编程语言的朋友可能知道,“文言”中没有原生的办法来读取标准输入。我猜测这大概也是洛谷网不再支持这门语言的原因之一。

编程 esolang

重写的brainf 99bottles

前两天想起之前写的brainfuck 99bottles还有很大优化空间,就改进了一下。

比起之前的版本,这次的版本有效指令数更少,运行用时更短。这得利于在开始主循环开始前提前保存好一些字符串“常量”,而不是每次用到都重新计算一遍。

编程 esolang

brainfuck二进制转十进制

诶――朋友们好啊,我是普通的高中生DGCK81LNN。刚才有个朋友问我L老师发生甚么事了,我说怎么回事,给我发过来一……几张截图,我一看,嗷,原来是昨天,有一个同学,塔说,诶……我写了个程序,二进制转十进制:

编程 esolang

JvavScript

JvavScript是我提出的一个基于JavaScript的深奥编程语言,是JavaScript的一个子集,也是JSFuck的一个超集。JvavScript代码符合JavaScript表达式的语法,然而只能使用有限的几种字符:

( ) [ ] < > + - ! , = ? : _ $
编程 esolang

禁止套深奥编程语言!用Befunge程序生成brainfuck代码

关于Befunge和brainfuck是什么我就不说了,Esolangs上有详细说明

今天随便写了这个Befunge程序,它可以生成一段会输出指定文字的brainfuck代码。

编程 esolang

奇怪的AV号-BV号转换程序增加了!

众所周知,哔哩哔哩已经把旧版视频番号AV号隐藏,只显示新版番号BV号,而这两种番号可以通过一个算法相互转换。

我用两种深奥编程语言,即娱乐性大于实用性的编程语言实现了番号转换,话不多说,直接上源码