Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

为什么hex2duo要用到随机数? #9

Open
Ahaochan opened this issue May 23, 2018 · 5 comments
Open

为什么hex2duo要用到随机数? #9

Ahaochan opened this issue May 23, 2018 · 5 comments

Comments

@Ahaochan
Copy link

Ahaochan commented May 23, 2018

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
@mengyyy
Copy link

mengyyy commented May 23, 2018

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

@Ahaochan
Copy link
Author

@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];

@sym233
Copy link
Owner

sym233 commented May 23, 2018

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

@import-yuefeng
Copy link

因为懒。
直接进制转换不知道在哪切断。
这样映射得(看起来)均匀一点,而且一个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
Copy link
Owner

sym233 commented Jul 27, 2019

因为懒。
直接进制转换不知道在哪切断。
这样映射得(看起来)均匀一点,而且一个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)。

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants