如何将参数 'integer<120 boolean boolean boolean boolean' 变成最紧凑的包

How do I turn arguments 'integer<120 boolean boolean boolean boolean' into the most compact package possible

我看过 但考虑到信息量是信息的 60 多倍的额外参数,我感到很困惑。

我计划为最终用户编写一个带有参数的转换器,

$genmask int>5<120b[bool(0,1)][bool(0,1)][bool(0,1)][bool(0,1)]

并将其转换为脚本随后可以读取的掩码,但是如果我希望他们能够省略一个选项并让它正确生成怎么办。

目前,我正在尝试

120.to_s(36) + [1.to_s(36), 2.to_s(36), 4.to_s(36), 8.to_s(36)].join
# => "3c1248"

但这不是我要找的东西,我更想寻找直接添加的内容,比如 linux 权限,或者整个内容可以写在 1-3 中字符。

我可能把它弄得太复杂了,我不知道。

四个布尔参数对应一个四位数,可以表示为一个十六进制字符。所以如果你认为你的用户可以进行十六进制加法,你可以使用它。

flags = [true, true, true, true]
flags.map { |b| b ? 1 : 0 }.join.to_i(2).to_s(16)
# "f"

"5".to_i(16).to_s(2).rjust(4, ?0).each_char.map { |c| c == ?1 }
# [ false, true, false, true]

并且由于您可以用两个以 36 为底数的字符表示 120,因此您可以根据需要用 3 个字符表示所有参数。

但老实说,这听起来像是一个非常令人困惑的界面。 chmod 的八进制参数勉强 可以理解,这看起来更令人困惑。