From 21cb793ce7059de07d0ecfafe74f7ed37730971a Mon Sep 17 00:00:00 2001 From: Kabaril Date: Thu, 4 Aug 2022 14:16:08 +0200 Subject: [PATCH 1/2] optimization for numbers manual definition of more chars test string for output control checks for character map correctness --- optimized.js | 270 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 optimized.js diff --git a/optimized.js b/optimized.js new file mode 100644 index 0000000..bf0b1c1 --- /dev/null +++ b/optimized.js @@ -0,0 +1,270 @@ +//Allowed Chars: ({[/>+!-=\]}) + +const zero = '+[]'; +const one = '+!![]'; + +let fromString = null; + +const number = n => { + if (n === 0) return zero; + if (n === 1) return one; + if (n === 14) { + return '(+!![]+[]+(!![]+!![]+!![]+!![]))/+!![]'; + } + if (n === 11) { + return '(+!![]+[]+ +!![])/+!![]'; + } + if (n === 18) { + return '(+!![]+!![]+[]+ +![])/+!![]-!![]-!![]'; + } + if (n === 17) { + return '(+!![]+!![]+[]+ +![])/+!![]-!![]-!![]-!![]'; + } + if (n === 9) { + return '(+!![]+[]+ +[])/!![]-!![]'; + } + if (n === 8) { + return '(+!![]+[]+ +[])/+!![]-!![]-!![]'; + } + if (n === 20) { + return '(+!![]+!![]+[]+ +![])/+!![]'; + } + if (n === 30) { + return '(+!![]+!![]+!![]+[]+ +![])/+!![]'; + } + if (n === 26) { + //100>>2 + 1 + return '((+!![]+[]+ +![]+ +![])/!![]>>!![]+!![])+!![]'; + } + if (n === 31) { + return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]'; + } + if (n === 32) { + return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]'; + } + if (n === 33) { + //99/3 + return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])'; + //return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]+!![]'; + } + if (n === 34) { + return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]'; + } + if (n === 35) { + return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]+!![]'; + } + if (n === 36) { + return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]+!![]+!![]'; + } + if (n === 46) { + //100 >> 1 - 4 + return '((+!![]+[]+ +![]+ +![])>>!![])-!![]-!![]-!![]-!![]'; + } + if (n === 75) { + //300 >> 2 + return '(!![]+!![]+!![]+[]+ +![]+ +![])>>!![]+!![]'; + } + if (n === 74) { + return '((!![]+!![]+!![]+[]+ +![]+ +![])>>!![]+!![])-!![]'; + } + if (n === 76) { + return '((!![]+!![]+!![]+[]+ +![]+ +![])>>!![]+!![])+!![]'; + } + if (n === 77) { + return '((!![]+!![]+!![]+[]+ +![]+ +![])>>!![]+!![])+!![]+!![]'; + } + if (n === 42) { + return '(+!![]+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]'; + } + if (n === 122) { + return '(+!![]+[]+ +(!![]+!![])+ +(!![]+!![]))/!![]'; + } + if (n === 70) { + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]'; + } + if (n === 68) { + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]-!![]-!![]'; + } + if (n === 69) { + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]-!![]'; + } + if (n === 72) { + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+!![]+!![]'; + } + if (n === 71) { + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+!![]'; + } + if (n === 80) { + return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +[])/!![]'; + } + if (n === 81) { + return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]'; + } + if (n === 82) { + return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]'; + } + if (n === 84) { + return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]+!![]+!![]'; + } + if (n === 85) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]-!![]-!![]'; + //return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]+!![]+!![]+!![]'; + //return '(+!![]+[]+(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+[])>>!![]'; + } + if (n === 90) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]'; + } + if (n === 89) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]'; + } + if (n === 88) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]'; + } + if (n === 87) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]'; + } + if (n === 86) { + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]-!![]'; + } + if (n === 60) { + return '(+!![]+[]+ +(!![]+!![])+ +![])>>!![]'; + } + if (n === 63) { + return '((+!![]+[]+ +(!![]+!![])+ +![])>>!![])+!![]+!![]+!![]'; + } + if(n > 10) { + //console.log('missing number:' + n); + //Fallback for undefined large numbers + return `(${fromString(n + '')})/!![]` + } + return '+' + Array.from({length: n}, () => '!!{}').join('+'); +} + +const map = {}; + +fromString = s => s.split('').map(x => { + if (!(x in map)) { + //console.log(x); + const charCode = x.charCodeAt(0); + return `([]+[])[${fromString('constructor')}][${fromString('fromCharCode')}](${number(charCode)})`; + } + return map[x]; +}).join('+'); + +map['0'] = `(${number(0)}+[])`; +map['1'] = `(${number(1)}+[])`; +map['2'] = `(${number(2)}+[])`; +map['3'] = `(${number(3)}+[])`; +map['4'] = `(${number(4)}+[])`; +map['5'] = `(${number(5)}+[])`; +map['6'] = `(${number(6)}+[])`; +map['7'] = `(${number(7)}+[])`; +map['8'] = `(${number(8)}+[])`; +map['9'] = `(${number(9)}+[])`; + +//(+{}+[]) => 'NaN' +map.N = `(+{}+[])[${number(0)}]`; +map.a = `(+{}+[])[${number(1)}]`; + +//{}+[] => '[object Object]' +map.O = `({}+[])[${number(8)}]`; +map.b = `({}+[])[${number(2)}]`; +map.j = `({}+[])[${number(3)}]`; +map.o = `({}+[])[${number(1)}]`; +map.c = `({}+[])[${number(5)}]`; +map[' '] = `({}+[])[${number(7)}]`; +map['['] = `({}+[])[${number(0)}]`; + +//![]+[] => 'false' +map.f = `(![]+[])[${number(0)}]`; +map.s = `(![]+[])[${number(3)}]`; +map.l = `(![]+[])[${number(2)}]`; + +//!![]+[] => 'true' +map.t = `(!![]+[])[${number(0)}]`; +map.r = `(!![]+[])[${number(1)}]`; +map.u = `(!![]+[])[${number(2)}]`; +map.e = `(!![]+[])[${number(3)}]`; + +//(+!![]/+[])+[] => 'Infinity' +map.I = `((+!![]/+[])+[])[${number(0)}]`; +map.n = `((+!![]/+[])+[])[${number(1)}]`; +map.i = `((+!![]/+[])+[])[${number(3)}]`; +map.y = `((+!![]/+[])+[])[${number(7)}]`; + +//([]+((1)['['])) => 'undefined' +map.d = `([]+((1)[${fromString('[')}]))[${number(2)}]` + +//([]+([]+[])['constructor']) => 'function String() { [native code] }' +map.S = `([]+([]+[])[${fromString('constructor')}])[${number(9)}]`; +map.g = `([]+([]+[])[${fromString('constructor')}])[${number(14)}]`; +map.p = `([]+(/-/)[${fromString('constructor')}])[${number(14)}]`; + +//Regex +map['\\'] = `(/\\\\/+[])[${number(1)}]`; +map['/'] = `(/-/+[])[${number(0)}]`; +map['-'] = `(/-/+[])[${number(1)}]`; +map['+'] = `(/-+/+[])[${number(2)}]`; +map['>'] = `(/>/+[])[${number(1)}]`; +map['!'] = `(/!/+[])[${number(1)}]`; +map['='] = `(/=/+[])[${number(1)}]`; +map['('] = `(/()/+[])[${number(1)}]`; +map[')'] = `(/()/+[])[${number(2)}]`; +map['{'] = `(/{/+[])[${number(1)}]`; +map['}'] = `(/}/+[])[${number(1)}]`; +map[']'] = `(/]/+[])[${number(1)}]`; + +//(x).toString(x+1 or higher) => char +map.h = `(${number(17)})[${fromString('toString')}](${number(20)})`; +map.k = `(${number(20)})[${fromString('toString')}](${number(30)})`; +map.q = `(${number(26)})[${fromString('toString')}](${number(30)})`; +map.v = `(${number(31)})[${fromString('toString')}](${number(32)})`; +map.w = `(${number(32)})[${fromString('toString')}](${number(33)})`; +map.x = `(${number(33)})[${fromString('toString')}](${number(34)})`; +map.z = `(${number(35)})[${fromString('toString')}](${number(36)})`; + + +//([]+(+[])['constructor']) => 'function Number() { [native code] }' +map.m = `([]+(+[])[${fromString('constructor')}])[${number(11)}]`; + +//([]+([])['constructor']) => 'function Array() { [native code] }' +map.A = `([]+([])[${fromString('constructor')}])[${number(9)}]`; + +//([]+(!{})['constructor']) => 'function Boolean() { [native code] }' +map.B = `([]+(![])[${fromString('constructor')}])[${number(9)}]`; + +//((()=>{})['constructor']) => 'function Function() { [native code] }' +map.F = `((()=>{})[${fromString('constructor')}]+[])[${number(9)}]`; + +//((()=>{})['constructor'](${'return escape')()('\\'))[2] +map.C = `((()=>{})[${fromString('constructor')}](${fromString('return escape')})()(${map['\\']}))[${number(2)}]`; +map['%'] = `((()=>{})[${fromString('constructor')}](${fromString('return escape')})()(${map['\\']}))[${number(0)}]`; +map.E = `((()=>{})[${fromString('constructor')}](${fromString('return escape')})()(${map['>']}))[${number(2)}]`; +map.D = `((()=>{})[${fromString('constructor')}](${fromString('return escape')})()(${map['}']}))[${number(2)}]`; + +const generic_char_encoding = fromString('^'); +//console.log('generic key chars: ' + generic_char_encoding.length); + +for (const [key, value] of Object.entries(map)) { + if(key !== eval(value)) { + throw Error("Encoding error for symbol: '" + key + "'"); + } + //console.log(key + ' encoded chars: ' + value.length); +} + +const compile = code => `(()=>{})[${fromString('constructor')}](${fromString(code)})()`; + +const test_instruction = 'console.log("AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789({[/<>+?*%#!-=]})")'; + +const original_input = 'console.log("Hello world!");'; + +const test = compile(original_input); + +/* +console.log('original length: ' + test_instruction.length); +console.log('transpiled length: ' + test.length); + +eval(test); +*/ + +console.log(test); From fc644db169c42f1bbec45f19bd1bdc2535d6ad50 Mon Sep 17 00:00:00 2001 From: Kabaril Date: Fri, 5 Aug 2022 01:00:00 +0200 Subject: [PATCH 2/2] Further minor optimizations for numbers --- optimized.js | 103 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/optimized.js b/optimized.js index bf0b1c1..8f0b080 100644 --- a/optimized.js +++ b/optimized.js @@ -8,53 +8,72 @@ let fromString = null; const number = n => { if (n === 0) return zero; if (n === 1) return one; + if (n === 2) { + return '!![]+!![]'; + } + if (n === 3) { + return '!![]+!![]+!![]'; + } + if (n === 4) { + return '!![]+!![]+!![]+!![]'; + } + if (n === 5) { + return '((+!![]+[]+ +[])>>!![])'; + } + if (n === 6) { + return '((+!![]+[]+ +[])>>!![])+!![]'; + } + if (n === 7) { + return '(+!![]+[]+ +[])-!![]-!![]-!![]'; + } + if (n === 8) { + return '(+!![]+[]+ +[])-!![]-!![]'; + } + if (n === 9) { + return '(+!![]+[]+ +[])-!![]'; + } + if (n === 10) { + return '(+!![]+[]+ +[])-[]'; + } if (n === 14) { - return '(+!![]+[]+(!![]+!![]+!![]+!![]))/+!![]'; + return '(+!![]+[]+(!![]+!![]+!![]+!![]))-[]'; } if (n === 11) { - return '(+!![]+[]+ +!![])/+!![]'; + return '(+!![]+[]+ +!![])-[]'; } if (n === 18) { - return '(+!![]+!![]+[]+ +![])/+!![]-!![]-!![]'; + return '(+!![]+!![]+[]+ +![])-!![]-!![]'; } if (n === 17) { - return '(+!![]+!![]+[]+ +![])/+!![]-!![]-!![]-!![]'; - } - if (n === 9) { - return '(+!![]+[]+ +[])/!![]-!![]'; - } - if (n === 8) { - return '(+!![]+[]+ +[])/+!![]-!![]-!![]'; + return '(+!![]+!![]+[]+ +![])-!![]-!![]-!![]'; } if (n === 20) { - return '(+!![]+!![]+[]+ +![])/+!![]'; + return '(+!![]+!![]+[]+ +![])-[]'; } if (n === 30) { - return '(+!![]+!![]+!![]+[]+ +![])/+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]'; } if (n === 26) { //100>>2 + 1 - return '((+!![]+[]+ +![]+ +![])/!![]>>!![]+!![])+!![]'; + return '((+!![]+[]+ +![]+ +![])>>!![]+!![])+!![]'; } if (n === 31) { - return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]'; } if (n === 32) { - return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]'; } if (n === 33) { - //99/3 - return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])'; - //return '(+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]+!![]'; } if (n === 34) { - return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]+!![]+!![]'; } if (n === 35) { - return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]+!![]+!![]+!![]'; } if (n === 36) { - return '((+!![]+[]+ +![]+ +![])-!![])/(!![]+!![]+!![])+!![]+!![]+!![]'; + return '(+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]+!![]+!![]+!![]+!![]'; } if (n === 46) { //100 >> 1 - 4 @@ -74,57 +93,55 @@ const number = n => { return '((!![]+!![]+!![]+[]+ +![]+ +![])>>!![]+!![])+!![]+!![]'; } if (n === 42) { - return '(+!![]+!![]+!![]+!![]+[]+ +![])/+!![]+!![]+!![]'; + return '(+!![]+!![]+!![]+!![]+[]+ +![])-[]+!![]+!![]'; } if (n === 122) { - return '(+!![]+[]+ +(!![]+!![])+ +(!![]+!![]))/!![]'; + return '(+!![]+[]+ +(!![]+!![])+ +(!![]+!![]))-[]'; } if (n === 70) { - return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]'; + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])-[]'; } if (n === 68) { - return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]-!![]-!![]'; + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])-!![]-!![]'; } if (n === 69) { - return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]-!![]'; + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])-!![]'; } if (n === 72) { - return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+!![]+!![]'; + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])-[]+!![]+!![]'; } if (n === 71) { - return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+!![]'; + return '(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])-[]+!![]'; } if (n === 80) { - return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +[])/!![]'; + return '((+!![]+[]+ +[])-!![]-!![]+[]+ +[])-[]'; } if (n === 81) { - return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]'; + return '((+!![]+[]+ +[])-!![]-!![]+[]+ +!![])-[]'; } if (n === 82) { - return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]'; + return '((+!![]+[]+ +[])-!![]-!![]+[]+ +!![])-[]+!![]'; } if (n === 84) { - return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]+!![]+!![]'; + return '((+!![]+[]+ +[])-!![]-!![]+[]+ +!![])-[]+!![]+!![]+!![]'; } if (n === 85) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]-!![]-!![]'; - //return '((+!![]+[]+ +[])/+!![]-!![]-!![]+[]+ +!![])/!![]+!![]+!![]+!![]+!![]'; - //return '(+!![]+[]+(!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]+ +[])/!![]+[])>>!![]'; + return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])-!![]-!![]-!![]-!![]-!![]'; } if (n === 90) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]'; + return '((+!![]+[]+ +[])-!![]+[]+ +[])-[]'; } if (n === 89) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]'; + return '((+!![]+[]+ +[])-!![]+[]+ +[])-!![]'; } if (n === 88) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]'; + return '((+!![]+[]+ +[])-!![]+[]+ +[])-!![]-!![]'; } if (n === 87) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]'; + return '((+!![]+[]+ +[])-!![]+[]+ +[])-!![]-!![]-!![]'; } if (n === 86) { - return '((+!![]+[]+ +[])/!![]-!![]+[]+ +[])/!![]-!![]-!![]-!![]-!![]'; + return '((+!![]+[]+ +[])-!![]+[]+ +[])-!![]-!![]-!![]-!![]'; } if (n === 60) { return '(+!![]+[]+ +(!![]+!![])+ +![])>>!![]'; @@ -135,9 +152,9 @@ const number = n => { if(n > 10) { //console.log('missing number:' + n); //Fallback for undefined large numbers - return `(${fromString(n + '')})/!![]` + return `(${fromString(n + '')})-[]` } - return '+' + Array.from({length: n}, () => '!!{}').join('+'); + throw new Error('Undefined number encoding'); } const map = {}; @@ -247,7 +264,7 @@ const generic_char_encoding = fromString('^'); for (const [key, value] of Object.entries(map)) { if(key !== eval(value)) { - throw Error("Encoding error for symbol: '" + key + "'"); + throw new Error("Encoding error for symbol: '" + key + "'"); } //console.log(key + ' encoded chars: ' + value.length); }