level 7
abracadabra -> 7abracad47
一个个分析, 这个例子很好理解. 一块原始数据, 一块引用
mississippi -> 4miss433ppi
这个例子, 编码后的字串要分成两部分来看, 一部分是4miss43另一部分是3ppi.
在4miss43中, 3表示原始字串的后面3位.
aAAaAAaAaAA -> 3aAA53035
这个例子中, 3aAA53这一段很好理解, 这里巧妙地用0作为分隔符. 但是后面的35怎么理解? 3是有3个字符, 5是从原始字串倒数5位, 那不该成了AAa了吗? 可现实中是aAA. 猜测, 最后的35指的是把前面的53所生成的字串当成原始字串, 再进行放样, 中间那段正好是5个字符. 0:如果当当一个零算作一块, 这里不有问题了, 所以零作为分隔符不算.
2718281828 -> 627182844
从编码后的串能否还原成原始的串呢? 第一个数字后一定跟原始串, 因为前面还没有数据, 没法引用.
271828, 这是还原第一段, 后面只有两个数字44, 所以这整个串只有两段. 后面的串是1828.
abcdefghijk -> 9abcdefghi02jk
试着用之前的规则还原.abcdefghi jk 这个串没有重复, 但由于长度值只有1~9, 所以要拆成两段.
aaaaaaaaaaaa -> 3aaa91
这个就涉及贪婪算法了, 如果一开始编码成9aaaaaaaaa那就失去了压缩的意义. 这一串正好12个, 有多种编码的结果. 最好能两个块搞定. 后成的编程是否要考虑使用穷举?
aaaaaaaaaaaaa -> 1a91031
这个串13个字符, 1+9
+3
正好, 两个块内能否搞定? 4aaaa91, 也行, 但就怕答案是唯一的, 也就是唯一解, 其它解不行.
aaaaaaaaaaaaaa -> 1a91041
同上
2024年05月24日 05点05分
2
level 7
再次分析:
1. 引用, 只能引用前面的串, 例子中并没有指定引用的是哪个串.
2. aaaaaaaaaaaaaa -> 1a91041 从这一个例子看来, 也不是倒着算的
3. 分隔符0的使用规则, 两种块交替就不用"0"分隔, 如果前后两块是同一种类别, 则需要用"0"分隔.
4. 由于原始串与引用交替, 在录入新的原始串时同时在判断有没有新的引用串, 那么, 是前两段加起来判断还是说只判断新的原始串? aAAaAAaAaAA -> 3aAA53035 从这个例子看出是从之前的字符中倒着找, 可能是不受限制的. 要么受限于1~9. 但如果把查找范围从上一个块改成1~9: 程序的输出结果将是:03aAA53038.
目前, 关于这个查找范围, 还没有进一步证据.
5.程序中需添加规则: 镜像子串不能超9个. 对于aaaaaaaaaaaa这个例子, 目前程序中给出2aa102. 需要解决单个字符的镜像子串不允许的问题, 解决了镜像串后, 2a开头变成1a开头, 也跟最佳答案不符.
2024年05月24日 10点05分
3
考虑增加有连着的情况. VIXio57k57kk57kk6YJBxivhVLc1lYVYsVYsV306c5cDcQ6j6cQ6j6cQzzzzzzzzzPPvwMA6MA6V5wMfbOEXEXEXEXEXq 最后的需求,有zzzzzzzzz连续9个
2024年05月24日 10点05分
level 7
8VIXio57k3305496YJBxivhV08Lc1lYVYs439306c5cDcQ036j6751z817PPvwMA6339V5wMfbOEX821q
最终的答案
这是生成生的, 再去修改一下zzzzzzzzz那边.
2024年05月24日 11点05分
4
level 9
可以用 ns.codingcontract 里面的函数自动做,需要的 RAM 很小
里面有两个可以自动拿到输入和问题描述,然后每一种问题相应地搞个函数做就行了,前期加的这些 Reputation 还是很有用的,毕竟某些 Aug 几万的 Rep 并不好刷
建议配合 singularity API 使用,一次搜索直接清完全图 contract(
(coding contract API 里面有一个函数是生成指定类型的 contract 用来测试(当然没有奖励),还有一个函数是列出所有的 contract 类型)
2024年12月29日 07点12分
8