文言标准输入语法糖《閱文秘術》使用例
去年底(2021-12)我给文言写了个读取标准输入的库,名之曰“閱文秘術”,发布在“文淵閣”。有了这个库就可以用文言愉快地 scanf
了,再也不需要 夫「require('fs').readFileSync("/dev/stdin").toString().trim().split(/\s+/g).map(parseInt)」。名之曰「輸入」
了。这里通过几道非常简单的题目演示一下“閱文秘術”的实际使用。我们使用文言的编译器将代码编译成 JavaScript 后在洛谷按 Node.js 提交。
P1181 数列分段 Section I
题目描述
对于给定的一个长度为 的正整数数列 ,现要将其分成连续的若干段,并且每段和不超过 (可以等于 ),问最少能将其分成多少段使得满足要求。
输入格式
第1行包含两个正整数 ,表示了数列 的长度与每段和的最大值,第 行包含 个空格隔开的非负整数 ,如题目所述。
输出格式
一个正整数,输出最少划分的段数。
样例输入
5 6 4 2 4 5 1
样例输出
3
样例解释
将数列如下划分:
第一段和为 ,第 段和为 ,第 段和为 均满足和不超过 ,并可以证明 是最少划分的段数。
吾嘗觀『閱文秘術』之書。方悟「閱數」之義。
閱二數。名之曰「列長」曰「限」。
吾有二數。曰零曰一。名之曰「段值」曰「段數」。
為是「列長」遍。
閱一數。名之曰「數」。
加「數」於「段值」。名之曰「和」。
若「和」大於「限」者。
加一於「段數」。昔之「段數」者。今其是矣。
昔之「段值」者。今「數」是矣。
若非。
昔之「段值」者。今「和」是矣。
云云。
云云。
夫「段數」。書之。
P2240 【深基12.例1】部分背包问题
题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 堆金币,第 堆金币的总重量和总价值分别是 。阿里巴巴有一个承重量为 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入格式
第一行两个整数 。
接下来 行,每行两个整数 。
输出格式
一个实数表示答案,输出两位小数
样例输入
4 50 10 60 20 100 30 120 15 45
样例输出
240.00
吾嘗觀『閱文秘術』之書。方悟「閱數」之義。
閱二數。名之曰「堆數」曰「容」。
吾有一列。名之曰「堆列」。
為是「堆數」遍。
閱二數。名之曰「重」曰「值」。
除「值」以「重」。名之曰「比」。
吾有一物。名之曰「堆」。其物如是。
物之『重』者。數曰「重」。
物之『值』者。數曰「值」。
物之『比』者。數曰「比」。
是謂「堆」之物也。
充「堆列」以「堆」。
云云。
吾有一數。名之曰「總值」。
恆為是。
吾有三數。名之曰「戊」曰「號」曰「良比」。
為是「堆數」遍。
加一於「戊」。昔之「戊」者。今其是矣。
夫「堆列」之「戊」。名之曰「堆」。
夫「堆」。若其不然者。乃止是遍也。
若「堆」之『比』大於「良比」者。
昔之「號」者。今「戊」是矣。
昔之「良比」者。今「堆」之『比』是矣。
云云。
云云。
若「號」等於零者。乃止也。
夫「堆列」之「號」。名之曰「堆」。
夫「堆」之『重』。名之曰「重」。
夫「堆」之『值』。名之曰「值」。
夫「堆」之『比』。名之曰「比」。
若「容」大於「重」者。
減「容」以「重」。昔之「容」者。今其是矣。
加「總值」以「值」。昔之「總值」者。今其是矣。
昔之「堆列」之「號」者。今不復存矣。
若非。
乘「容」以「比」。加「總值」以其。昔之「總值」者。今其是矣。
乃止也。
云云。
夫「總值」。施「(n=>n.toFixed(2))」於其。書之。
贪心。把每一堆的重量、价值以及性价比存储在结构体(物
)的数组(列
)里,然后反复遍历数组找出性价比最高的一堆,并从数组中删除(今不復存矣
),直到背包装满或全部装下为止。
P1603 斯诺登的密码
题目描述
…………
……纸条由纯英文构成:
Obama is a two five zero .
(以.
结束输出,只有 个单词+一个句号,句子开头如没有大写亦为合法)。……破译密码的步骤如下:
找出句子中所有用英文表示的数字 ,列举在下:
one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty a both another first second third
(
another
算作 )将这些数字平方后对 取模,如 。
把这些两位数按数位排成一行,组成一个新数,如果开头为 ,就去 。
找出所有排列方法中最小的一个数,即为密码。
输入格式
一个含有 个单词的句子。
输出格式
一个整型变量(密码)。如果没有符合要求的数字出现,则输出 。
样例输入
Black Obama is two five zero .
样例输出
425
吾嘗觀『閱文秘術』之書。方悟「閱言」之義。
吾嘗觀『列經』之書。方悟「排序」之義。
吾有一術。名之曰「比較」。欲行是術。必先得二數。曰「甲」曰「乙」。乃行是術曰。
減「甲」以「乙」。乃得矣。
是謂「比較」之術也。
吾有一術。名之曰「識數」。欲行是術。必先得一言。曰「詞」。乃行是術曰。
昔之「詞」者。今「詞.toLowerCase()」是矣。
若「詞」等於『one』者。乃得一也。
若「詞」等於『two』者。乃得二也。
若「詞」等於『three』者。乃得三也。
若「詞」等於『four』者。乃得四也。
若「詞」等於『five』者。乃得五也。
若「詞」等於『six』者。乃得六也。
若「詞」等於『seven』者。乃得七也。
若「詞」等於『eight』者。乃得八也。
若「詞」等於『nine』者。乃得九也。
若「詞」等於『ten』者。乃得十也。
若「詞」等於『eleven』者。乃得十一也。
若「詞」等於『twelve』者。乃得十二也。
若「詞」等於『thirteen』者。乃得十三也。
若「詞」等於『fourteen』者。乃得十四也。
若「詞」等於『fifteen』者。乃得十五也。
若「詞」等於『sixteen』者。乃得十六也。
若「詞」等於『seventeen』者。乃得十七也。
若「詞」等於『eighteen』者。乃得十八也。
若「詞」等於『nineteen』者。乃得十九也。
若「詞」等於『twenty』者。乃得二十也。
若「詞」等於『a』者。乃得一也。
若「詞」等於『both』者。乃得二也。
若「詞」等於『another』者。乃得一也。
若「詞」等於『first』者。乃得一也。
若「詞」等於『second』者。乃得二也。
若「詞」等於『third』者。乃得三也。
是謂「識數」之術也。
吾有一列。名之曰「數列」。
恆為是。
閱一言。名之曰「詞」。
若「詞」等於『.』者乃止也。
施「識數」於「詞」。名之曰「數」。
若「數」者。乘「數」以「數」。除其以百。所餘幾何。充「數列」以其也。
云云。
施「排序」於「比較」於「數列」。昔之「數列」者。今其是矣。
夫零。名之曰「秘數」。
凡「數列」中之「數」者。
乘「秘數」以百。加其以「數」。昔之「秘數」者。今其是矣。
云云。
夫「秘數」。書之。
P1957 口算练习题
题目描述
……王老师收集了 道学生经常做错的口算题,并且想整理编写成一份练习。……王老师希望尽量减少输入的工作量,比如 的算式最好只要输入 和 ,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 以及该算式的总长度 。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。
输入格式
第一行为数值
接着的 行为需要输入的算式,每行可能有三个数据或两个数据。
若该行为三个数据则第一个数据表示运算类型, 表示加法运算, 表示减法运算, 表示乘法运算,接着的两个数据表示参加运算的运算数。
若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。
输出格式
输出 行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度
样例输入
4 a 64 46 275 125 c 11 99 b 46 64
样例输出 #1
64+46=110 9 275+125=400 11 11*99=1089 10 46-64=-18 9
吾嘗觀『閱文秘術』之書。方悟「閱數」「閱白」「閱字」之義。
吾有一言。名之曰「類」。
閱一數。為是其遍。
閱二數。名之曰「甲」曰「乙」。
若「甲」等於「undefined」者。
閱一白。噫。
閱一字。昔之「類」者。今其是矣。
閱二數。名之曰「甲」曰「乙」也。
若「類」等於『a』者。
吾有一言曰『+』。名之曰「算符」。
加「甲」以「乙」。名之曰「得數」。
或若「類」等於『b』者。
吾有一言曰『-』。名之曰「算符」。
減「甲」以「乙」。名之曰「得數」。
或若「類」等於『c』者。
吾有一言曰『*』。名之曰「算符」。
乘「甲」以「乙」。名之曰「得數」也。
加『』以「甲」。加其以「算符」。加其以「乙」。加其以『=』。加其以「得數」。名之曰「等式」。
夫「等式」。書之。夫「等式」之長。書之。
云云。
字符串。读入的时候每行先尝试直接读取两个数字。如果返回了 undefined
,说明这一行有字母。先用 閱一白。噫
跳过换行符,然后再 閱一字
把字母读进来,相当于 C 语言的
char chr;
scanf(" %c", &chr);
不过代码里直接写 undefined
确实不太美观,可以这样获得一个 undefined
:
吾有一元。名之曰「空無」。
这会编译成:
var 空無 = void 0
输出时直接把等式做成字符串,再用 夫「等式」之長
获得长度。
因本站先前无法显示 公式,本文最初发布于我的洛谷博客。由于洛谷博客迁移至洛谷专栏后显示效果不佳,现在此重新发布。尽情享受文言 lang 语法高亮吧!