jother编码

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

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步骤,感觉是一个完全背包的多次优化…

你可能感兴趣的:(JavaScript,编码)