[{"data":1,"prerenderedAt":1164},["ShallowReactive",2],{"$fOxF3qG8uRirPsh87mAGSHXxkcW7-ZMCN0k4LbwMInjQ":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":94,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":97,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":102,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":447,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":668,"mdc-9mvcvt-key":688,"mdc--ig5mfx-key":719,"mdc-ki4ocr-key":734,"mdc-rlp4vx-key":790,"mdc-a36w06-key":806,"mdc--ts9h32-key":866,"mdc-l0oxzx-key":883,"mdc--1ymxro-key":990,"mdc--b2uzbd-key":1147},{"content":4,"livecodingContent":54,"type":82,"pageMeta":83},[5,9,13,16,20,23,27,31,34,37,41,44,48,51],{"id":6,"value":7,"isTypeH1":8},"1985","Необходимо проверить, являются ли две строки анаграммами друг друга",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4623","Теория: как проверяются анаграммы","anagram-check-theory",{"id":14,"value":15,"isTypeParagraph":8},"10642","Анаграммы — это две строки, которые состоят из одних и тех же значимых символов в одинаковых количествах, но, возможно, в разном порядке.  \nПо условию регистр не важен, а пробелы и знаки препинания не учитываются, поэтому перед сравнением требуется привести строки к единому виду и удалить “неважные” символы.",{"id":17,"value":18,"anchor":19,"isTypeH3":8},"4668","Шаг 1 — нормализация и приведение регистра","normalization-and-case",{"id":21,"value":22,"isTypeParagraph":8},"10643","В Unicode один и тот же “видимый” символ иногда может быть записан разными последовательностями кодовых точек (например, буква с диакритикой может быть “составной” или “комбинированной”).  \nЧтобы сравнение было корректным, полезно приводить строки к одной форме нормализации, например `normalize(\"NFC\")`, чтобы одинаково выглядящие символы имели одинаковое внутреннее представление.\n\nДалее требуется игнорировать регистр:\n- Обычно достаточно `toLowerCase()`, так как цель — сделать единый регистр без зависимости от локали.\n- `toLocaleLowerCase()` меняет регистр с учётом правил конкретной локали, из‑за чего в некоторых языках возможны отличия.",{"id":24,"description":25,"titleAlert":26,"isTypeAlertWarning":8},"779","Если требуется максимально предсказуемое поведение независимо от окружения, обычно выбирается `toLowerCase()`, а не локалезависимые преобразования.\n",null,{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4669","Шаг 2 — удаление пробелов и пунктуации","ignore-spaces-and-punctuation",{"id":32,"value":33,"isTypeParagraph":8},"10644","Самая частая ошибка — удалять только пробелы, забывая про табы, переносы строк, дефисы, запятые и другие символы.  \nПо условию важны только символы (с практической точки зрения удобнее считать важными “буквы и цифры”), поэтому остальные знаки (пробелы, пунктуация) должны игнорироваться.\n\nНадёжный подход для разных алфавитов:\n- Оставлять только буквы и цифры с помощью регулярного выражения с Unicode-свойствами: `/[\\p{L}\\p{N}]/gu`.\n- Флаг `u` обязателен для корректной работы Unicode-режима.\n- Флаг `g` нужен, чтобы извлекались все совпадения.",{"id":35,"description":36,"titleAlert":26,"isTypeAlertInfo":8},"711","Запись `\\p{...}` относится к современным возможностям JavaScript (Unicode property escapes) и работает в актуальных версиях браузеров и Node.js; в устаревших окружениях может потребоваться иной фильтр (например, ограничиться латиницей/кириллицей вручную).",{"id":38,"value":39,"anchor":40,"isTypeH3":8},"4670","Шаг 3 — сравнение: сортировка или частоты","compare-sort-or-count",{"id":42,"value":43,"isTypeParagraph":8},"10645","Есть два стандартных пути:\n\n1) Сортировка:\n- Очистить строки.\n- Преобразовать в массив символов, отсортировать и сравнить результат.\n- Плюс: простота.\n- Минус: сложность `O(n log n)` из-за сортировки.\n\n2) Частоты (часто считается базовым “алгоритмическим” решением):\n- Посчитать, сколько раз встречается каждый символ в первой строке.\n- Для второй строки вычитать эти количества.\n- Если при вычитании получилось отрицательное значение — анаграммы невозможны.\n- После обработки все счётчики должны стать нулевыми.\n- Сложность `O(n)`.\n\nНебольшая схема процесса (универсальная для обоих подходов):\n\n```\nВходные строки\n   │\n   ├─ normalize(\"NFC\")\n   ├─ toLowerCase()\n   ├─ оставить только буквы/цифры (игнорировать пробелы/пунктуацию)\n   │\n   └─ сравнение:\n       ├─ вариант А: сортировка и сравнение строк\n       └─ вариант Б: частоты символов и проверка нуля\n```",{"id":45,"value":46,"anchor":47,"isTypeH2":8},"4624","Таблица: выбор подхода","which-approach-table",{"id":49,"value":50,"isTypeParagraph":8},"10646","| Подход                  | Идея                                  | Время              | Память         | Когда выбирать                          |\n|-------------------------|----------------------------------------|--------------------|----------------|------------------------------------------|\n| Сортировка              | Отсортировать символы и сравнить       | O(n log n)         | O(n)           | Учебные примеры, небольшие строки        |\n| Частоты (Map)           | Сравнить количества каждого символа    | O(n)               | O(k)           | Длинные строки, важна эффективность      |\n| Частоты + ранний выход  | Вычитать и завершать при ошибке        | O(n) (в среднем)   | O(k)           | Частые “не анаграмма”, нужна скорость    |\n\nПримечания:\n- `n` — длина строки после очистки.\n- `k` — число различных символов после очистки.",{"id":52,"value":53,"isTypeParagraph":8},"10647","Кратко: для проверки анаграмм необходимо очистить строки (нормализация Unicode, приведение к нижнему регистру, игнорирование пробелов и пунктуации), после чего сравнить либо отсортированные наборы символов, либо (предпочтительнее) частоты символов через `Map`, что даёт линейную сложность по длине очищенной строки.",{"id":55,"functionTestData":56,"functionName":78,"functionTemplateCode":79,"solution":80,"description":81},"426",[57,61,66,70,74],[58,8],[59,60],"finder","Friend",[62,65],[63,64],"hello","bye",false,[67,8],[68,69],"Апельсин","спаниель",[71,8],[72,73],"Метро","Термо",[75,65],[76,77],"переводчик","калькулятор","isAnagram","function isAnagram(str, str2) {\n    // ваш код здесь\n}","**Вариант 1** — сортировка (простой и наглядный)\n\n```\nfunction sanitizeForAnagram(input) {\n  return (input ?? \"\")\n    .normalize(\"NFC\")\n    .toLowerCase()\n    .match(/[\\p{L}\\p{N}]/gu)?.join(\"\") ?? \"\";\n}\n\nfunction isAnagram(str, str2) {\n  const a = sanitizeForAnagram(str);\n  const b = sanitizeForAnagram(str2);\n\n  if (a.length !== b.length) return false;\n\n  const sortedA = [...a].sort().join(\"\");\n  const sortedB = [...b].sort().join(\"\");\n\n  return sortedA === sortedB;\n}\n```\n\nКогда подходит:\n- Когда требуется максимально понятное решение для обучения.\n- Когда строки относительно короткие.\n\nОграничения:\n- Сортировка даёт сложность порядка `O(n log n)` по длине очищенной строки.\n\n**Вариант 2** — частотная таблица (быстрее на больших строках)\n\n```\nfunction sanitizeChars(input) {\n  return (input ?? \"\")\n    .normalize(\"NFC\")\n    .toLowerCase()\n    .match(/[\\p{L}\\p{N}]/gu) ?? [];\n}\n\nfunction isAnagram(str, str2) {\n  const aChars = sanitizeChars(str);\n  const bChars = sanitizeChars(str2);\n\n  if (aChars.length !== bChars.length) return false;\n\n  const counts = new Map();\n\n  for (const ch of aChars) {\n    counts.set(ch, (counts.get(ch) ?? 0) + 1);\n  }\n\n  for (const ch of bChars) {\n    const next = (counts.get(ch) ?? 0) - 1;\n    if (next \u003C 0) return false;\n    if (next === 0) counts.delete(ch);\n    else counts.set(ch, next);\n  }\n\n  return counts.size === 0;\n}\n```\n\nКогда подходит:\n- Когда строки могут быть длинными.\n- Когда важна эффективность: подсчёт даёт сложность порядка `O(n)`.\n\n**Вариант 3** — частоты + ранний выход и минимизация памяти\n\nИдея: считать частоты для первой строки и “вычитать” по мере чтения второй, завершаясь сразу при невозможности анаграммы.\n\n```\nfunction* relevantChars(input) {\n  const s = (input ?? \"\").normalize(\"NFC\").toLowerCase();\n  const m = s.match(/[\\p{L}\\p{N}]/gu);\n  if (!m) return;\n  for (const ch of m) yield ch;\n}\n\nfunction isAnagram(str, str2) {\n  const counts = new Map();\n  let len1 = 0;\n  let len2 = 0;\n\n  for (const ch of relevantChars(str)) {\n    len1++;\n    counts.set(ch, (counts.get(ch) ?? 0) + 1);\n  }\n\n  for (const ch of relevantChars(str2)) {\n    len2++;\n    const next = (counts.get(ch) ?? 0) - 1;\n    if (next \u003C 0) return false;\n    if (next === 0) counts.delete(ch);\n    else counts.set(ch, next);\n  }\n\n  if (len1 !== len2) return false;\n  return counts.size === 0;\n}\n```\n\nПлюсы:\n- Быстро выявляет “точно не анаграмма” при несовпадении символов.\n- В памяти хранится только таблица частот.\n\nЕсли после очистки обе строки оказываются пустыми (например, `\"!!!\"` и `\"   \"`), результат будет `true`, потому что набор “значимых” символов совпадает (оба пустые).","Анаграмма — это литературный приём, при котором буквы или звуки определённого слова (или словосочетания) переставляются, в результате чего получается другое слово или словосочетание. Такой метод ещё называют «перебуква».\n\nНапишите функцию, проверяющую, являются ли две переданные в функцию строки анаграммами друг друга (регистр букв не имеет значения). Важны только символы, пробелы или знаки препинания не учитываются:\n\n```\nfunction isAnagram (str, str2) {\n    // ...\n}\n\nisAnagram('finder', 'Friend'); // true\nisAnagram('hello', 'bye'); // false\n```","livecoding",{"title":84,"description":85,"ogTitle":7,"ogDescription":86,"ogImageUrl":87,"canonical":26,"ogLocale":88,"ogSiteName":89,"ogImageType":90,"ogImageWidth":91,"ogImageHeight":92,"ogType":93,"ogUrl":26},"Проверить, являются ли две строки анаграммами друг друга","isAnagram('finder', 'Friend'); // true\nisAnagram('hello', 'bye'); // false","isAnagram('finder', 'Friend'); // true isAnagram('hello', 'bye'); // false","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":95,"siteUrl":96},"GOOD WEB JOB!","https://goodwebjob.ru",[98],{"label":99,"slug":100,"to":101},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":103,"navigationSublist":111},[104,107],{"path":101,"isActive":65,"name":105,"icon":106,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":108,"isActive":8,"name":109,"icon":110,"isNavbarMobileDisabled":65},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[112,121,148,160,166,306,330,339,345,408,429,435],{"title":113,"list":114,"isOpened":65},"Bash",[115,118],{"name":116,"path":117,"isActive":65},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":119,"path":120,"isActive":65},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":122,"list":123,"isOpened":65},"CSS",[124,127,130,133,136,139,142,145],{"name":125,"path":126,"isActive":65},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":128,"path":129,"isActive":65},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":131,"path":132,"isActive":65},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":134,"path":135,"isActive":65},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":137,"path":138,"isActive":65},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":140,"path":141,"isActive":65},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":143,"path":144,"isActive":65},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":146,"path":147,"isActive":65},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":149,"list":150,"isOpened":65},"Git",[151,154,157],{"name":152,"path":153,"isActive":65},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":155,"path":156,"isActive":65},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":158,"path":159,"isActive":65},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":161,"list":162,"isOpened":65},"HTML",[163],{"name":164,"path":165,"isActive":65},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":167,"list":168,"isOpened":65},"JavaScript",[169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,285,288,291,294,297,300,303],{"name":170,"path":171,"isActive":65},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":173,"path":174,"isActive":65},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":176,"path":177,"isActive":65},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":179,"path":180,"isActive":65},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":182,"path":183,"isActive":65},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":185,"path":186,"isActive":65},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":188,"path":189,"isActive":65},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":191,"path":192,"isActive":65},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":194,"path":195,"isActive":65},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":197,"path":198,"isActive":65},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":200,"path":201,"isActive":65},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":203,"path":204,"isActive":65},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":206,"path":207,"isActive":65},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":209,"path":210,"isActive":65},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":212,"path":213,"isActive":65},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":215,"path":216,"isActive":65},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":218,"path":219,"isActive":65},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":221,"path":222,"isActive":65},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":224,"path":225,"isActive":65},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":227,"path":228,"isActive":65},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":230,"path":231,"isActive":65},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":233,"path":234,"isActive":65},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":236,"path":237,"isActive":65},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":239,"path":240,"isActive":65},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":242,"path":243,"isActive":65},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":245,"path":246,"isActive":65},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":248,"path":249,"isActive":65},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":251,"path":252,"isActive":65},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":254,"path":255,"isActive":65},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":257,"path":258,"isActive":65},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":260,"path":261,"isActive":65},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":263,"path":264,"isActive":65},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":266,"path":267,"isActive":65},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":269,"path":270,"isActive":65},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":272,"path":273,"isActive":65},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":275,"path":276,"isActive":65},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":278,"path":279,"isActive":65}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":281,"path":282,"isActive":65},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":7,"path":284,"isActive":65},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":286,"path":287,"isActive":65},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":289,"path":290,"isActive":65},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":292,"path":293,"isActive":65},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":295,"path":296,"isActive":65},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":298,"path":299,"isActive":65},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":301,"path":302,"isActive":65},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":304,"path":305,"isActive":65},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":307,"list":308,"isOpened":65},"React",[309,312,315,318,321,324,327],{"name":310,"path":311,"isActive":65},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":313,"path":314,"isActive":65},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":316,"path":317,"isActive":65},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":319,"path":320,"isActive":65},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":322,"path":323,"isActive":65},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":325,"path":326,"isActive":65},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":328,"path":329,"isActive":65},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":331,"list":332,"isOpened":65},"Алгоритмы",[333,336],{"name":334,"path":335,"isActive":65},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":337,"path":338,"isActive":65},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":340,"list":341,"isOpened":65},"Дебаггинг",[342],{"name":343,"path":344,"isActive":65},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":346,"list":347,"isOpened":65},"Компьютерные сети",[348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405],{"name":349,"path":350,"isActive":65},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":352,"path":353,"isActive":65},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":355,"path":356,"isActive":65},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":358,"path":359,"isActive":65},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":361,"path":362,"isActive":65},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":364,"path":365,"isActive":65},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":367,"path":368,"isActive":65},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":370,"path":371,"isActive":65},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":373,"path":374,"isActive":65},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":376,"path":377,"isActive":65},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":379,"path":380,"isActive":65},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":382,"path":383,"isActive":65},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":385,"path":386,"isActive":65},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":388,"path":389,"isActive":65},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":391,"path":392,"isActive":65},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":394,"path":395,"isActive":65},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":397,"path":398,"isActive":65},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":400,"path":401,"isActive":65},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":403,"path":404,"isActive":65},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":406,"path":407,"isActive":65},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":409,"list":410,"isOpened":65},"Отрисовка в браузере",[411,414,417,420,423,426],{"name":412,"path":413,"isActive":65},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":415,"path":416,"isActive":65},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":418,"path":419,"isActive":65},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":421,"path":422,"isActive":65},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":424,"path":425,"isActive":65},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":427,"path":428,"isActive":65},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":430,"list":431,"isOpened":65},"Ревью кода",[432],{"name":433,"path":434,"isActive":65},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":436,"list":437,"isOpened":65},"Теория вероятности",[438,441,444],{"name":439,"path":440,"isActive":65},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":442,"path":443,"isActive":65},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":445,"path":446,"isActive":65},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":448},[449,452,454,456,458,461,464,466,468,470,472,474,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655,657,658,660,662,664,666],{"name":450,"value":451},"Теоретические задания","theoretical-tasks",{"name":206,"value":453},"what-this-code-will-return-typeof-function",{"name":105,"value":455},"where-to-begin",{"name":173,"value":457},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":459,"value":460},"Backend","backend",{"name":462,"value":463},"Frontend","frontend",{"name":170,"value":465},"prototype-what-logical-values-will-be-received-in-console-log",{"name":286,"value":467},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":278,"value":469},"find-non-repeating-numbers-in-an-array",{"name":251,"value":471},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":257,"value":473},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":475,"value":476},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":263,"value":478},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":179,"value":480},"what-value-will-the-console-output-with-object-property",{"name":182,"value":482},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":254,"value":484},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":7,"value":486},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":289,"value":488},"determines-whether-a-word-is-a-palindrome",{"name":269,"value":490},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":295,"value":492},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":260,"value":494},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":266,"value":496},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":272,"value":498},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":304,"value":500},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":275,"value":502},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":281,"value":504},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":185,"value":506},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":188,"value":508},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":200,"value":510},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":203,"value":512},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":301,"value":514},"unifying-values-in-an-array",{"name":292,"value":516},"flattening-the-array",{"name":191,"value":518},"what-will-the-book-get-upper-name-method-return",{"name":298,"value":520},"string-compression",{"name":197,"value":522},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":209,"value":524},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":349,"value":526},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":355,"value":528},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":358,"value":530},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":361,"value":532},"key-differences-between-tcp-and-udp",{"name":364,"value":534},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":367,"value":536},"what-is-http-and-what-does-it-consist-of",{"name":370,"value":538},"what-are-http-headers-and-why-do-we-need-them",{"name":373,"value":540},"what-are-http-parameters",{"name":376,"value":542},"where-is-the-html-code-located-in-the-http-response-structure",{"name":164,"value":544},"what-is-html",{"name":379,"value":546},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":382,"value":548},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":385,"value":550},"what-is-a-cookie",{"name":388,"value":552},"who-initiates-the-cookie-recording-in-the-browser",{"name":391,"value":554},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":556,"value":82},"Лайвкодинг",{"name":176,"value":558},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":397,"value":560},"is-everything-that-goes-through-https-secure",{"name":400,"value":562},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":403,"value":564},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":415,"value":566},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":412,"value":568},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":418,"value":570},"what-is-blocking-the-page-rendering-in-the-browser",{"name":421,"value":572},"what-is-dom-in-a-browser-what-is-cssom",{"name":424,"value":574},"what-are-nodes-in-the-dom",{"name":427,"value":576},"what-does-cssom-consist-of",{"name":125,"value":578},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":128,"value":580},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":131,"value":582},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":134,"value":584},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":137,"value":586},"there-is-an-html-code-will-font-weight-affect-span",{"name":140,"value":588},"what-are-the-differences-between-flexbox-and-grid",{"name":143,"value":590},"do-flexbox-and-grid-replace-each-other",{"name":146,"value":592},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":109,"value":594},"tasks",{"name":212,"value":596},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":215,"value":598},"what-is-this-in-javascript",{"name":218,"value":600},"what-is-an-event-loop-and-how-does-it-work",{"name":221,"value":602},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":224,"value":604},"what-does-the-typeof-operator-show-in-javascript",{"name":227,"value":606},"what-types-of-data-exist-in-javascript",{"name":230,"value":608},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":233,"value":610},"what-will-typeof-return-for-an-array",{"name":236,"value":612},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":239,"value":614},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":242,"value":616},"what-does-typeof-return-for-new-set-in-javascript",{"name":310,"value":618},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":316,"value":620},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":319,"value":622},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":322,"value":624},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":325,"value":626},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":343,"value":628},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":152,"value":630},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":155,"value":632},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":158,"value":634},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":433,"value":636},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":116,"value":638},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":119,"value":640},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":334,"value":642},"what-is-algorithmic-complexity",{"name":337,"value":644},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":245,"value":646},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":406,"value":648},"how-can-a-user-be-authorized-on-a-website",{"name":248,"value":650},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":439,"value":652},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":442,"value":654},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":445,"value":656},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":99,"value":100},{"name":394,"value":659},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":352,"value":661},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":194,"value":663},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":313,"value":665},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":328,"value":667},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":669,"copyright":672,"reportError":673,"socialNetwork":675},{"link":670,"title":671},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":674,"link":670},"Сообщить об ошибке",{"label":676,"socialNetworkList":677},"Мы в соцсетях:",[678,681,684],{"icon":26,"link":679,"title":680},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":682,"link":670,"title":683},"ic:baseline-telegram","Telegram",{"icon":685,"link":686,"title":687},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":689,"body":690},{},{"type":691,"children":692},"root",[693,701,706],{"type":694,"tag":695,"props":696,"children":697},"element","p",{},[698],{"type":699,"value":700},"text","Анаграмма — это литературный приём, при котором буквы или звуки определённого слова (или словосочетания) переставляются, в результате чего получается другое слово или словосочетание. Такой метод ещё называют «перебуква».",{"type":694,"tag":695,"props":702,"children":703},{},[704],{"type":699,"value":705},"Напишите функцию, проверяющую, являются ли две переданные в функцию строки анаграммами друг друга (регистр букв не имеет значения). Важны только символы, пробелы или знаки препинания не учитываются:",{"type":694,"tag":707,"props":708,"children":712},"pre",{"className":709,"code":711,"language":699},[710],"language-text","function isAnagram (str, str2) {\n    // ...\n}\n\nisAnagram('finder', 'Friend'); // true\nisAnagram('hello', 'bye'); // false\n",[713],{"type":694,"tag":714,"props":715,"children":717},"code",{"__ignoreMap":716},"",[718],{"type":699,"value":711},{"data":720,"body":721},{},{"type":691,"children":722},[723],{"type":694,"tag":695,"props":724,"children":725},{},[726,728,732],{"type":699,"value":727},"Анаграммы — это две строки, которые состоят из одних и тех же значимых символов в одинаковых количествах, но, возможно, в разном порядке.",{"type":694,"tag":729,"props":730,"children":731},"br",{},[],{"type":699,"value":733},"\nПо условию регистр не важен, а пробелы и знаки препинания не учитываются, поэтому перед сравнением требуется привести строки к единому виду и удалить “неважные” символы.",{"data":735,"body":736},{},{"type":691,"children":737},[738,756,761],{"type":694,"tag":695,"props":739,"children":740},{},[741,743,746,748,754],{"type":699,"value":742},"В Unicode один и тот же “видимый” символ иногда может быть записан разными последовательностями кодовых точек (например, буква с диакритикой может быть “составной” или “комбинированной”).",{"type":694,"tag":729,"props":744,"children":745},{},[],{"type":699,"value":747},"\nЧтобы сравнение было корректным, полезно приводить строки к одной форме нормализации, например ",{"type":694,"tag":714,"props":749,"children":751},{"className":750},[],[752],{"type":699,"value":753},"normalize(\"NFC\")",{"type":699,"value":755},", чтобы одинаково выглядящие символы имели одинаковое внутреннее представление.",{"type":694,"tag":695,"props":757,"children":758},{},[759],{"type":699,"value":760},"Далее требуется игнорировать регистр:",{"type":694,"tag":762,"props":763,"children":764},"ul",{},[765,779],{"type":694,"tag":766,"props":767,"children":768},"li",{},[769,771,777],{"type":699,"value":770},"Обычно достаточно ",{"type":694,"tag":714,"props":772,"children":774},{"className":773},[],[775],{"type":699,"value":776},"toLowerCase()",{"type":699,"value":778},", так как цель — сделать единый регистр без зависимости от локали.",{"type":694,"tag":766,"props":780,"children":781},{},[782,788],{"type":694,"tag":714,"props":783,"children":785},{"className":784},[],[786],{"type":699,"value":787},"toLocaleLowerCase()",{"type":699,"value":789}," меняет регистр с учётом правил конкретной локали, из‑за чего в некоторых языках возможны отличия.",{"data":791,"body":792},{},{"type":691,"children":793},[794],{"type":694,"tag":695,"props":795,"children":796},{},[797,799,804],{"type":699,"value":798},"Если требуется максимально предсказуемое поведение независимо от окружения, обычно выбирается ",{"type":694,"tag":714,"props":800,"children":802},{"className":801},[],[803],{"type":699,"value":776},{"type":699,"value":805},", а не локалезависимые преобразования.",{"data":807,"body":808},{},{"type":691,"children":809},[810,820,825],{"type":694,"tag":695,"props":811,"children":812},{},[813,815,818],{"type":699,"value":814},"Самая частая ошибка — удалять только пробелы, забывая про табы, переносы строк, дефисы, запятые и другие символы.",{"type":694,"tag":729,"props":816,"children":817},{},[],{"type":699,"value":819},"\nПо условию важны только символы (с практической точки зрения удобнее считать важными “буквы и цифры”), поэтому остальные знаки (пробелы, пунктуация) должны игнорироваться.",{"type":694,"tag":695,"props":821,"children":822},{},[823],{"type":699,"value":824},"Надёжный подход для разных алфавитов:",{"type":694,"tag":762,"props":826,"children":827},{},[828,841,854],{"type":694,"tag":766,"props":829,"children":830},{},[831,833,839],{"type":699,"value":832},"Оставлять только буквы и цифры с помощью регулярного выражения с Unicode-свойствами: ",{"type":694,"tag":714,"props":834,"children":836},{"className":835},[],[837],{"type":699,"value":838},"/[\\p{L}\\p{N}]/gu",{"type":699,"value":840},".",{"type":694,"tag":766,"props":842,"children":843},{},[844,846,852],{"type":699,"value":845},"Флаг ",{"type":694,"tag":714,"props":847,"children":849},{"className":848},[],[850],{"type":699,"value":851},"u",{"type":699,"value":853}," обязателен для корректной работы Unicode-режима.",{"type":694,"tag":766,"props":855,"children":856},{},[857,858,864],{"type":699,"value":845},{"type":694,"tag":714,"props":859,"children":861},{"className":860},[],[862],{"type":699,"value":863},"g",{"type":699,"value":865}," нужен, чтобы извлекались все совпадения.",{"data":867,"body":868},{},{"type":691,"children":869},[870],{"type":694,"tag":695,"props":871,"children":872},{},[873,875,881],{"type":699,"value":874},"Запись ",{"type":694,"tag":714,"props":876,"children":878},{"className":877},[],[879],{"type":699,"value":880},"\\p{...}",{"type":699,"value":882}," относится к современным возможностям JavaScript (Unicode property escapes) и работает в актуальных версиях браузеров и Node.js; в устаревших окружениях может потребоваться иной фильтр (например, ограничиться латиницей/кириллицей вручную).",{"data":884,"body":885},{},{"type":691,"children":886},[887,892,901,932,941,976,981],{"type":694,"tag":695,"props":888,"children":889},{},[890],{"type":699,"value":891},"Есть два стандартных пути:",{"type":694,"tag":893,"props":894,"children":895},"ol",{},[896],{"type":694,"tag":766,"props":897,"children":898},{},[899],{"type":699,"value":900},"Сортировка:",{"type":694,"tag":762,"props":902,"children":903},{},[904,909,914,919],{"type":694,"tag":766,"props":905,"children":906},{},[907],{"type":699,"value":908},"Очистить строки.",{"type":694,"tag":766,"props":910,"children":911},{},[912],{"type":699,"value":913},"Преобразовать в массив символов, отсортировать и сравнить результат.",{"type":694,"tag":766,"props":915,"children":916},{},[917],{"type":699,"value":918},"Плюс: простота.",{"type":694,"tag":766,"props":920,"children":921},{},[922,924,930],{"type":699,"value":923},"Минус: сложность ",{"type":694,"tag":714,"props":925,"children":927},{"className":926},[],[928],{"type":699,"value":929},"O(n log n)",{"type":699,"value":931}," из-за сортировки.",{"type":694,"tag":893,"props":933,"children":935},{"start":934},2,[936],{"type":694,"tag":766,"props":937,"children":938},{},[939],{"type":699,"value":940},"Частоты (часто считается базовым “алгоритмическим” решением):",{"type":694,"tag":762,"props":942,"children":943},{},[944,949,954,959,964],{"type":694,"tag":766,"props":945,"children":946},{},[947],{"type":699,"value":948},"Посчитать, сколько раз встречается каждый символ в первой строке.",{"type":694,"tag":766,"props":950,"children":951},{},[952],{"type":699,"value":953},"Для второй строки вычитать эти количества.",{"type":694,"tag":766,"props":955,"children":956},{},[957],{"type":699,"value":958},"Если при вычитании получилось отрицательное значение — анаграммы невозможны.",{"type":694,"tag":766,"props":960,"children":961},{},[962],{"type":699,"value":963},"После обработки все счётчики должны стать нулевыми.",{"type":694,"tag":766,"props":965,"children":966},{},[967,969,975],{"type":699,"value":968},"Сложность ",{"type":694,"tag":714,"props":970,"children":972},{"className":971},[],[973],{"type":699,"value":974},"O(n)",{"type":699,"value":840},{"type":694,"tag":695,"props":977,"children":978},{},[979],{"type":699,"value":980},"Небольшая схема процесса (универсальная для обоих подходов):",{"type":694,"tag":707,"props":982,"children":985},{"className":983,"code":984,"language":699},[710],"Входные строки\n   │\n   ├─ normalize(\"NFC\")\n   ├─ toLowerCase()\n   ├─ оставить только буквы/цифры (игнорировать пробелы/пунктуацию)\n   │\n   └─ сравнение:\n       ├─ вариант А: сортировка и сравнение строк\n       └─ вариант Б: частоты символов и проверка нуля\n",[986],{"type":694,"tag":714,"props":987,"children":988},{"__ignoreMap":716},[989],{"type":699,"value":984},{"data":991,"body":992},{},{"type":691,"children":993},[994,1117,1122],{"type":694,"tag":995,"props":996,"children":997},"table",{},[998,1032],{"type":694,"tag":999,"props":1000,"children":1001},"thead",{},[1002],{"type":694,"tag":1003,"props":1004,"children":1005},"tr",{},[1006,1012,1017,1022,1027],{"type":694,"tag":1007,"props":1008,"children":1009},"th",{},[1010],{"type":699,"value":1011},"Подход",{"type":694,"tag":1007,"props":1013,"children":1014},{},[1015],{"type":699,"value":1016},"Идея",{"type":694,"tag":1007,"props":1018,"children":1019},{},[1020],{"type":699,"value":1021},"Время",{"type":694,"tag":1007,"props":1023,"children":1024},{},[1025],{"type":699,"value":1026},"Память",{"type":694,"tag":1007,"props":1028,"children":1029},{},[1030],{"type":699,"value":1031},"Когда выбирать",{"type":694,"tag":1033,"props":1034,"children":1035},"tbody",{},[1036,1063,1090],{"type":694,"tag":1003,"props":1037,"children":1038},{},[1039,1045,1050,1054,1058],{"type":694,"tag":1040,"props":1041,"children":1042},"td",{},[1043],{"type":699,"value":1044},"Сортировка",{"type":694,"tag":1040,"props":1046,"children":1047},{},[1048],{"type":699,"value":1049},"Отсортировать символы и сравнить",{"type":694,"tag":1040,"props":1051,"children":1052},{},[1053],{"type":699,"value":929},{"type":694,"tag":1040,"props":1055,"children":1056},{},[1057],{"type":699,"value":974},{"type":694,"tag":1040,"props":1059,"children":1060},{},[1061],{"type":699,"value":1062},"Учебные примеры, небольшие строки",{"type":694,"tag":1003,"props":1064,"children":1065},{},[1066,1071,1076,1080,1085],{"type":694,"tag":1040,"props":1067,"children":1068},{},[1069],{"type":699,"value":1070},"Частоты (Map)",{"type":694,"tag":1040,"props":1072,"children":1073},{},[1074],{"type":699,"value":1075},"Сравнить количества каждого символа",{"type":694,"tag":1040,"props":1077,"children":1078},{},[1079],{"type":699,"value":974},{"type":694,"tag":1040,"props":1081,"children":1082},{},[1083],{"type":699,"value":1084},"O(k)",{"type":694,"tag":1040,"props":1086,"children":1087},{},[1088],{"type":699,"value":1089},"Длинные строки, важна эффективность",{"type":694,"tag":1003,"props":1091,"children":1092},{},[1093,1098,1103,1108,1112],{"type":694,"tag":1040,"props":1094,"children":1095},{},[1096],{"type":699,"value":1097},"Частоты + ранний выход",{"type":694,"tag":1040,"props":1099,"children":1100},{},[1101],{"type":699,"value":1102},"Вычитать и завершать при ошибке",{"type":694,"tag":1040,"props":1104,"children":1105},{},[1106],{"type":699,"value":1107},"O(n) (в среднем)",{"type":694,"tag":1040,"props":1109,"children":1110},{},[1111],{"type":699,"value":1084},{"type":694,"tag":1040,"props":1113,"children":1114},{},[1115],{"type":699,"value":1116},"Частые “не анаграмма”, нужна скорость",{"type":694,"tag":695,"props":1118,"children":1119},{},[1120],{"type":699,"value":1121},"Примечания:",{"type":694,"tag":762,"props":1123,"children":1124},{},[1125,1136],{"type":694,"tag":766,"props":1126,"children":1127},{},[1128,1134],{"type":694,"tag":714,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":699,"value":1133},"n",{"type":699,"value":1135}," — длина строки после очистки.",{"type":694,"tag":766,"props":1137,"children":1138},{},[1139,1145],{"type":694,"tag":714,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":699,"value":1144},"k",{"type":699,"value":1146}," — число различных символов после очистки.",{"data":1148,"body":1149},{},{"type":691,"children":1150},[1151],{"type":694,"tag":695,"props":1152,"children":1153},{},[1154,1156,1162],{"type":699,"value":1155},"Кратко: для проверки анаграмм необходимо очистить строки (нормализация Unicode, приведение к нижнему регистру, игнорирование пробелов и пунктуации), после чего сравнить либо отсортированные наборы символов, либо (предпочтительнее) частоты символов через ",{"type":694,"tag":714,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":699,"value":1161},"Map",{"type":699,"value":1163},", что даёт линейную сложность по длине очищенной строки.",1775575822661]