IT career
8 October

Какой код нужно показывать на собеседовании

Сегодня с утра был очень интересный пост о том, какой код нужно писать на собеседовании и какие навыки при этом демонстрировать. Тестовая задача была такая.

Написать на 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

+9
11.3k 81
Comments 103
Top of the day