2026-07-13 06:50:45 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| UEPar.mq5 |
|
| | | //| Copyright 2026, Niquel Mendoza. |
|
| | | //| https://www.mql5.com/ |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Copyright 2026, Niquel Mendoza."
|
| | | #property link "https://www.mql5.com/"
|
| | | #property version "1.00"
|
| | | #property strict
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #define TSNTABLES_SWAR_MASK_BACK_SLASH (0x5C5C5C5C5C5C5C5C)
|
| | | #define TSNTABLES_SWAR_MASK_COMILLA (0x2222222222222222)
|
| | | #define TSNTABLES_SWAR_LO 0x0101010101010101
|
| | | #define TSNTABLES_SWAR_HI 0x8080808080808080
|
| | | #define TSNTABLES_SWAR_HAS(mask) ((mask - TSNTABLES_SWAR_LO) & ~mask & TSNTABLES_SWAR_HI)
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | template <typename T>
|
| | | string ToBits(T v)
|
| | | {
|
| | | string str = "";
|
| | | for(int i = (sizeof(T) << 3) - 1 ; i >= 0; i--)
|
| | | {
|
| | | str += string(uchar((v & (1ULL << i)) == 0 ? 0 : 1));
|
| | | }
|
| | | return str;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|
| | | // 110
|
| | | // 010
|
| | |
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Script program start function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnStart()
|
| | | {
|
| | | union U
|
| | | {
|
| | | ulong v;
|
| | | uchar data[8];
|
| | | };
|
| | |
|
| | | U va;
|
2026-08-02 16:49:10 -05:00 | | | va.data[0] = '"';
|
2026-08-02 12:33:47 -05:00 | | | va.data[1] = '\\';
|
| | | va.data[2] = '"';
|
| | | va.data[3] = 'b';
|
2026-08-02 16:49:10 -05:00 | | | va.data[4] = '{';
|
| | | va.data[5] = 'g';
|
2026-08-03 09:31:58 -05:00 | | | va.data[6] = '"';
|
2026-08-02 16:49:10 -05:00 | | | va.data[7] = '1';
|
2026-07-13 06:50:45 -05:00 | | | // 8=\
|
| | | // 9=\
|
| | |
|
| | |
|
| | | ulong str = va.v;
|
| | |
|
| | | //---
|
| | | // 1100 0000 10
|
| | | // 1100 0000 1100 0000
|
| | | // 0000 0000
|
| | |
|
| | | //---
|
| | | ulong x_bs = str ^ TSNTABLES_SWAR_MASK_BACK_SLASH;
|
| | | ulong x_qt = str ^ TSNTABLES_SWAR_MASK_COMILLA;
|
| | | ulong has_bs = TSNTABLES_SWAR_HAS(x_bs);
|
| | | ulong has_qt = TSNTABLES_SWAR_HAS(x_qt);
|
| | |
|
| | |
|
| | | //--- Metodo base
|
| | | ulong bits = has_bs >> 7;
|
| | | const ulong magic = 0x0102040810204080;
|
| | | const uchar compacted_bs = uchar(((bits * magic) >> 56) & 0xFF);
|
| | | Print(ToBits(compacted_bs));
|
2026-08-02 12:33:47 -05:00 | | | const uchar even_mask = B'10101010';
|
2026-07-13 06:50:45 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | uchar a = (((compacted_bs << 1) | even_mask) - compacted_bs) ^ even_mask;
|
| | | Print("Dez: ");
|
| | | Print(ToBits(uchar(compacted_bs << 1)));
|
| | | Print("Or with impar: ");
|
| | | Print(ToBits(uchar((compacted_bs << 1) | even_mask)));
|
| | | Print("Minus: ");
|
| | | Print(ToBits(uchar(((compacted_bs << 1) | even_mask) - compacted_bs)));
|
2026-08-02 16:49:10 -05:00 | | | Print("Final:");
|
2026-08-02 12:33:47 -05:00 | | | Print(ToBits(a));
|
2026-08-02 16:49:10 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | uchar escaped = a ^ compacted_bs;
|
| | | uchar escape = (a & compacted_bs) >> 7;
|
| | | Print("overflow: ", escape);
|
2026-07-13 06:50:45 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | /* uchar starts = compacted_bs & ~(compacted_bs << 1);
|
| | | Print("starts");
|
| | | Print(ToBits(starts));
|
2026-07-13 06:50:45 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | uchar starts_par = starts & even_mask;
|
| | | uchar starts_impar = starts & ~even_mask;
|
2026-07-13 06:50:45 -05:00 | | |
|
| | |
|
| | |
|
2026-08-02 12:33:47 -05:00 | | | Print("starts f");
|
| | | Print(ToBits(starts_par));
|
| | | Print(ToBits(starts_impar));
|
| | | uchar sum_par = compacted_bs + starts_par;
|
| | | const ushort sum_impar_wide = (ushort)compacted_bs + ushort(starts_impar);
|
| | | Print("sum f");
|
2026-07-13 06:50:45 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | Print(ToBits(sum_par));
|
| | | Print(ToBits(sum_impar_wide));
|
2026-07-13 06:50:45 -05:00 | | |
|
2026-07-25 13:29:00 -05:00 | | |
|
2026-08-02 12:33:47 -05:00 | | | uchar end_par = sum_par & ~compacted_bs;
|
| | | uchar end_impar = uchar(sum_impar_wide & 0xff) & ~compacted_bs;
|
| | | Print("end");
|
| | | Print(ToBits(end_par));
|
| | | Print(ToBits(end_impar));
|
| | |
|
| | | Print("---");
|
| | | Print("ImPar mask : ", ToBits(even_mask));
|
| | | Print("Par mask : ", ToBits(uchar(~even_mask)));
|
| | | Print("end impr mask: ", ToBits(uchar(end_impar & even_mask)));
|
| | | Print("end par mask : ", ToBits(uchar(end_par & ~even_mask)));
|
| | |
|
| | | uchar end_final = (end_impar & even_mask) | (end_par & ~even_mask);
|
| | | Print("end final");
|
| | |
|
| | | Print(ToBits(end_final));
|
| | |
|
| | |
|
| | | Print(ToBits(Q_real));*/
|
2026-07-25 13:29:00 -05:00 | | |
|
2026-07-13 06:50:45 -05:00 | | |
|
| | | bits = has_qt >> 7;
|
| | | const uchar compacted_qt = uchar(((bits * magic) >> 56) & 0xFF);
|
2026-08-02 12:33:47 -05:00 | | | uchar Q_real = compacted_qt & ~escaped;
|
2026-07-13 06:50:45 -05:00 | | | Print(ToBits(Q_real));
|
2026-08-02 16:49:10 -05:00 | | |
|
| | |
|
| | | Q_real ^= Q_real << 1;
|
| | | Q_real ^= Q_real << 2;
|
| | | Q_real ^= Q_real << 4;
|
| | |
|
| | | Print(ToBits(Q_real));
|
| | |
|
| | | uchar prev_in_string = 0U;
|
| | |
|
| | | const uchar in_string = Q_real ^ prev_in_string;
|
| | | Print(ToBits(in_string));
|
| | |
|
| | |
|
| | | prev_in_string = uchar(char(in_string) >> 7);
|
| | | Print(ToBits(prev_in_string));
|
2026-07-13 06:50:45 -05:00 | | | }
|
2026-08-02 12:33:47 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | /*
|
| | | 00000001
|
| | | \\a\\\b"
|
| | | 11011100 <<1
|
| | | // A este punto ya se tendriaa los caracteres qeu son escapados
|
| | | // Bastaria con un AND Para terminar pero nota que hay un tema el overflow
|
| | | // Y los impares y el tema de las rachas.. creo qeu eso solo funcionara si no
|
| | | // hubieran rachas y solo \ dispersos ahi si te draia los chars que se "escapan"
|
| | | 10111000
|
| | |
|
| | | // Bueno a difernica del otro algoritmo que note qeu es mas grande
|
| | | // dado que separa en dos rutas el tema de pares\impares
|
| | | // obtiebne inicios y con accareo los fines de las rachas y luego compara
|
| | | // con posiciones y se apagan\prendn bits dependei si es valido
|
| | | // Acada la idea es no hacen todo ese trabajo si no solo ver los chars
|
| | | // Que se escapan y no se escapan en base a eso luego aplicaremo la mascara final
|
| | | // Ahora con el or lo que haremos sera añadirle una mascara con los impartes
|
| | | // Por lo qeu vi esto tiene que ver ocn la resta que viene..
|
| | | // Dado uqe con eso el tema del prestamo que sehace y tambien las posiciones
|
| | | // Impares
|
| | | // Dado que las posiciones imapres.. para que quede espcaod
|
| | | // EL caracter final (+1) debe quedar en posicion par
|
| | | // Entonces con las rachas esto creo qeu normaliza inciae,te
|
| | | // Lugeo igual se decahe con un xor (aun no me queda muy calro a decir verdad)
|
| | | // Pero si ver el resultado del esciprt empiza a tener sentdio
|
| | | 10111000 | or
|
| | | 10101010
|
| | | --------
|
| | | 10111010
|
| | |
|
| | | // Luego de eso aplicamos una resta esto es interesante dadao
|
| | | // Que como esmotas resntando uno "norma" y otr odesfasdo enotnces incial
|
| | | // resta 0-1 lo qeu descandena ese "prestamo".. el tema es que
|
| | | // mietrnas dure la racha ira repestandose luego al terminar la racha cuando
|
| | | // se restop con 0 ahi termina creo que la idea aqui era como mezaclar
|
| | | // ese reusltao hace que con ese or pareec que todo qeuda "pares"
|
| | | // Lo otro interesante es qeu aun el resutlado esta a medias
|
| | | // No peudefs scaar conlcusion luego con el xor final se limpia mas
|
| | | // Y queda que los pares su caracter inicla queda como 0
|
| | | // luego los impares el caracter a escapar qeuda como 1..
|
| | | // Esto es porducot de la resta y eso de los paraes muy psible sea por el | or que hicmos
|
| | | 10111010 -
|
| | | 11011100
|
| | | --------
|
| | | 11011110
|
| | |
|
| | | // Ahora limpaismo con xor (los iguales en si los 1-1 se ahcen 0)
|
| | | 11011110 xor
|
| | | 10101010
|
| | | --------
|
| | | 01110100
|
| | |
|
| | | // Por ultimo aplicamos otro xor pero ya no liapdf la msarca si no sobre
|
| | | // El conujutno real esto lo que nos deja es 1 en las posicones que se "escapan"
|
| | | // Luego la idea sera voltear este reusltado y apliucar un and sobre el qt
|
| | | // y ahi sacas las posicones que se requiren
|
| | | 01110100
|
| | | 11011100 xor
|
| | | --------
|
| | | 10101000
|
| | |
|
| | | 01110
|
| | | 0001
|
| | | 111
|
| | | */
|
2026-07-13 06:50:45 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | // 11011100 Base
|
| | | // 10111000 << 1 para deteerminar el fin de cada racha y el bit niical de cada racha queda en 0 (previo a una rahca hay un 0)
|
2026-07-25 13:29:00 -05:00 | | | // Ahora volteas el reusltoad y ahora donde habia 0 hay 1... lo intresante es que los incios de las rachas ahora tienen
|
| | | // 01000111 ~
|
| | | // un 1.. entonces loq eu falta por hacer es dejar eoss 1.. eso lo haremos ahora..
|
2026-07-13 06:50:45 -05:00 | | | //---
|
| | | // 01000111 & // para limpiar
|
| | | // 11011100
|
| | | // 01000100
|
2026-07-25 13:29:00 -05:00 | | | // A este punto tenemos 1 en donde empizar las rachas..
|
| | | // ahora la idea sera versi son impartes o pares.. si son pares aisalmos los bits donde son el fin de la racha
|
| | | // y luego aplicamsoo una mascara de " y ahi nos da los que si son
|
2026-07-13 06:50:45 -05:00 | | | //---
|
2026-07-25 13:29:00 -05:00 | | | // Luego se hace and con mascaras con pares.. la idea es procesar por
|
2026-07-13 06:50:45 -05:00 | | | // separado las maracas de rachas pares e impares.
|
| | | //--- Starts par por ejemplo..
|
| | | // 01000100 (se queda tal cual)
|
| | | // 11011100 + // se suma con los starts esto hace que se valle prestando 1 (1+1 inicial) y al final de la racha par deje un bit prendido
|
| | | //[1]00100000
|
2026-07-25 13:29:00 -05:00 | | | // Luego la idea es que pro ejemplo con las rachas pares seapramos su inico...
|
| | | // Y marcamos los incios pares ahi...
|
2026-08-02 12:33:47 -05:00 | | | // Luego con acarreo tenemos los finaes..
|
2026-07-25 13:29:00 -05:00 | | | // Ahora para los inicios pares.. la idea es que tambien acaben en posiciones pares (caracter + 1)
|
| | | // ejemplo [0][1][2]
|
| | | // \ \ aqui si acaba en un par (buneo un impar + 1) en este caso acabo en 2
|
| | | // entonces bien.... aqui se qeudaira un bit prendido en 1 luego cuando combinemos ambas rachas
|
| | | // para los pares negamos la mascara de 01010101 osea se hace una mascara de impares
|
| | | // la idea e sque al hacer and en caso la racha acabe en impares... su bit se mantine esi no se hace 10
|
2026-08-02 12:33:47 -05:00 | | | // esto es interensate luego que en la negacion final.. esos bits pasan a ser 0.. (los 1..)
|
2026-07-25 13:29:00 -05:00 | | | // es como una liuempiza.. entonces quedan los bits prendidos los end validos... no escapados
|
| | | // luego ahi una and con la mcarsa de qt y listo qeudan los bits con " validos
|