├── .ipynb_checkpoints ├── elochka-checkpoint.ipynb └── tinkofffintech password gen-checkpoint.ipynb ├── README.md ├── coffeshopTask.js ├── duplRemover.js ├── elochka.ipynb ├── firstDiviser.js ├── getNumOfRoutes.js ├── maxSequence.js ├── mergeSort.js ├── sapFioriTest1.js ├── sapfioriTest2.js ├── stepsCounter.js ├── tinkofffintech password gen.ipynb ├── traversingTree.js └── validationTinkoff.js /.ipynb_checkpoints/elochka-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/tinkofffintech password gen-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # intervew js tasks 2 | 3 | Задачи из Яндекс.Контест и экзаменов на стажировку Тинькофф.Финтех 4 | 5 | 6 | 7 | getNumOfRoutes.js - Некоторые из региональных офисов Tinkoff.ru связаны двухсторонним железнодорожным сообщением. 8 | Всего у нас N городов, нужно посчитать общее число железных дорог между городами. 9 | Первая строка содержит число N (1<=N<=100). 10 | Следующие N строк содеражт по N цифр в каждой строке(0 или 1). Если между городами i и j есть железная дорога, 11 | то на позиции (i,j) стоит1 , иначе 0. 12 | 13 | duplRemover.js - Дан упорядоченный по неубыванию массив целых 32-разрядных чисел. Требуется удалить из него все повторения. 14 | Желательно получить решение, которое не считывает входной файл целиком в память, т.е., использует лишь константный объем памяти в процессе работы. 15 | 16 | 17 | -------------------------------------------------------------------------------- /coffeshopTask.js: -------------------------------------------------------------------------------- 1 | /** Первая строка содержит день недели (от 1 до 7), часы (от 0 до 23) и минуты (от 0 до 59). 2 | ВТорая строка содержит N до 1000 - количество напоминаний 3 | Следующие N строк содержат описание каждого напоминания - формат даты как в первой строке. 4 | 5 | Вывести через пробел день, час, минуту следующей отгрузки зерен в кофейню. 6 | 7 | Входные данные : 8 | 7 23 59 9 | 4 10 | 1 0 0 11 | 7 23 00 12 | 0 1 0 13 | 1 1 1 14 | результат 15 | 1 0 0 16 | */ 17 | 18 | 19 | var readline = require('readline'); 20 | 21 | var rl = readline.createInterface({ 22 | input: process.stdin, 23 | output: process.stdout 24 | }); 25 | 26 | 27 | /** var entry = '7 23 59,4,1 0 0,7 23 00,0 1 0,1 1 0' */ 28 | 29 | var entry= []; 30 | 31 | rl.on('line', function (data) { // line example: "0 0 1 1" 32 | entry.push(data); 33 | 34 | }); 35 | 36 | var data = entry; 37 | rl.on('close', () => { 38 | 39 | var numOfReminders = data[1]; 40 | 41 | var currentTime = data[0]; 42 | var reminders = data.slice(2); 43 | 44 | 45 | 46 | 47 | currentTime = currentTime.split(' '); 48 | var currentTimeInMins = currentTime[0] * 1440 + currentTime[1] * 60 + Number(currentTime[2]); 49 | 50 | 51 | 52 | var remindersNewArray = []; 53 | 54 | reminders.forEach(function(item, i) { 55 | 56 | var reminderInMins = item.split(' '); 57 | if (reminderInMins[0] == '0') { 58 | for (let i = 1; i <= 7; i++) { //adding 7 reminders instead of one 59 | reminderInMins[0] = i; 60 | remindersNewArray.unshift(Number(reminderInMins[0]) * 1440 + Number(reminderInMins[1]) * 60 + Number(reminderInMins[2])); 61 | 62 | } 63 | 64 | } else { 65 | 66 | remindersNewArray.unshift(Number(reminderInMins[0]) * 1440 + Number(reminderInMins[1]) * 60 + Number(reminderInMins[2])); 67 | } 68 | }) 69 | 70 | 71 | remindersNewArray.sort((a, b) => a - b); 72 | 73 | 74 | var nextReminder = 0; 75 | 76 | for (let i in remindersNewArray) { 77 | if (remindersNewArray[i] >= currentTimeInMins) { 78 | nextReminder = remindersNewArray[i]; 79 | break 80 | } 81 | } 82 | if (nextReminder == '0') { 83 | nextReminder = remindersNewArray[0] 84 | } 85 | 86 | function getReminderDate(nextReminder) { 87 | var nextReminderDay = Math.floor(nextReminder / 1440); 88 | 89 | var nextReminderHour = Math.floor((nextReminder - nextReminderDay * 1440) / 60); 90 | var nextReminderMin = nextReminder - nextReminderDay * 1440 - nextReminderHour * 60; 91 | return nextReminderDay+' '+nextReminderHour+" "+nextReminderMin 92 | } 93 | 94 | 95 | var result=getReminderDate(nextReminder); 96 | 97 | process.stdout.write(result.toString()); 98 | process.stdout.write('\n'); 99 | process.exit(0); 100 | }); 101 | -------------------------------------------------------------------------------- /duplRemover.js: -------------------------------------------------------------------------------- 1 | /** 2 | Дан упорядоченный по неубыванию массив целых 32-разрядных чисел. Требуется удалить из него все повторения. 3 | 4 | Желательно получить решение, которое не считывает входной файл целиком в память, т.е., использует лишь константный объем памяти в процессе работы. 5 | */ 6 | 7 | const readline = require('readline'); 8 | 9 | 10 | const rl = readline.createInterface({ 11 | input: process.stdin 12 | }); 13 | 14 | var prevLine=''; 15 | var output=[]; 16 | 17 | rl.on('line', (line) => { 18 | 19 | if (line !== prevLine) { 20 | output.push(line); 21 | } 22 | prevLine = line; 23 | 24 | }); 25 | 26 | 27 | rl.on('close', () => { 28 | output = output.slice(1); 29 | for (var i=0; i { 31 | 32 | var res = check(num); 33 | process.stdout.write(res.toString()); 34 | 35 | 36 | 37 | process.exit(0); 38 | }); -------------------------------------------------------------------------------- /getNumOfRoutes.js: -------------------------------------------------------------------------------- 1 | /* Некоторые из региональных офисов Tinkoff.ru связаны двухсторонним железнодорожным сообщением. 2 | Всего у нас N городов, нужно посчитать общее число железных дорог между городами. 3 | 4 | Первая строка содержит число N (1<=N<=100). 5 | Следующие N строк содеражт по N цифр в каждой строке(0 или 1). Если между городами i и j есть железная дорога, 6 | то на позиции (i,j) стоит1 , иначе 0. */ 7 | 8 | 9 | var readline = require('readline'); 10 | 11 | var rl = readline.createInterface({ 12 | input: process.stdin, 13 | output: process.stdout 14 | }); 15 | 16 | let result = 0; 17 | let matrix = []; 18 | 19 | 20 | rl.on('line', function (data) { // line example: "0 0 1 1" 21 | 22 | matrix.push(data); 23 | }); 24 | 25 | rl.on('close', () => { 26 | 27 | matrix = matrix.slice(1); //removed 1st element which is length of array 28 | 29 | for (str in matrix) { 30 | let cstr = matrix[str].split(' '); 31 | var currRes = cstr.reduce((first,last)=> Number(first)+Number(last)); 32 | result+=Number(currRes); 33 | } 34 | result = result / 2; 35 | process.stdout.write(result.toString()); 36 | 37 | 38 | 39 | process.exit(0); 40 | }); -------------------------------------------------------------------------------- /maxSequence.js: -------------------------------------------------------------------------------- 1 | /** Требуется найти в бинарном векторе самую длинную последовательность единиц и вывести её длину. 2 | 3 | Желательно получить решение, работающее за линейное время и при этом проходящее по входному массиву только один раз. 4 | 5 | */ 6 | 7 | 8 | 9 | const readline = require('readline'); 10 | 11 | const rl = readline.createInterface({ 12 | input: process.stdin 13 | }); 14 | 15 | var numbersSequence = ''; 16 | 17 | function getMaxSeq(str) { 18 | var counter=0; 19 | var currCounter=0; 20 | for (let i=0; i counter) ? currCounter : counter; 27 | } 28 | if (str[i] == 0 ) { 29 | if (currCounter !== 0) { 30 | counter = (currCounter > counter) ? currCounter : counter; 31 | 32 | currCounter = 0; 33 | } 34 | } 35 | } 36 | return counter; 37 | }; 38 | 39 | rl.on('line', (line) => { 40 | numbersSequence+=line; 41 | 42 | }); 43 | 44 | 45 | rl.on('close', () => { 46 | numbersSequence = [].slice.call(numbersSequence, 1).join(''); 47 | var res = getMaxSeq(numbersSequence); 48 | process.stdout.write(res.toString()); 49 | }); 50 | -------------------------------------------------------------------------------- /mergeSort.js: -------------------------------------------------------------------------------- 1 | function mergeSort(arr) { 2 | 3 | 4 | function merge(left, right) { 5 | var result =[], 6 | indLeft=0, indRight=0; 7 | while ( indLeft < left.length && indRight < right.length ) { 8 | if ( left[indLeft] <= right[indRight]) { 9 | result.push(left[indLeft++]); 10 | 11 | } else { 12 | result.push(right[indRight++]); 13 | } 14 | } 15 | 16 | 17 | return result.concat(left.slice(indLeft).concat(right.slice(indRight)) ); 18 | } 19 | 20 | 21 | 22 | function merge_sort(arr) { 23 | if ( arr.length <=1) { 24 | return arr; 25 | } 26 | var left = [], right = []; 27 | var centerElInd = Math.floor(arr.length/2); 28 | left = arr.slice(0, centerElInd); 29 | right = arr.slice( centerElInd); 30 | return ( merge (merge_sort(left), merge_sort(right))); 31 | } 32 | 33 | 34 | return merge_sort(arr); 35 | 36 | 37 | } 38 | 39 | var arr = [10, 21, 11, 23, 5, 3, 89]; 40 | 41 | mergeSort(arr); 42 | 43 | -------------------------------------------------------------------------------- /sapFioriTest1.js: -------------------------------------------------------------------------------- 1 | /** Дано число N, необходимо посчитать количество нулей на конце числа, являющегося результатом вычисления факториала N! 2 | */ 3 | 4 | 5 | 6 | function getNumOfZeros(num) { 7 | let s = 1; 8 | let result=0; 9 | for (let i=1; i<=num; i++) { 10 | s=s*i; 11 | } 12 | 13 | s=s.toString().split('').reverse().join(''); 14 | 15 | 16 | for (let i=0; i Number(snippet2)) { 62 | return version2 63 | } 64 | if (Number(snippet) < Number(snippet2)) { 65 | return version1 66 | } 67 | 68 | start2 = ++stop2; 69 | 70 | } 71 | } 72 | 73 | let lastsnippet1 = ''; // snippet after the last dot 74 | for (start1; start1 < version1.length; ++start1) { 75 | lastsnippet1 += version1[start1]; 76 | 77 | } 78 | 79 | let lastsnippet2 = ''; // snippet after the last dot 80 | for (start2; start2 < version2.length; ++start2) { 81 | 82 | lastsnippet2 += version2[start2]; 83 | 84 | 85 | } 86 | //compare snippets after the last dots 87 | if (Number(lastsnippet1) > Number(lastsnippet2)) { 88 | return version2 89 | } 90 | if (Number(lastsnippet1) < Number(lastsnippet2)) { 91 | return version1 92 | } 93 | else return ('equal'); 94 | 95 | } 96 | 97 | getOlderVersion(version1, version2); -------------------------------------------------------------------------------- /stepsCounter.js: -------------------------------------------------------------------------------- 1 | var readline = require('readline'); 2 | 3 | var rl = readline.createInterface({ 4 | input: process.stdin, 5 | output: process.stdout 6 | }); 7 | 8 | 9 | 10 | var input=[]; 11 | 12 | rl.on('line', function (data) { 13 | 14 | input.push(data); 15 | 16 | 17 | }); 18 | function check(numX, numY) { 19 | var days = 0; 20 | 21 | while( numX < numY ) { 22 | 23 | numX+=numX*0.7; 24 | days++; 25 | } 26 | return(days); 27 | } 28 | rl.on('close', () => { 29 | 30 | var numX = parseInt(input[0].split(' ')[0]); 31 | var numY = parseInt(input[0].split(' ')[1]); 32 | 33 | var res = check(numX, numY); 34 | process.stdout.write(res.toString()); 35 | 36 | 37 | 38 | process.exit(0); 39 | }); -------------------------------------------------------------------------------- /tinkofffintech password gen.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "3\n" 13 | ] 14 | }, 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "'3'" 19 | ] 20 | }, 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "output_type": "execute_result" 24 | } 25 | ], 26 | "source": [ 27 | "a = input()\n", 28 | "a" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 9, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "name": "stdout", 38 | "output_type": "stream", 39 | "text": [ 40 | "3 4\n", 41 | "\n" 42 | ] 43 | } 44 | ], 45 | "source": [ 46 | "n,m = input().split(' ')\n", 47 | "n = int(n)\n", 48 | "print(type(n))" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 254, 54 | "metadata": {}, 55 | "outputs": [ 56 | { 57 | "data": { 58 | "text/plain": [ 59 | "[['a', 'b', 'c', 'd'], ['e', 'f', 'd', 'g'], ['h', 'i', 'j', 'k']]" 60 | ] 61 | }, 62 | "execution_count": 254, 63 | "metadata": {}, 64 | "output_type": "execute_result" 65 | } 66 | ], 67 | "source": [ 68 | "tree" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 263, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "name": "stdout", 78 | "output_type": "stream", 79 | "text": [ 80 | "3 4\n", 81 | "abcd\n", 82 | "efdg\n", 83 | "hijk\n", 84 | "4\n", 85 | "abfdgk\n" 86 | ] 87 | } 88 | ], 89 | "source": [ 90 | "n,m = input().split(' ')\n", 91 | "n = int(n)\n", 92 | "m = int(m)\n", 93 | "tree = []\n", 94 | "for i in range(n):\n", 95 | " inputs=input()\n", 96 | " tree.append([])\n", 97 | " for j in range(m):\n", 98 | " \n", 99 | " tree[i].append(inputs[j]) \n", 100 | "\n", 101 | "\n", 102 | "\n", 103 | "possibles=[]\n", 104 | "leng=m+n-1\n", 105 | "\n", 106 | "\n", 107 | "stack = [([0,0], tree[0][0])]\n", 108 | "\n", 109 | "\n", 110 | "\n", 111 | "while len(stack)>0:\n", 112 | " a = stack.pop()\n", 113 | "\n", 114 | " i = a[0][0]\n", 115 | " j = a[0][1]\n", 116 | " stri=a[1]\n", 117 | "\n", 118 | " try:\n", 119 | " tree[i][j+1]\n", 120 | " if len( stri+tree[i][j+1])==leng:\n", 121 | " possibles.append(stri+tree[i][j+1])\n", 122 | " else: \n", 123 | " stack.append( ([i, j+1], stri+tree[i][j+1]))\n", 124 | " except IndexError:\n", 125 | " pass\n", 126 | "\n", 127 | " try:\n", 128 | " tree[i+1][j]\n", 129 | " if len( stri+tree[i+1][j])==leng:\n", 130 | " possibles.append(stri+tree[i+1][j])\n", 131 | " else: \n", 132 | " stack.insert(0, ([i+1, j], stri+tree[i+1][j])) \n", 133 | "\n", 134 | " except IndexError:\n", 135 | " pass \n", 136 | "\n", 137 | " \n", 138 | "possibles.sort()\n", 139 | "possibles\n", 140 | "\n", 141 | "print(possibles[int(input())-1])" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": null, 147 | "metadata": {}, 148 | "outputs": [], 149 | "source": [] 150 | } 151 | ], 152 | "metadata": { 153 | "kernelspec": { 154 | "display_name": "Python 3", 155 | "language": "python", 156 | "name": "python3" 157 | }, 158 | "language_info": { 159 | "codemirror_mode": { 160 | "name": "ipython", 161 | "version": 3 162 | }, 163 | "file_extension": ".py", 164 | "mimetype": "text/x-python", 165 | "name": "python", 166 | "nbconvert_exporter": "python", 167 | "pygments_lexer": "ipython3", 168 | "version": "3.6.6" 169 | } 170 | }, 171 | "nbformat": 4, 172 | "nbformat_minor": 2 173 | } 174 | -------------------------------------------------------------------------------- /traversingTree.js: -------------------------------------------------------------------------------- 1 | /**в некоторой компании у всех сотр, кроме мистера Х есть ровно 2 | * один руководитель. 3 | * определите уровень каждого сотрудника. 4 | * Первая строка - число сотр в компании. 5 | * далее - имя сотрудника и имя руководителя через пробел. 6 | * вывод программы - в лексикографическом порядке имя - уровень. 7 | * Входные данные 8 | * 3 9 | * Stas X 10 | * Artem X 11 | * Вывод: 12 | * Artem 1 13 | * Stas 1 14 | * X 0 */ 15 | 16 | 17 | var readline = require('readline'); 18 | 19 | var rl = readline.createInterface({ 20 | input: process.stdin, 21 | output: process.stdout 22 | }); 23 | 24 | var inpStr ="" 25 | var people = []; 26 | 27 | var result = {X : 0} 28 | var tree ={} 29 | 30 | function dfs(key, tree, result) { 31 | if (tree[key]) { 32 | result[tree[key]]; 33 | 34 | for (name in tree[key]) { 35 | 36 | result[tree[key][name]] = result[key] + 1; 37 | dfs(tree[key][name], tree, result); 38 | 39 | } 40 | } 41 | } 42 | 43 | 44 | rl.on('line', function (data) { // line example: "0 0 1 1" 45 | inpStr+=data.toString()+","; 46 | 47 | 48 | }); 49 | 50 | rl.on('close', () => { 51 | var [n, ...people] = inpStr.split(","); 52 | for (let i=0; i < n-1; i++) { 53 | let tupl= people[i].split(' '); 54 | 55 | if (tree[tupl[1]]) { 56 | tree[tupl[1]].unshift(tupl[0]); 57 | } 58 | if( !tree[tupl[1]]) { 59 | tree[tupl[1]] = [tupl[0]]; 60 | } 61 | 62 | } 63 | 64 | dfs('X', tree, result); 65 | 66 | var items = Object.keys(result).map(function(key) { 67 | return([key, result[key]]); 68 | 69 | }); 70 | 71 | items.sort((a, b) => { 72 | 73 | return(a[0].charCodeAt(0) - b[0].charCodeAt(0)); 74 | }); 75 | process.stdout.write("\n"); 76 | for (i in items) { 77 | 78 | process.stdout.write(items[i][0].toString() + " " + items[i][1].toString() + "\n"); 79 | } 80 | 81 | process.exit(0); 82 | }); -------------------------------------------------------------------------------- /validationTinkoff.js: -------------------------------------------------------------------------------- 1 | var readline = require('readline'); 2 | 3 | var rl = readline.createInterface({ 4 | input: process.stdin, 5 | output: process.stdout 6 | }); 7 | 8 | 9 | function check(str1) { 10 | if (str1.length < 8) { 11 | return("NO") 12 | } 13 | if ( !str1.match("[a-z]") ) { 14 | return("NO") 15 | } 16 | if ( !str1.match("[A-Z]") ) { 17 | return("NO") 18 | } 19 | if ( !str1.match("[0-9]") ) { 20 | return("NO") 21 | } 22 | return("YES") 23 | } 24 | 25 | var str1=''; 26 | 27 | rl.on('line', function (data) { // line example: "0 0 1 1" 28 | 29 | 30 | str1+=data.toString(); 31 | 32 | }); 33 | 34 | rl.on('close', () => { 35 | 36 | var res = check(str1); 37 | process.stdout.write(res.toString()); 38 | 39 | 40 | 41 | process.exit(0); 42 | }); --------------------------------------------------------------------------------