core-values-encoder icon indicating copy to clipboard operation
core-values-encoder copied to clipboard

为什么hex2duo要用到随机数?

Open Ahaochan opened this issue 6 years ago • 5 comments

hex2duo似乎不是简单的转化16进制到12进制,在63-69行有用到随机数。

是基于什么的考虑呢?

        // 正常转换, 如 C 10 的意思是, 十六进制的C转化为十二进制的10
        // parseInt('C', 16).toString(12);
        // A A      B B      C 10       D 11        E 12        F 13
        // 您的代码. 如 C 10 2 的意思是, 十六进制的C转化为您的代码中十二进制数组的两个元素 10 和 2
        // 这里枚举了两种随机情况
        // A 10 0   B 10 1   C 10 2     D 10 3      E 10 4      F 10 5
        // A 11 4   B 11 5   C 11 6     D 11 7      E 11 8      F 11 9

Ahaochan avatar May 23 '18 07:05 Ahaochan

社会主义核心价值观只有12组 不允许进位 11 是两个1 还是十一呢?

mengyyy avatar May 23 '18 11:05 mengyyy

@mengyyy 如 C 10 2 的意思是, 十六进制的C转化为您的代码中十二进制数组的两个元素 102


一个猜测: 使用12进制是因为核心价值观有12个词组, 像是issue#6中提到删减部分词组就需要改动很大代码。

我想到以下伪代码实现。如果可行,我可以提一个PR。

var head = {'富', '和'};
var tail = {'强', '谐'};
var i = 16进制 / head.length;
var j = 16进制 % head.length;
return head[i]+tail[i] + head[j]+tail[j];

Ahaochan avatar May 23 '18 12:05 Ahaochan

因为懒。 直接进制转换不知道在哪切断。 这样映射得(看起来)均匀一点,而且一个16进制数直接转换成1-2个12进制数,可以逐个分割。

sym233 avatar May 23 '18 13:05 sym233

因为懒。 直接进制转换不知道在哪切断。 这样映射得(看起来)均匀一点,而且一个16进制数直接转换成1-2个12进制数,可以逐个分割。

认为加入随机数那个是多余的,我在issues #8 中利用已有的 py 版本,尝试去掉随机数部分,代码没有问题。不论是否加入随机数, 12 进制都只用 1-2 位对16 进制的数字进行转换。

但若是使用“听党指挥,能打胜仗,作风优良” 三个"字符"来表示,则需要的位数会更多(逢3进1)。

直接进制转换的切断点应该可以任意选择,若选择 切断点为:x, 需要转换的数为: y(y≥x),则产生的结果就是 转换后的 y 两位数字来表示,最好的切换点应该是转换后进制的进位的位置。

比如十二进制,则在 11 时进行切断,如此而言,只有≥11 的数需要被多位表示;若我选择切断点为 5,则≥5 的所有数都需要两位或更多来表示。将会使得编码出的长度更长一些。

例如:

需要转换的十六进制数为x[默认转换为 10 进制],若x<10 则不变,x≥10 的转换为两位(10, x-10)。

import-yuefeng avatar Jul 18 '19 07:07 import-yuefeng

因为懒。 直接进制转换不知道在哪切断。 这样映射得(看起来)均匀一点,而且一个16进制数直接转换成1-2个12进制数,可以逐个分割。

认为加入随机数那个是多余的,我在issues #8 中利用已有的 py 版本,尝试去掉随机数部分,代码没有问题。不论是否加入随机数, 12 进制都只用 1-2 位对16 进制的数字进行转换。

但若是使用“听党指挥,能打胜仗,作风优良” 三个"字符"来表示,则需要的位数会更多(逢3进1)。

直接进制转换的切断点应该可以任意选择,若选择 切断点为:x, 需要转换的数为: y(y≥x),则产生的结果就是 转换后的 y 两位数字来表示,最好的切换点应该是转换后进制的进位的位置。

比如十二进制,则在 11 时进行切断,如此而言,只有≥11 的数需要被多位表示;若我选择切断点为 5,则≥5 的所有数都需要两位或更多来表示。将会使得编码出的长度更长一些。

例如:

需要转换的十六进制数为x[默认转换为 10 进制],若x<10 则不变,x≥10 的转换为两位(10, x-10)。

我感觉这样可能不太均匀,写的时候也没想这么多。

sym233 avatar Jul 27 '19 13:07 sym233