Сегодня с утра был очень интересный пост о том, какой код нужно писать на собеседовании и какие навыки при этом демонстрировать. Тестовая задача была такая.
Написать на 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
