jother编码

来源:互联网 发布:网络直播节目策划 编辑:程序博客网 时间:2024/04/29 08:09

一切来自这个比赛的安利..

javascript用 ! [] + - * 表示0~1000的数字

编码长度不超过75个字符

样例:

+![]+!![]

然后找到这个博客

发现了一种jother编码的神奇东西

[]是一个匿名函数,+把它变成0,!把它变成false……

//chrome console测试[]> []+[]> 0![]> false

那么对于![]再加一个!就应该是true了,然后在加+便是1

当然在+[]前面加一个!也能变成1

//chrome console测试!+[]> true+!+[]> 1+!![]> 1

一生万物

//前文提及博客通过加法生成的0~9"+[]",                                            //0"+!![]",                                           //1"!![]+!![]",                                       //2"!![]+!![]+!![]",                                  //3"!![]+!![]+!![]+!![]",                             //4"!![]+!![]+!![]+!![]+!![]",                        //5"!![]+!![]+!![]+!![]+!![]+!![]",                   //6"!![]+!![]+!![]+!![]+!![]+!![]+!![]",              //7"!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]",         //8"!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]"     //9

但是对于这道题还是有字数限制…

75个字符…用sublime对于上面的测试了一下9就有45个字符了

话说google到一个网站….它使用了括号生成jother编码

尝试了一下是可以吧()换成[]

所以一个思路就是通过拼接来实现三位数

[+!![]+[]]+[!![]+!![]+[]]+[!![]+!![]+!![]+[]]"123"

但是前文已经提到,9就有45个字符了,那999通过这样的转换只能是

[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]+[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]+[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]

长度刚好150,是原来的两倍恍恍惚惚

然后还可以用乘法符号和减法

所以999可以表示成1000-1

[+!![]+[]]+[+[]+[]]+[+[]+[]]+[+[]+[]]-[+!![]+[]]

这样就只有49个字符啦= =

明显还是C++可以实现的…

乘以10还不如加0…

  • 乘法优化

2*2生成的4比4要长…(因为要加括号)

2*3生成的6比1+…+1生成的6短(一个字节)

[!![]+!![]]*[!![]+!![]+!![]]

2*4生成的8比1+…+1生成的8短

[!![]+!![]]*[!![]+!![]+!![]+!![]]34

3*3生成的9比1+1+…+1生成的9要短

[!![]+!![]+!![]]*[!![]+!![]+!![]]只有35个字符

  • 减法优化

10-1,10-2,10-3显然更小

[+!![]]+[+[]]-[+!![]+!![]+!![]]

[+!![]]+[+[]]-[+!![]+!![]]28

[+!![]]+[+[]]-+!![]20

所以下面总结一下构造

  • //0,1,2,3,4,5没有什么技巧+[]                                            //0+!![]                                          //1!![]+!![]                                      //2!![]+!![]+!![]                                   //3!![]+!![]+!![]+!![]                            //4!![]+!![]+!![]+!![]+!![]                       //5//6 = 2 * 3[!![]+!![]]*[!![]+!![]+!![]]                   //6//7 = 10 - 3 8 = 10 - 2,9 = 10 - 1 [+!![]]+[+[]]-[+!![]+!![]+!![]]                //7[+!![]]+[+[]]-[+!![]+!![]]                       //8[+!![]]+[+[]]-+!![]                              //9//10 = [1] + 0
  • 加法不需要加[] cost=1

  • 减法需要在后面加括号

    • dp[a][b] = dp[a]+dp[b]+3

    • b 等于1时候+1

  • 拼接/乘法的时候需要在外面加[]来实现

    • dp[a][b] = dp[a]+dp[b]+5
    • a 或 b 等于1时候+3
    • a == b == 1 时候+1
    • 但是拼接之后是字符串,还需要补上+[]来换元成数字,故再+3

所以这还是一道字符串处理的动态规划= =

但是看上去这样还是不能满足75的要求,所以这里需要分解因数= =

比如777 = +[[[+!![]]+[+[]]-[+!![]+!![]+!![]]]+[[+!![]]+[+[]]-[+!![]+!![]+!![]]]+[[+!![]]+[+[]]-[+!![]+!![]+!![]]]]=[[+!![]]+[+[]]-[+!![]+!![]+!![]]]*[[+!![]]+[+!![]]+[+!![]]]

第一个分解长度是105第二个是7*111 长度是59,满足要求

有空补上接下来的DP步骤,感觉是一个完全背包的多次优化…

0 0