Сегодня с утра был очень интересный пост о том, какой код нужно писать на собеседовании и какие навыки при этом демонстрировать. Тестовая задача была такая.
Написать на TypeScript функцию, которая для заданного массива чисел выводит текстовую строку диапазонов:
К сожалению, этот пост уже не доступен, и приведенное решение я сейчас не восстановлю. Но это решение было настолько красивое, настолько же крайне плохо читаемое для среднего программиста слегка замученного менеджментом к концу дедлайна. Это был практически однострочный скрипт в стиле write-only Perl.
И вот вопрос, как этот код оценивать? С одной стороны он демонстрирует высокий технический уровень кандидата. С другой стороны, он же демонстрирует некоторое непонимание процессов командной разработки с программистами довольно разного уровня подготовки.
Я минут за 10 набросал свое решение. Оно выглядит так:
Алгоритм здесь такой:
Но вот поглядел я на это свое решение. И не так, чтобы оно тоже выглядело идеальным. Несколько многословое, вводится дополнительная сущность «Interval». Но все-равно я убежден, что это решение гораздо легче читать и понимать.
Но вот вопрос. Как это решение будет оценено на интервью с точки зрения поклонника олимпиадного программирования?
В общем, мне бы хотелось продолжить эту дискуссию.
UPD 1. Дополнения к задаче. Входной массив является отсортированным.
UPD 2. Оригинальный пост опять доступен, habr.com/ru/post/470407
Написать на TypeScript функцию, которая для заданного массива чисел выводит текстовую строку диапазонов:
getRanges([0, 1, 2, 3, 4, 7, 8, 10]); // 0-4,7-8,10
getRanges([4, 7, 10]); // 4,7,10
getRanges([2, 3, 8, 9]); // 2-3,8-9
К сожалению, этот пост уже не доступен, и приведенное решение я сейчас не восстановлю. Но это решение было настолько красивое, настолько же крайне плохо читаемое для среднего программиста слегка замученного менеджментом к концу дедлайна. Это был практически однострочный скрипт в стиле write-only Perl.
И вот вопрос, как этот код оценивать? С одной стороны он демонстрирует высокий технический уровень кандидата. С другой стороны, он же демонстрирует некоторое непонимание процессов командной разработки с программистами довольно разного уровня подготовки.
Я минут за 10 набросал свое решение. Оно выглядит так:
class Interval {
start: number;
stop: number
constructor(start: number, stop: number) {
this.start = start;
this.stop = stop;
}
toString(arr: number[]) {
let text: string;
text = arr[this.start].toString();
if (this.start < this.stop) {
text += '-' + arr[this.stop].toString();
}
return text;
}
}
function getRanges(arr: number[]) {
// find start-stop intervals in the sequence
let intervals : Interval[] = [];
let start = 0;
for (let i = 1; i < arr.length; i++) {
if (arr[i] - arr[i - 1] > 1) {
intervals.push(new Interval(start, i - 1));
start = i;
}
}
intervals.push(new Interval(start, arr.length - 1));
// convert intervals to the string
let out : String = "";
for (let i = 0; i < intervals.length; i++) {
out += intervals[i].toString(arr);
if (i < intervals.length - 1) {
out += ',';
}
}
console.log(out);
}
getRanges([0, 1, 2, 3, 4, 7, 8, 10]); // 0-4,7-8,10
getRanges([4, 7, 10]); // 4,7,10
getRanges([2, 3, 8, 9]); // 2-3,8-9
Алгоритм здесь такой:
- на первом шаге мы из массива чисел выделяем интервалы
- на втором шаге мы конвертируем интервалы в строки
Но вот поглядел я на это свое решение. И не так, чтобы оно тоже выглядело идеальным. Несколько многословое, вводится дополнительная сущность «Interval». Но все-равно я убежден, что это решение гораздо легче читать и понимать.
Но вот вопрос. Как это решение будет оценено на интервью с точки зрения поклонника олимпиадного программирования?
В общем, мне бы хотелось продолжить эту дискуссию.
UPD 1. Дополнения к задаче. Входной массив является отсортированным.
UPD 2. Оригинальный пост опять доступен, habr.com/ru/post/470407