ПредишенСледващото

Преди няколко месеца, аз получих още едно писмо:

Относно: Можете да направите разбивка и да ми каже този код от един ред?

Текст: Помислете за мен глупаво, но ... аз не го разбирам, и аз ще бъда благодарен, ако rastolkuesh подробности. Този лъч изотоп 128 знака. Мисля, че е очарователно.

index.html


Забелязал съм, че има променлива к - константа, така че да го премахнете от линията и преименуван на закъснението.

code.js
забавяне Var = 64;
Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; i- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п / забавяне? ^ й) 1: 2]) J = забавяне / I; p.innerHTML = P »;
Var п = setInterval (изготвят, забавяне);
На следващо място, Var равенство е само линията, която Оценка извършва в зависимост от честотата, с setInterval, защото setInterval може да получава и функции, и струни. Страдах Var изготви ясна функция, но са запазили оригиналния ред за справка за всеки случай.

забавяне Var = 64;
Var р = document.getElementById ( «р»); // <—————
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () за (п + = 7, I = забавяне, Р = 'p.n; I - = 1 / забавяне; P + = P [Ь% 2. (I% 2 * J - J + п / забавяне ^ й) 1. 2]) J = забавяне / I; p.innerHTML = P;
>
>;
Var п = setInterval (изготвят, забавяне);
Тогава обявен променливите I, Р и Й и ги изнесоха в началото на функцията.

забавяне Var = 64;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () Var I = забавяне; // <—————
Var Р = 'p.n;
Var й;
за (п + = 7; I> 0; P + = P [Ь% 2. (I% 2 * J - J + п / забавяне ^ й) 1. 2]) J = забавяне / I; p.innerHTML = P;
I - = 1 / забавяне;
>
>;
Var п = setInterval (изготвят, забавяне);
Оставих за цикъл, и да го превърнат в линия, докато. От трите части от бившия останаха само за една част от CHECK_EVERY_LOOP, и всичко останало (RUNS_ONCE_ON_INIT; DO_EVERY_LOOP) пострада вън от примката.

забавяне Var = 64;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () Var I = забавяне;
Var Р = 'p.n;
Var й;
п + = 7;
докато (I> 0) // Актуализация на HTML
p.innerHTML = P;

J = забавяне / I;
I - = 1 / забавяне;
P + = P [Ь% 2. (I% 2 * J - J + п / забавяне ^ й) 1. 2];
>
>;
Var п = setInterval (изготвят, забавяне);
Тук започна трикомпонентна оператор (състояние да направя, ако е вярно направя, ако фалшива ..) В P + = P [в% 2. (аз% 2 * й - к + п / забавяне ^ й) 1. 2].

Тази стойност (индекс) се използва за промяна на линията Р, така че индексът ще наричаме и се превърне в съответствие P + = P [индекс].

забавяне Var = 64;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () Var I = забавяне;
Var Р = 'p.n;
Var й;
п + = 7;
докато (и> 0) // Актуализация на HTML
p.innerHTML = P;

J = забавяне / I;
I - = 1 / забавяне;

нека индекс;
нека iIsOdd = (аз% 2 = 0!); // <—————

P + = P [индекс];
>
>;
Var п = setInterval (изготвят, забавяне);
аз се разпространи 1 от стойността на индекса = (I% 2 * J - J + п / забавяне ^ й) Един в друг оператор, ако.

Ето хитър начин да се провери за четност резултати в скоби, когато дори стойност се връща 0, но за странно - 1. - с побитова. Тя работи по следния начин:

1 1 = 1
0 1 = 0

Ето защо, нещо 1 преобразува «нещо» в двоичен представителство, и завършва в предната част на устройството необходимия брой нули, за да съответства на размера на «нещо», и връща резултат И последната част. Така например, 5 в двоичен е равно на 101, така че ако го прилага по отношение на логическа операция И с устройството, можете да получите следното:

0 1 // 0 - дори върне 0
1 1 // 1 - странно връщане 1
2 1 // 0 - дори върне 0
3 1 // 1 - странно връщане 1
4 1 // 0 - дори върне 0
5 1 // 1 - странно връщане 1
Моля, имайте предвид, че аз също се преименува на останалата част от индекса на магия, така че кода с разви 1 е както следва:

забавяне Var = 64;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () Var I = забавяне;
Var Р = 'p.n;
Var й;
п + = 7;
докато (и> 0) // Актуализация на HTML
p.innerHTML = P;

J = забавяне / I;
I - = 1 / забавяне;

нека индекс;
нека iIsOdd = (аз% 2 = 0!);

P + = P [индекс];
>
>;
Var п = setInterval (изготвят, забавяне);
Освен I разгъната P + = P [индекс]; в изявление превключвател. В този момент, стана ясно, че индексът може да се само един от трите стойности - 0, 1 или 2. Също така се разбира, че променливата Р е винаги инициализира със стойности Var Р = 'p.n ";, където 0 означава р, 1 показва нататък. и 2 точки до п - нов ред

забавяне Var = 64;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;
Var равенство = функция () Var I = забавяне;
Var Р = 'p.n;
Var й;
п + = 7;
докато (и> 0) // Актуализация на HTML
p.innerHTML = P;

J = забавяне / I;
I - = 1 / забавяне;

нека индекс;
нека iIsOdd = (аз% 2 = 0!);

ако (iIsOdd) да магически = (I% 2 * J - J + п / забавяне ^ J);
нека magicIsOdd = (магия% 2 = 0!); // 1
ако (magicIsOdd) индекс = 1;
> Друго индекс = 0;
>
> Друго индекс = 2;
>

Var п = setInterval (изготвят, забавяне);
I измисли Вар п = setInterval оператора (изготвят, забавяне). setInterval метод връща числа, започващи с една, стойността увеличават с всяко повикване. Това число може да се използва за clearInterval (т.е. да отмени). В нашия случай, setInterval се нарича само веднъж, и променливата п просто го настроите да 1.

Аз също преименуван забавянето на забавянето да ви напомня, че това е само една константа.

И накрая, но не на последно място, аз съм поставил скоби в аз% 2 * й - к + п / ЗАБАВЯНЕ ^ й да покаже, че ^ (побитовото XOR) по-нисък приоритет от операторите%, *, -, +, и /. С други думи, първо следват всички от горните изчисления, а по-късно ~. Това означава, че се оказва, (I% 2 * J - J + п / DELAY) ^ й).

Изясняване: Аз посочи, че аз погрешно поставени p.innerHTML = P; // Актуализация на HTML в цикъла, така че то да бъде премахнато от там.

конст DELAY = 64; // около 15 кадъра в секунда 15 кадъра в секунда * 64 секунди = 960 рамки
Var п = 1;
Var р = document.getElementById ( «р»);
// Var равенство = «за (п + = 7, I = забавяне, Р = 'р \ п.'; I- = 1 / забавяне; P + = P [Ь% 2 (I% 2 * й-й + п? /delay^j)1:2])j=delay/i;p.innerHTML=P »;

/ **
* Чертае картина
* 128 32 символа на символа = общо 4096 символа
* /
Var равенство = функция () Var I = забавяне; // 64
Var Р = 'p.n; // Първа линия, справка за символа за използване
Var й;

J = ЗАБАВЯНЕ / I;
I - = 1 / забавяне;

нека индекс;
нека iIsOdd = (аз% 2 = 0!);

ако (iIsOdd) да магически = ((I% 2 * J - J + п / DELAY) ^ J); // <——————
нека magicIsOdd = (магия% 2 = 0!); // 1
ако (magicIsOdd) индекс = 1;
> Друго индекс = 0;
>
> Друго индекс = 2;
>

setInterval (равенство, 64);
Крайният резултат на изпълнението може да се види тук.

Част 2: Разбиране на кода
И така, какво става тук? Нека си го кажем.

Първоначално стойността на I е настроен на 64 чрез Var I = забавяне;, след всеки цикъл се намалява до 1/64 (0.015625) през I - = 1 / ЗАБАВЯНЕ. Цикълът продължава, докато не е по-голяма от нула (а кода (I> 0)

Изображението се състои от 32 реда, с 128 символа всеки. За удобство, 64 х 64 = 128 х 32 = 4096. Стойността на и може да бъде дори (нечетен не да iIsOdd = (I% 2 = 0);) ако аз е четен брой стриктно. .. Това се случи 32 пъти, когато тя е равна на 64, 62, 60 и 32, и т.н. Те пъти индекс се индекса на стойност 2 = 2; и се прибавя към линия нов ред: P + = «п»; // известен P [2]. Останалите 127 символите в низа ще бъде стойността р или по-малко.

Но когато се инсталира р и кога.

Ами, за начало, ние знаем точно какво да се инсталира. за нечетен стойност да магически = ((I% 2 * J - J + п / DELAY) ^ J); или определен р, ако "магически" chotnaya.

Var Р = 'p.n;

ако (magicIsOdd) индекс = 1; // втория знак в Р -.
> Друго индекс = 0; // първия знак в P - стр
>
Но когато магията е още, странно и кога? Това е въпрос на един милион долара. Преди да отида при него, нека да се определи нещо друго.

Ако премахнете + п / закъснение от нека магията = ((аз% 2 * й - к + п / закъснение) ^ й);, можете да получите статично изображение, което обикновено не се движат:

Обратното инженерство един ред JavaScript превод, новини караул

Сега погледнете магията без + N / забавяне. Как да получите тази красива картина?

(I% 2 * J - й) ^ к

Забележете какво се случва във всеки кръг:

J = ЗАБАВЯНЕ / I;
I - = 1 / забавяне;
С други думи, може да се изрази краен й и като J = ЗАБАВЯНЕ / (I + 1 / DELAY). Въпреки това, тъй като 1 / ЗАБАВЯНЕ твърде малък брой, за този пример може да се изхвърли + 1 / забавяне и да се опрости експресия J = ЗАКЪСНЕНИЯ / I = 64 / т.

В този случай, може да презапис (I% 2 * J - й) ^ й като и% 2 * 64 / I - 64 / и) ^ 64 / т.

Ние използваме онлайн графики калкулатор да изготви графики на някои от тези функции.

На първо място, аз otrisuem% 2.

Листата сладък графика със стойности от 0 до 2 години.

Ако направи 64 / и, ние получаваме графика:

Обратното инженерство един ред JavaScript превод, новини караул

Ако се направи цялата лява половина на израза, можете да получите графика, която прилича на комбинация от предишните две.

Обратното инженерство един ред JavaScript превод, новини караул

В крайна сметка, ако ние otrisuem следващите две функции, ще видим един до друг.

Обратното инженерство един ред JavaScript превод, новини караул

Какво правят тези класации?
Нека си припомним въпроса, че ние се опитваме да отговорим, това е, как е бил толкова красив статична картина:

Обратното инженерство един ред JavaScript превод, новини караул

Ние знаем, че ако "магия» (аз% 2 * й - й) ^ й отнема още по стойност, а след това трябва да добавите р, но за нечетен брой, който искате да добавите.

Увеличаване на първите 16 редовете на бар графика, където има стойности 64-32.

Обратното инженерство един ред JavaScript превод, новини караул

Тя връща 0, ако и двата бита са 1 или и двете са 0.

Нашата й започва в един и се движи бавно към двойката, спирайки в непосредствена близост до него, така че можем да предположим, че винаги е единство, докато закръгляне (Math.floor (1.9999) === 1), и имаме нужда от още един елемент от лявата страна , за да доведе до нула и да ни даде стр.

С други думи, всяка зелена диагонал представлява единичен ред в тази графика. Тъй като за първите 16 реда от стойността на к е винаги по-голям от 1, но по-малко от 2, а след това можем да се странно стойност само ако лявата страна на изразяване (и% 2 * й - й) ^ й, тя е и% 2 * I / 64 - I / 64, т.е. зелен диагонал да бъде над 1 или под -1.

1 ^ 1 // 0 - дори стр
1.1 ~ 1.1 // 0 - дори стр
0,9 ^ 1 // 1 - нечетен.
0 ^ 1 // 1 - нечетен.
-1 ^ 1 // -2 - дори стр
-1.1 ^ 1.1 // -2 - дори стр
Ако се вгледате в нашия график, не е правилният диагонала почти е над 1 или под 1 (малко четни числа - малко р характер). След това идва малко по-нататък през границата, а третият - само малко повече, и така на номер 16 линия едва държи в границите на между 2 и -2 ... След линия 16, ще видим, че нашата статично график променя своя характер.

Обратното инженерство един ред JavaScript превод, новини караул

След преминаване на границата 2 16-ия ред на стойността й, така че се очаква резултат. Сега ние се четен брой, ако зелен диагонала над или под 2 -2 или в рамките на рамки 1 и 1, но не е в контакт с тях. Ето защо ние можем да видите на снимката по две или повече р знакови групи, започващи с 17-ти ред.

Ако се вгледате в някои от най-ниските редове в анимирани картина, ще забележите, че те не следва същия модел, защото на големите колебания в графиката.

Сега обратно до + п / забавяне. В кода, ние виждаме, че стойността на п започва от 8 (1 setInteval от плюс 7 до всеки метод на разговор). След това, той се е увеличил със 7 всеки път, когато setInteval.

След достигане на стойност на графика 64 се променя, както следва.

Обратното инженерство един ред JavaScript превод, новини караул

Имайте предвид, че й е все още около единство, но сега в лявата половина на червен диагонал от порядъка на 62-63 е приблизително близка до нула, а в дясната половина от порядъка на 63-64 - около уреда. Тъй като нашите герои се появяват в низходящ ред 64-62, може да се очаква, че дясната половина на диагонала в региона 63-64 (1 ^ 1 = 0 // дори) се добавя р герои купчина и лявата половина на диагонала в региона 62-63 ( 1 ^ 0 = 1 // нечетен) се добавя няколко точки. Всичко това ще се увеличи от ляво на дясно, като обикновен текст.

Обратното инженерство един ред JavaScript превод, новини караул

В този момент, на броя на стр герои увеличи до постоянна стойност. Така например, през първата половина на броя на ценности винаги ще бъде още. Сега р и символи. ще се промени само.

Например, когато п е увеличил със 7 на следващия setInterval повикване, графиката ще се промени съвсем леко.

Обратното инженерство един ред JavaScript превод, новини караул

Имайте предвид, че диагонала на първия ред (близо до марката от 64) изместен с около една малка квадратна нагоре. От четири големи квадрати 128 представляват символи в един голям квадратен е 32 символа, и в един малък квадрат 32/5 кодировка стойност = 6,4 (приблизително). Ако се вгледаме в оказване на HTML, можете да го направите на първия ред измества надясно от 7 знака.

Обратното инженерство един ред JavaScript превод, новини караул

И един последен пример. Това е, което се случва, ако се обадите setInterval дори седем пъти, и п е равно на 64 + 9 х 7.

Обратното инженерство един ред JavaScript превод, новини караул

За първи ред J все още е равно на 1. Сега горната половина червен диагонал около марката 64 граничи приблизително на две, а в долния край в близост до единство. Това обръща изображението в обратна посока, тъй като сега е 1 ^ 2 = 3 // нечетен -. и 1 ^ 1 = 0 // дори - стр. Така че можете да очаквате куп точки, които ще бъдат използвани за символи стр.

Тя ще изглежда по този начин.

Обратното инженерство един ред JavaScript превод, новини караул

График безкрайно глава.

Надяваме се, че нашата работа има някакъв смисъл. Малко вероятно е, че аз никога няма да бъде в състояние да измисли нещо подобно, но ми беше интересно да гледам в кода.

Подкрепете проекта - споделете линка, благодаря!