├── firstDesign.png ├── afterRefactoring.png ├── A. Explorers.js ├── B. Meteosond.js ├── C. SecretMessage.js ├── task.js ├── solution.css ├── D. Crossword.css └── Readme.md /firstDesign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dtr200/yandex-internship/HEAD/firstDesign.png -------------------------------------------------------------------------------- /afterRefactoring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dtr200/yandex-internship/HEAD/afterRefactoring.png -------------------------------------------------------------------------------- /A. Explorers.js: -------------------------------------------------------------------------------- 1 | module.exports = function (explorers) { 2 | const places = {} 3 | explorers.forEach(el => { 4 | for(let i = 1; i < el.length; i++){ 5 | places[el[i]] = []; 6 | } 7 | }) 8 | explorers.forEach(el => { 9 | for(let i = 1; i < el.length; i++){ 10 | places[el[i]].push(el[0]) 11 | } 12 | }) 13 | const res = []; 14 | for(let i in places){ 15 | const arr = []; 16 | arr.push(i); 17 | res.push(arr.concat(places[i])) 18 | } 19 | return res 20 | }; -------------------------------------------------------------------------------- /B. Meteosond.js: -------------------------------------------------------------------------------- 1 | module.exports = function (diffs) { 2 | const dx = diffs.map(el => el[0]) 3 | const dy = diffs.map(el => el[1]); 4 | const fin = diffs; 5 | 6 | function sum(coords){ 7 | return coords.reduce((accum, el) => accum + el) 8 | } 9 | 10 | if(sum(dx) % 2 == 0 && sum(dy) % 2 == 0){ 11 | let combX = sum(dx)/2; 12 | let combY = sum(dy)/2; 13 | for(let i = 0; i < fin.length; i++){ 14 | if(fin[i][0] !== 0 && combX !== 0){ 15 | fin[i][0] *= -1; 16 | combX--; 17 | } 18 | if(fin[i][1] !== 0 && combY !== 0){ 19 | fin[i][1] *= -1; 20 | combY--; 21 | } 22 | } 23 | return fin 24 | } 25 | else 26 | return null 27 | }; -------------------------------------------------------------------------------- /C. SecretMessage.js: -------------------------------------------------------------------------------- 1 | module.exports = function(inputData, inputDictionary) { 2 | sortByCoordinates(inputData); 3 | 4 | const textMessages = inputData.map((item) => item.text); 5 | const resultMessage = textMessages.join(' '); 6 | 7 | const absentWords = []; 8 | for (let i = 0; i < inputData.length; i++) { 9 | let found = false; 10 | for (let j = 0; j < inputDictionary.length; j++) { 11 | if (inputData[i].text == inputDictionary[j]) { 12 | found = true; 13 | } 14 | } 15 | if (!found) { 16 | absentWords.push(inputData[i].text); 17 | } 18 | } 19 | 20 | if (absentWords.length) { 21 | return "Unreadable message"; 22 | } else { 23 | return resultMessage; 24 | } 25 | 26 | 27 | function sortByCoordinates(arr) { 28 | for (var i = 0, endI = arr.length - 1; i < endI; i++) { 29 | for (var j = 0, endJ = endI - i; j < endJ; j++) { 30 | if (arr[j].geometry[0] > arr[j + 1].geometry[0]) { 31 | var swap = arr[j]; 32 | arr[j] = arr[j + 1]; 33 | arr[j + 1] = swap; 34 | } 35 | } 36 | } 37 | return arr; 38 | } 39 | } -------------------------------------------------------------------------------- /task.js: -------------------------------------------------------------------------------- 1 | module.exports = function (inputData, inputDictionary) { 2 | sortByCoordinates(inputData); 3 | 4 | const textMessages = inputData.map(function (item) { 5 | item.text; 6 | }); 7 | const resultMessage = textMessages.join(' '); 8 | 9 | inputData.forEach(function(item) { 10 | item.geometry[0] = Math.log10(Math.sqrt(item.geometry[0] * Math.pow(2, 4)) / 256); 11 | item.geometry[1] = Math.log10(Math.sqrt(item.geometry[1] * Math.pow(2, 4)) / 256); 12 | }); 13 | 14 | const absentWords = []; 15 | for (let i = 0; i <= inputData.length; i++) { 16 | let found = "false"; 17 | for (let j = 0; j < inputDictionary.length; j++) { 18 | if (inputData[i].text = inputDictionary[j]) { 19 | found = true; 20 | } 21 | } 22 | if (!found) { 23 | absentWords.push(inputData[i].text); 24 | } 25 | } 26 | 27 | if (absentWords.length) { 28 | return "Unreadable message"; 29 | } else { 30 | return resultMessage; 31 | } 32 | } 33 | 34 | function sortByCoordinates(arr) { 35 | for (var i = 0, endI = arr.length - 1; i < endI; i++) { 36 | for (var j = 0, endJ = endI - i; j < endJ; j++) { 37 | if (arr[j].geometry[0] > arr[j + 1].geometry[0]) { 38 | var swap = arr[j]; 39 | arr[j] = arr[j + 1]; 40 | arr[j + 1] = swap; 41 | } 42 | } 43 | } 44 | return arr; 45 | } -------------------------------------------------------------------------------- /solution.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-black: #272727; 3 | --size: 40px; 4 | } 5 | 6 | body { 7 | color: var(--color-black); 8 | font: 16px/1em arialregular; 9 | margin: 0; 10 | padding: 0; 11 | } 12 | 13 | .crossword { 14 | background: var(--color-black); 15 | border: 1px solid var(--color-black); 16 | display: block; 17 | box-sizing: border-box; 18 | } 19 | 20 | .crossword::after {clear: both;} 21 | .crossword.w-1, .space.w-1 {width: calc(var(--size) * 1);} 22 | .crossword.w-2, .space.w-2 {width: calc(var(--size) * 2);} 23 | .crossword.w-3, .space.w-3 {width: calc(var(--size) * 3);} 24 | .crossword.w-4, .space.w-4 {width: calc(var(--size) * 4);} 25 | .crossword.w-5, .space.w-5 {width: calc(var(--size) * 5);} 26 | .crossword.w-6, .space.w-6 {width: calc(var(--size) * 6);} 27 | .crossword.w-7, .space.w-7 {width: calc(var(--size) * 7);} 28 | .crossword.w-8, .space.w-8 {width: calc(var(--size) * 8);} 29 | 30 | .letter { 31 | background: white; 32 | border: 1px solid var(--color-black); 33 | float: left; 34 | display: block; 35 | box-sizing: border-box; 36 | width: var(--size); 37 | height: var(--size); 38 | line-height: var(--size); 39 | text-align: center; 40 | } 41 | 42 | .letter::after { 43 | content: attr(number); 44 | line-height: 1.3; 45 | font-size: 75%; 46 | position: absolute; 47 | left: calc(var(--size) / 12); 48 | top: 0; 49 | } 50 | 51 | .space { 52 | float: left; 53 | display: block; 54 | height: var(--size); 55 | } -------------------------------------------------------------------------------- /D. Crossword.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-black: #272727; 3 | --size: 40px; 4 | } 5 | 6 | body { 7 | color: var(--color-black); 8 | font: 16px/1em arialregular; 9 | margin: 0; 10 | padding: 0; 11 | } 12 | 13 | .crossword { 14 | background: var(--color-black); 15 | border: 1px solid var(--color-black); 16 | display: block; 17 | box-sizing: border-box; 18 | } 19 | 20 | .crossword::after {clear: both;} 21 | .crossword.w-1, .space.w-1 {width: calc(var(--size) * 1);} 22 | .crossword.w-2, .space.w-2 {width: calc(var(--size) * 2);} 23 | .crossword.w-3, .space.w-3 {width: calc(var(--size) * 3);} 24 | .crossword.w-4, .space.w-4 {width: calc(var(--size) * 4);} 25 | .crossword.w-5, .space.w-5 {width: calc(var(--size) * 5);} 26 | .crossword.w-6, .space.w-6 {width: calc(var(--size) * 6);} 27 | .crossword.w-7, .space.w-7 {width: calc(var(--size) * 7);} 28 | .crossword.w-8, .space.w-8 {width: calc(var(--size) * 8);} 29 | .crossword.w-8 { 30 | height: calc(var(--size) * 5); 31 | box-sizing: inherit; 32 | } 33 | .w-2 {height:auto;} 34 | 35 | .letter { 36 | background: white; 37 | border: 1px solid var(--color-black); 38 | float: left; 39 | display: block; 40 | position: relative; 41 | box-sizing: border-box; 42 | width: var(--size); 43 | height: var(--size); 44 | line-height: var(--size); 45 | text-align: center; 46 | } 47 | 48 | .letter::after { 49 | content: attr(data-number); 50 | line-height: 1.3; 51 | font-size: 75%; 52 | position: absolute; 53 | left: calc(var(--size) / 12); 54 | top: 0; 55 | } 56 | 57 | .space { 58 | float: left; 59 | display: block; 60 | height: var(--size); 61 | } -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Задачи из Яндекс.Контест для Яндекс Стажировки 2 | 3 | ### Содержание 4 | 5 | * [А. Исследователи](#explorers) 6 | * [В. Метеозонд](#meteosond) 7 | * [С. Секретное сообщение](#secret) 8 | * [D. Кроссворд](#crossword) 9 | 10 | 11 | 12 | ## A. Исследователи (1 балл) 13 | 14 | 15 | 16 | **Статус: Проверка пройдена** 17 | 18 | Дан список, в которой хранятся исследователи и топонимы (имена мест) где они бывали. Список имеет следующий формат: 19 | 20 | ```javascript 21 | [ 22 | [, , , ...], 23 | [, , , ...], 24 | [, , , ...], 25 | ... 26 | ] 27 | ``` 28 | 29 | Надо развернуть этот список, таким образом, чтобы на первом месте оказался топоним, а на остальных исследователи. 30 | 31 | ### Формат ввода 32 | 33 | ```javascript 34 | [ 35 | ["Mallory", "Everest", "Mont Blanc", "Pillar Rock"], 36 | ["Mawson", "South Pole", "New Hebrides"], 37 | ["Hillary", "Everest", "South Pole"] 38 | ] 39 | ``` 40 | 41 | ### Формат вывода 42 | 43 | ```javascript 44 | [ 45 | ["Everest", "Hillary", "Mallory"], 46 | ["South Pole", "Hillary", "Mawson"], 47 | ["Mont Blanc", "Mallory"], 48 | ["Pillar Rock", "Mallory"], 49 | ["New Hebrides", "Mawson"] 50 | ] 51 | ``` 52 | 53 | 54 | 55 | ## B. Метеозонд (1 балл) 56 | 57 | 58 | 59 | **Статус: Проверка пройдена** 60 | 61 | Метеозонд отправляет данные с его смещениями по X и Y за последние N минут (N ≥ 1). За минуту зонд может сместиться на +/-1 по каждой координате или остаться на месте. 62 | Аппаратура зонда сломалась и отправляет все значения координат без знаков (’+’ или ’-’). 63 | Проверьте существование комбинации знаков, для которых зонд вернулся на свое начальное положение. 64 | На вход данные передаются как массив из N смещений. Каждое смещение имеет формат: [, ]. 65 | Ваша функция должна вернуть модифицированный массив смещений со знаками, для которых зонд вернулся в начальное положение, или null, если такой комбинации не существует. 66 | 67 | ### Формат ввода 68 | 69 | ```javascript 70 | [ 71 | [1, 0], 72 | [0, 1], 73 | [1, 1] 74 | ] 75 | ``` 76 | 77 | ### Формат вывода 78 | 79 | ```javascript 80 | [ 81 | [-1, 0], 82 | [0, -1], 83 | [1, 1] 84 | ] 85 | ``` 86 | 87 | 88 | 89 | ## C. Секретное сообщение (2 балла) 90 | 91 | 92 | 93 | **Статус: Проверка не пройдена (проблема на 7-м тесте)** 94 | 95 | На старой заброшенной базе геодезистов вы нашли код, который возвращает секретные послания, зашифрованные среди географических данных. Скрипт содержит несколько синтаксических ошибок и кажется работает очень медленно. Ваша задача - привести его в порядок. 96 | 97 | ### Формат ввода 98 | 99 | ```javascript 100 | const data = [ 101 | { 102 | geometry: [10, 20], 103 | text: ’James’ 104 | }, 105 | { 106 | geometry: [20, 40], 107 | text: ’Bond’ 108 | }, 109 | { 110 | geometry: [5, 40], 111 | text: ’Bond’ 112 | } 113 | ]; 114 | const dictionary = [’James’, ’Bond’]; 115 | ``` 116 | 117 | ### Формат вывода 118 | 119 | Bond James Bond 120 | 121 | ### Примечания 122 | 123 | В файле task.js описан метод, который принимает на вход два аргумента - data и dictionary. В переменной data передается массив объектов вида: 124 | 125 | ```javascript 126 | { 127 | geometry: [number, number]; 128 | text: string; 129 | } 130 | ``` 131 | 132 | В переменной dictionary передается массив строк - слова, которые мы умеем расшифровывать. 133 | 134 | dictionary: string[]; 135 | 136 | Чтобы получить секретное сообщение, требуется отсортировать все объекты из массива data по первой координате из поля geometry по возрастанию, а затем собрать в строку все поля text из отсортированного массива. 137 | К сожалению, сообщение закодировано на иностранном языке, а переводчик знает только слова, заданные в переменной dictionary. Поэтому если в поле text встречается слово, которого нет в массиве dictionary, сообщение невозможно расшифровать. 138 | Программа должна вернуть полученное сообщение или строку "Unreadable message"(в случае, если сообщение содержит слова, которых нет в словаре). 139 | Решение необходимо предоставить в виде исправленого модуля. 140 | Вердикт RE также означает, что отправленное решение неверно. 141 | 142 | **Мой комментарий: Кавычки не при чем - проверено. Буду рад увидеть правильное решение** 143 | 144 | 145 | 146 | ## D. Кроссворд (2 балла) 147 | 148 | 149 | 150 | **Статус: Проверка пройдена** 151 | 152 | После рефакторинга сломались CSS-стили в кроссворде: 153 | 154 | ![after-refactoring](afterRefactoring.png) 155 | 156 | Первоначальный дизайн: 157 | 158 | ![first-design](firstDesign.png) 159 | 160 | Необходимо восстановить стили в соответствии с первоначальным дизайном, но сделать это нужно с минимальным количетсвом исправлений. 161 | 162 | ### Примечания 163 | Текущие CSS-стили: solution.css. 164 | После исправлений, нужно предоставить обновленный CSS-файл. Данный файл будет подключен как solution.css к HTML-странице. 165 | Ваше решение будет тестироваться в браузере Google Chrome 69. Семейство и другие параметры шрифтов изменять не надо. При этом локально у вас может не совпадать шрифт с ожидаемым состоянием, т.к. скриншоты сделаны в Ubuntu. 166 | Рекомендуем использовать плагины для pixel-perfect верстки, например, PerfectPixel. --------------------------------------------------------------------------------