Babylonianラむブラリの実装

この蚘事では、バビロニアの図曞通に぀いお、そしお最も重芁なこずずしお、それを再䜜成する方法、そしお実際にあらゆる図曞通に぀いお孊びたす。

ルむス・ボルヘスの バビロニア図曞通からの匕甚から始めたしょう。

匕甚
「宇宙-図曞通ず呌ばれるこずもある-巚倧な、おそらく無限の数の六角圢のギャラリヌで構成され、幅の広い換気宀が䜎いレヌルで囲たれおいたす。 各六角圢から、2぀の䞊階ず2぀の䞋階が芋えたす-無限に。

「ラむブラリは、正確な䞭心が六角圢の1぀にあるボヌルであり、衚面にはアクセスできたせん。 各六角圢の各壁には5぀の棚があり、各棚には同じ圢匏の32冊の本があり、各本には410ペヌゞ、各ペヌゞには40行、各行には玄80の黒文字がありたす。 本の背に文字がありたすが、それらはペヌゞが蚀うこずを定矩したり、予知したりしたせん。 この矛盟は、か぀おは䞍可解であるように思えたした。」


ランダムな六角圢を入力し、任意の壁に移動し、任意の棚を芋お、最も奜きな本を取るず、あなたは動揺する可胜性が最も高くなりたす。 結局のずころ、あなたはそこでの人生の意味を知るこずを期埅しおいたしたが、奇劙なキャラクタヌのセットを芋たした。 しかし、そんなに早く動揺しないでください 本のほずんどは、25文字のすべおの可胜なバリ゚ヌションの組み合わせ怜玢であるため、意味がありたせん ボルゲスが圌のラむブラリで䜿甚したのはこのアルファベットですが、読者はラむブラリに任意の数の文字があるこずがわかりたす 。 図曞通の䞻な法則は、絶察に同䞀の本が2冊も存圚しないため、その数は有限であり、図曞通もい぀かは終了するずいうものです。 ボルヘスは、図曞通が定期的であるず信じおいたした。

匕甚
「恐らく恐怖ず老いが私を欺いおいるかもしれたせんが、人類-唯䞀のもの-は絶滅に近づいおおり、図曞通は生き残るだろうず考えおいたす照らされた、無人の、無限の、絶察に動かず、貎重なボリュヌムで満たされ、圹に立たず、壊れず、神秘的です。 私は無限に曞きたした。 私はこの蚀葉を修蟞孊ぞの愛からは蚭定したせんでした。 䞖界は無限だず仮定するのは理にかなっおいるず思いたす。 それが限られおいるず考える人は、廊䞋、階段、六角圢のどこかが未知の理由で終わるこずができるこずを認めおいたす-そのような仮定はばかげおいたす。 境界なしにそれを想像する人は、可胜な本の数が限られおいるこずを忘れおいたす。 この叀くからある問題に察するこのような解決策を提案するこずを敢えおしたす。ラむブラリは無限であり、定期的です。 氞遠の攟浪者があらゆる方向ぞの旅に出た堎合、圌は䜕䞖玀も埌に同じ本が同じ混乱で繰り返されるこずを確認するこずができたす繰り返されるず秩序になりたす-秩序。 この優雅な垌望は私の孀独を明るくしたす。」


ナンセンスず比范しお、人が少なくずも䜕らかの圢で内容を理解できる本はほずんどありたせんが、これは図曞通が人が発明したすべおのテキストを含むずいう事実を倉曎したせん。 さらに、子䟛の頃から、シンボルのシヌケンスには意味があるものずそうでないものを考慮するこずに慣れおいたす。 実際、ラむブラリのコンテキストでは、それらの間に違いはありたせん。 しかし、理にかなっおいるもののパヌセンテヌゞははるかに䜎く、それを蚀語ず呌びたす。 これは人々の間のコミュニケヌションの手段です。 どの蚀語にも数䞇個の単語しか含たれおおらず、そのうちの70が匷床を知っおいるため、曞籍の組み合わせ怜玢のほずんどを解釈できないこずがわかりたす。 そしお、誰かがアポフェニアに苊しみ、ランダムなキャラクタヌのセットでさえ隠された意味を芋たす。 しかし、これはステガノグラフィにずっおは良い考えです さお、私はコメントでこのトピックに぀いお議論し続けおいたす。

このラむブラリの実装に進む前に、興味深い事実に驚かされたすLouis Borgesのバビロニアラむブラリを再䜜成する堎合、そのボリュヌムは目に芋えるUniverse 10 ^ 611338Timesのボリュヌムを超えるため、成功したせん。 さらに倧きなラむブラリで䜕が起こるかに぀いお、私は考えるこずさえ怖いです。

ラむブラリの実装


モゞュヌルの説明


ちょっずした玹介は終わりたした。 しかし、それは意味がないわけではありたせん。今、あなたはバビロニアの図曞通がどのようなものであるかを理解し、読むこずはより興味深いだけです。 しかし、私は元のアむデアから逃げ、「ナニバヌサル」ラむブラリを䜜成したかったのです。これに぀いおは埌で説明したす。 Node.jsの䞋にJavaScriptを蚘述したすが、ラむブラリは䜕ができたすか

さらに、それは普遍的、すなわち ラむブラリパラメヌタは、必芁に応じお倉曎できたす。 さお、最初にモゞュヌルのコヌド党䜓を衚瀺し、詳现に分析し、それがどのように機胜するかを確認し、いく぀かの蚀葉を話すず思いたす。 Githubリポゞトリ

メむンファむルはindex.jsで、ラむブラリのロゞック党䜓が蚘述されおいたす。このファむルの内容に぀いお説明したす。

let sha512 = require(`js-sha512`); 

sha512ハッシュアルゎリズムを実装するモゞュヌルを接続したす。 あなたには奇劙に思えるかもしれたせんが、それでも私たちにずっお有甚です。
モゞュヌルの出力は䜕ですか 関数を返したす。呌び出しは、必芁なすべおのメ゜ッドを含むラむブラリオブゞェクトを返したす。 すぐに返すこずはできたすが、関数にパラメヌタヌを枡しお「必芁な」ラむブラリを取埗する堎合、ラむブラリの管理はそれほど䟿利ではありたせん。 これにより、「ナニバヌサル」ラむブラリを䜜成できたす。 ES6スタむルで蚘述しようずするので、私の矢印関数はパラメヌタヌずしおオブゞェクトを受け入れたす。その埌、オブゞェクトは必芁な倉数に分解されたす。

 module.exports = ({ lengthOfPage = 4819, lengthOfTitle = 31, digs = '0123456789abcdefghijklmnopqrstuvwxyz', alphabet = ', .', wall = 5, shelf = 7, volume = 31, page = 421, } = {}) => { // ... }; 

次に、パラメヌタヌを調べたす。 暙準的な数倀パラメヌタヌずしお、私は玠数を遞択するこずにしたした。


ご芧のずおり、これはルむス・ボルヘスの本物のバビロニア図曞通に少し䌌おいたす。 しかし、私はそれらを芋る方法になるこずができる「ナニバヌサル」ラむブラリを䜜成するこずをすでに䜕床も蚀っおいたすしたがっお、16進数は䜕らかの方法で解釈するこずができたす、たずえば、目的のラむブラリが栌玍されおいる堎所の識別子だけ情報。 バビロニアの図曞通はその䞀぀に過ぎたせん。 しかし、それらすべおには倚くの共通点がありたす。1぀のアルゎリズムがパフォヌマンスを担圓したす。

ペヌゞ怜玢および衚瀺アルゎリズム


あるアドレスに行くず、ペヌゞのコンテンツが衚瀺されたす。 同じアドレスに再床アクセスするず、コンテンツはたったく同じになりたす。 ラむブラリのこのプロパティは、擬䌌乱数を生成するアルゎリズムを提䟛したす- 線圢合同法 。 アドレスを生成するためにキャラクタヌを遞択する必芁がある堎合、たたは逆にペヌゞのコンテンツを䜜成する必芁がある堎合、それが圹立ち、ペヌゞ数、棚などが穀物ずしお䜿甚されたす。 私のPRNG構成m = 2 ^ 324294967296、a = 22695477、c =1。たた、実装では、数倀生成の原則のみが線圢合同法から残り、残りは倉曎されるこずも远加したいず思いたす。 プログラムリストをさらに移動したす。

コヌド
 module.exports = ({ lengthOfPage = 4819, lengthOfTitle = 31, digs = '0123456789abcdefghijklmnopqrstuvwxyz', alphabet = ', .', wall = 5, shelf = 7, volume = 31, page = 421, } = {}) => { let seed = 13; //   const rnd = (min = 1, max = 0) => { //   //    min  max seed = (seed * 22695477 + 1) % 4294967296; //   //      return min + seed / 4294967296 * (max - min); //   //   }; const pad = (s, size) => s.padStart(size, `0`); //   //       let getHash = str => parseInt(sha512(str).slice(0, 7), 16); //  const mod = (a, b) => ((a % b) + b) % b; //    const digsIndexes = {}; //     //    digs const alphabetIndexes = {}; //     //    alphabet Array.from(digs).forEach((char, position) => { //    digs digsIndexes[char] = position; //     //   }); Array.from(alphabet).forEach((char, position) => { //    alphabet alphabetIndexes[char] = position; //     //   }); return { //    }; 


ご芧のように、PRNGグレむンは番号を受信するたびに倉化し、結果はいわゆる参照ポむントグレむンに盎接䟝存したす。グレむンはその埌、数倀が興味を持ちたす。 アドレスを生成するか、ペヌゞのコンテンツを取埗したす

getHash関数は、参照ポむントの生成に圹立ちたす。 いく぀かのデヌタからハッシュを取埗し、7文字を取埗し、10進数システムに倉換するだけで完了です

mod関数は、挔算子ず同じように動䜜したす。 ただし、配圓が<0の堎合このような状況が発生する可胜性がありたす、 mod関数は特別な構造のため正の数を返したす。アドレスでペヌゞのコンテンツを受信するずきにアルファベット文字列から文字を正しく遞択するためにこれが必芁です。

そしお、最埌のデザヌトコヌドは返されたラむブラリオブゞェクトです。

コヌド
 return { wall, shelf, volume, page, lengthOfPage, lengthOfTitle, search(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), page = pad(`${(Math.random()* this.page + 1 ^ 0)}`, 3), locHash = getHash(`${wall}${shelf}${volume}${page}`), hex = ``, depth = Math.random() * (this.lengthOfPage - searchStr.length) ^ 0; for (let i = 0; i < depth; i++){ searchStr = alphabet[Math.random() * alphabet.length ^ 0] + searchStr; } seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]] || -1, rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}-${+page}`; }, searchExactly(text) { const pos = Math.random() * (this.lengthOfPage - text.length) ^ 0; return this.search(`${` `.repeat(pos)}${text}${` `.repeat(this.lengthOfPage - (pos + text.length))}`); }, searchTitle(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), locHash = getHash(`${wall}${shelf}${volume}`), hex = ``; searchStr = searchStr.substr(0, this.lengthOfTitle); searchStr = searchStr.length == this.lengthOfTitle ? searchStr : `${searchStr}${` `.repeat(this.lengthOfTitle - searchStr.length)}`; seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]], rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}`; }, getPage(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}${pad(addressArray[4], 3)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfPage) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfPage); }, getTitle(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfTitle) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfTitle); } }; 


最初に、前に説明したラむブラリのプロパティを曞き蟌みたす。 main関数が呌び出された埌でも倉曎できたす原則ずしお、コンストラクタヌず呌ばれたすが、私のコヌドはラむブラリのクラス実装に匱く䌌おいるため、「main」ずいう単語に限定したす。 おそらく、この動䜜は完党に適切ではなく、柔軟です。 次に、各メ゜ッドを調べたす。

怜玢方法


 search(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random() * this.volume + 1 ^ 0)}`, 2), page = pad(`${(Math.random() * this.page + 1 ^ 0)}`, 3), locHash = getHash(`${wall}${shelf}${volume}${page}`), hex = ``, depth = Math.random() * (this.lengthOfPage - searchStr.length) ^ 0; for (let i = 0; i < depth; i++){ searchStr = alphabet[Math.random() * alphabet.length ^ 0] + searchStr; } seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]] || -1, rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}-${+page}`; } 

ラむブラリ内のsearchStr文字列のアドレスを返したす。 これを行うには、 壁、棚、ボリュヌム、ペヌゞをランダムに遞択したす 。 ボリュヌムずペヌゞにもれロが埋め蟌たれ、目的の長さになりたす。 次に、それらを文字列に連結しおgetHash関数に枡したす。 結果のlocHashは開始点、぀たり 穀物。

予枬䞍胜性を高めるため、アルファベットの擬䌌ランダム文字でsearchStrの 深さを補い、シヌドシヌドをlocHashに蚭定したす 。 この段階では、ラむンをどのように補完するかは問題ではないため、組み蟌みのJavaScript PRNGを䜿甚できたす。これは重芁ではありたせん。 拒吊するこずもできたすので、興味のある結果は垞にペヌゞの䞊郚に衚瀺されたす。

残っおいるのは、六角圢の識別子を生成するこずだけです。 searchStr行の各文字に察しお、アルゎリズムを実行したす。

  1. alphabetIndexesオブゞェクトからアルファベットのむンデックス文字の番号を取埗したす。 そうでない堎合は-1を返したすが、これが発生した堎合は間違いなく䜕か間違ったこずをしおいるこずになりたす。
  2. PRNGを䜿甚しお、0からアルファベットの長さの範囲で擬䌌乱数randを生成したす。
  3. 新しいむンデックスを蚈算したす。これは、シンボルむンデックスの数ず擬䌌乱数randの合蚈ずしお蚈算され、 digsの長さを法ずしお陀算されたす。
  4. したがっお、六角圢の識別子の桁-newChar  digsから取埗を取埗したした。
  5. newCharを16進数識別子16進数に远加したす

16進数の生成が完了するず、目的の文字列が含たれおいる堎所の完党なアドレスを返したす。 アドレスコンポヌネントはハむフンで区切られたす。

SearchExactlyメ゜ッド


 searchExactly(text) { const pos = Math.random() * (this.lengthOfPage - text.length) ^ 0; return this.search(`${` `.repeat(pos)}${text}${` `.repeat(this.lengthOfPage - (pos + text.length))}`); } 

このメ゜ッドは、 怜玢メ゜ッドず同じこずをすべお行いたすが、すべおの空きスペヌスを埋めたす 怜玢文字列searchStrをlengthOfPage文字の長さにしたすスペヌス。 そのようなペヌゞを衚瀺するず、テキスト以倖には䜕も衚瀺されおいないように芋えたす。

SearchTitleメ゜ッド


 searchTitle(searchStr) { let wall = `${(Math.random() * this.wall + 1 ^ 0)}`, shelf = `${(Math.random() * this.shelf + 1 ^ 0)}`, volume = pad(`${(Math.random()* this.volume + 1 ^ 0)}`, 2), locHash = getHash(`${wall}${shelf}${volume}`), hex = ``; searchStr = searchStr.substr(0, this.lengthOfTitle); searchStr = searchStr.length == this.lengthOfTitle ? searchStr : `${searchStr}${` `.repeat(this.lengthOfTitle - searchStr.length)}`; seed = locHash; for (let i = 0; i < searchStr.length; i++){ let index = alphabetIndexes[searchStr[i]], rand = rnd(0, alphabet.length), newIndex = mod(index + parseInt(rand), digs.length), newChar = digs[newIndex]; hex += newChar; } return `${hex}-${wall}-${shelf}-${+volume}`; } 

searchTitleメ゜ッドは、 searchStrずいう本の䜏所を返したす。 内郚では、 searchに非垞に䌌おいたす 。 違いは、 locHashを蚈算するずきに、ペヌゞを䜿甚しおその名前をブックにバむンドしないこずです。 ペヌゞに䟝存するべきではありたせん。 searchStrはlengthOfTitleに切り捚おられ、必芁に応じおスペヌスが埋め蟌たれたす。 同様に、六角圢の識別子が生成され、受信したアドレスが返されたす。 任意のテキストの正確なアドレスを怜玢するずきのように、ペヌゞが存圚しないこずに泚意しおください。 したがっお、あなたが発明した名前で本の内容を知りたい堎合は、行きたいペヌゞを決めおください。

GetPageメ゜ッド


 getPage(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}${pad(addressArray[4], 3)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfPage) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfPage); } 

怜玢方法の反察。 そのタスクは、ペヌゞのコンテンツを指定されたアドレスに戻すこずです。 これを行うには、区切り文字「-」を䜿甚しおアドレスを配列に倉換したす。 これで、六角圢の識別子、壁、棚、本、ペヌゞなどの䜏所コンポヌネントの配列ができたした。 locHashは、 怜玢メ゜ッドで行ったのず同じ方法で蚈算したす。 アドレスを生成したずきず同じ番号を取埗したす。 これは、PRNGが同じ数倀を生成するこずを意味したす。゜ヌステキストに察する倉換の可逆性を保蚌するのは、この動䜜です。 蚈算するには、六角圢識別子の各シンボル事実䞊、これは数字ですでアルゎリズムを実行したす。

  1. 文字列digsの むンデックスを蚈算したす 。 digsIndexesから取埗したす。
  2. PRNGを䜿甚しお、0からこの矎しい数字の数字を含む文字列の長さに等しい倧きな数字の数䜓系の基数たでの範囲の擬䌌乱数randを生成したす。 すべおが明らかです。
  3. ゜ヌステキストnewIndexの文字䜍眮をindexずrandの差ずしお蚈算し、アルファベットの長さを法ずしお陀算したす。 差が負になる可胜性があり、通垞の陀算モゞュロは負のむンデックスを䞎えたすが、これは私たちには適さないため、モゞュロ陀算の修正バヌゞョンを䜿甚したす。 䞊蚘の匏から絶察倀を取埗するオプションを詊すこずができたす。これは負の数の問題も解決したすが、実際にはただテストされおいたせん
  4. ペヌゞのテキストの文字はnewCharで、アルファベットからむンデックスを取埗したす。
  5. 結果にテキスト文字を远加したす。

この段階で埗られた結果は垞にペヌゞ党䜓を埋めるわけではないため、珟圚の結果から新しい粒子を蚈算し、アルファベットの文字で空のスペヌスを埋めたす。 PRNGは、シンボルの遞択に圹立ちたす。

これにより、ペヌゞコンテンツの蚈算が完了し、最倧長にトリミングするこずを忘れずに、それを返したす。 おそらく、入力アドレスで六角圢の識別子が䞍圓に倧きい可胜性がありたす。

GetTitleメ゜ッド


 getTitle(address) { let addressArray = address.split(`-`), hex = addressArray[0], locHash = getHash(`${addressArray[1]}${addressArray[2]}${pad(addressArray[3], 2)}`), result = ``; seed = locHash; for (let i = 0; i < hex.length; i++) { let index = digsIndexes[hex[i]], rand = rnd(0, digs.length), newIndex = mod(index - parseInt(rand), alphabet.length), newChar = alphabet[newIndex]; result += newChar; } seed = getHash(result); while (result.length < this.lengthOfTitle) { result += alphabet[parseInt(rnd(0, alphabet.length))]; } return result.substr(result.length - this.lengthOfTitle); } 

たあ、物語は同じです。 PRNGグレむンの蚈算でペヌゞ番号が考慮されず、結果をブック名の最倧長-lengthOfTitleに远加しおトリミングする堎合にのみ、前の方法の説明を読むこずを想像しおください。

ラむブラリを䜜成するためのテストモゞュヌル


バビロニアのようなラむブラリの動䜜原理を怜蚌した埌、実際にすべおを詊しおみたしょう。 Louis Borgesによっお䜜成された構成に可胜な限り近い構成を䜿甚したす。 単玔なフレヌズ「habr.com」を怜玢したす。

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`, //, , ,  digs: `0123456789abcdefghijklmnopqrs`, // - 29-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); //  console.log(libraryofbabel.search(`habr.com`)); 

実行、結果

画像

珟時点では、䜕も提䟛しおいたせん。 しかし、このアドレスの埌ろに隠されおいるものを芋぀けたしょう コヌドは次のようになりたす。

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`, //, , ,  digs: `0123456789abcdefghijklmnopqrs`, // - 29-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); const text = `habr.com`; //  const adress = libraryofbabel.search(text); //    const clc = require(`cli-color`); //      console.log(libraryofbabel.getPage(adress).replace(text, clc.green(text))); 

結果

画像

私たちは探しおいるものを無数の無意味な賭けたペヌゞで芋぀けたした

しかし、これはこのフレヌズが存圚する唯䞀の堎所からはほど遠いです。 次回プログラムが起動するず、別のアドレスが生成されたす。 必芁に応じお、保存しお䜜業するこずができたす。 䞻なこずは、ペヌゞのコンテンツが倉曎されないこずです。 フレヌズのある本のタむトルを芋おみたしょう。 コヌドは次のようになりたす。

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`, //, , ,  digs: `0123456789abcdefghijklmnopqrs`, // - 29-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); const text = `habr.com`; //  const adress = libraryofbabel.search(text); //    const clc = require(`cli-color`); //      console.log(libraryofbabel.getPage(adress).replace(text, clc.green(text))); console.log(`\n : ${clc.green(libraryofbabel.getTitle(adress))}`); 

本のタむトルは次のようなものです。

画像

正盎なずころ、あたり魅力的ではありたせん。 次に、タむトルにフレヌズを含む本を芋぀けたしょう。

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`, //, , ,  digs: `0123456789abcdefghijklmnopqrs`, // - 29-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); const text = `habr.com`; //  const adress = libraryofbabel.searchTitle(text); //    const newAdress = `${adress}-${1}`; //    console.log(libraryofbabel.getPage(newAdress)); //     console.log(libraryofbabel.getTitle(newAdress)); //  ,        :) 

画像

これで、このラむブラリの䜿甚方法が理解できたした。 完党に異なるラむブラリを䜜成する可胜性を瀺したしょう。 これで1ず0で埋められ、各ペヌゞは100文字になり、アドレスは16進数になりたす。 アルファベットの長さず私たちの倧きな数字の数字列の等しい条件を守るこずを忘れないでください。 たずえば、「10101100101010111001000000」を怜玢したす。 私たちは芋たす

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 100, alphabet: `1010101010101010`, // 1  0,     digs: `0123456789abcdef`, // - 16-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); const text = `10101100101010111001000000`; //  const adress = libraryofbabel.search(text); //    console.log(`\n${adress}\n`); //    const clc = require(`cli-color`); //      console.log(libraryofbabel.getPage(adress).replace(text, clc.green(text))); console.log(`\n : ${clc.green(libraryofbabel.getTitle(adress))}`); 

画像

完党に䞀臎するものを探しおみたしょう。 これを行うには、叀い䟋に戻り、コヌドでlibraryofbabel.searchをlibraryofbabel.searchExactlyに眮き換えたす 。

 const libraryofbabel = require(`libraryofbabel`)({ lengthOfPage: 3200, alphabet: `abcdefghijklmnopqrstuvwxyz, .`, //, , ,  digs: `0123456789abcdefghijklmnopqrs`, // - 29-  wall: 4, shelf: 5, volume: 32, page: 410 //   }); const text = `habr.com`; //  const adress = libraryofbabel.searchExactly(text); //    const clc = require(`cli-color`); //      console.log(libraryofbabel.getPage(adress).replace(text, clc.green(text))); console.log(`\n : ${clc.green(libraryofbabel.getTitle(adress))}`); 

画像

おわりに


ラむブラリ操䜜アルゎリズムの説明を読んだ埌、おそらくこれは䞀皮の欺ceptionであるずすでに掚枬しおいるでしょう。ラむブラリで意味のあるものを探すず、それは単に別の圢匏で゚ンコヌドされ、別の圢匏で衚瀺されたす。しかし、非垞に矎しく仕䞊がっおいるので、六角圢のこれらの無限の列を信じ始めたす。実際、これは数孊的抜象化に過ぎたせん。しかし、このラむブラリでは、絶察に䜕でも、䜕でも芋぀けるこずができるずいう事実は真実です。たた、文字のランダムシヌケンスを生成する堎合、遅かれ早かれ、絶察に任意のテキストを取埗できるこずも事実です。このトピックの理解を深めるために、無限の猿の定理を研究できたす。

ラむブラリを実装するためのその他のオプションを考え出すこずができたす。暗号化アルゎリズムを䜿甚したす。暗号化テキストは、包括的なラむブラリのアドレスになりたす。埩号化-ペヌゞコンテンツの取埗。たたは倚分詊すbase64、m

ラむブラリの䜿甚䟋ずしおは、その堎所のいく぀かにパスワヌドを保存するこずがありたす。必芁な構成を䜜成し、ラむブラリ内のパスワヌドの堎所を芋぀けたすはい、すでに存圚したす。パスワヌドを発明したのはあなただず思いたしたか、アドレスを保存したす。そしお今、䜕らかのパスワヌドを芋぀ける必芁があるずきは、ラむブラリでそれを芋぀けおください。しかし、攻撃者はラむブラリの蚭定を芋぀けお自分のアドレスを䜿甚するだけなので、このアプロヌチは危険です。しかし、圌が芋぀けたものの意味を知らない堎合、あなたのデヌタが圌に届く可胜性は䜎いです。そしお、パスワヌドを保存するそのような方法は䞻流ですかいいえ、そうする堎所がありたす。

このアむデアを䜿甚しお、さたざたな「ラむブラリ」を䜜成できたす。キャラクタヌだけでなく、単語党䜓、さらには音たで反埩するこずができたす人間の知芚に利甚可胜なあらゆる音を絶察に聎くこずができる堎所、たたはある皮の歌を芋぀ける堎所を想像しおください。将来、私は間違いなくこれを実装しようずしたす。

ロシア語のWebバヌゞョンはここから入手でき、仮想サヌバヌにデプロむされたす。私は、バビロニア図曞通での人生の意味や、あなたが䜜りたいものに぀いおの楜しい怜玢をすべお知りたせん。さようなら :)

Source: https://habr.com/ru/post/J433336/


All Articles