├── 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 | 
155 |
156 | Первоначальный дизайн:
157 |
158 | 
159 |
160 | Необходимо восстановить стили в соответствии с первоначальным дизайном, но сделать это нужно с минимальным количетсвом исправлений.
161 |
162 | ### Примечания
163 | Текущие CSS-стили: solution.css.
164 | После исправлений, нужно предоставить обновленный CSS-файл. Данный файл будет подключен как solution.css к HTML-странице.
165 | Ваше решение будет тестироваться в браузере Google Chrome 69. Семейство и другие параметры шрифтов изменять не надо. При этом локально у вас может не совпадать шрифт с ожидаемым состоянием, т.к. скриншоты сделаны в Ubuntu.
166 | Рекомендуем использовать плагины для pixel-perfect верстки, например, PerfectPixel.
--------------------------------------------------------------------------------