您的位置:首页 > Web前端 > JavaScript

jother编码

2016-05-22 11:31 295 查看
一切来自这个比赛的安利..

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 编码