Quel code doit être montré lors de l'entretien

Aujourd'hui dans la matinée, il y avait un article très intéressant sur le code que vous devez écrire lors de l'entretien et les compétences à démontrer. La tâche de test était la suivante.

Écrivez une fonction sur TypeScript qui, pour un tableau de nombres donné, affiche une chaîne de texte de plages:

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 

Malheureusement, ce message n'est plus disponible et je ne restaurerai pas la solution donnée maintenant. Mais cette solution était si belle, tout aussi extrêmement mal lisible pour le programmeur moyen qui a été légèrement torturé par la direction vers la fin du délai. C'était un script de type Perl en écriture seule sur une seule ligne.

Et la question est, comment évaluer ce code? D'une part, il démontre le haut niveau technique du candidat. D'un autre côté, cela démontre également une mauvaise compréhension des processus de développement d'équipe avec des programmeurs de niveaux de formation assez différents.

J'ai esquissé ma décision en 10 minutes environ. Cela ressemble à ceci:

 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 

L'algorithme est le suivant:

  • dans la première étape, nous sélectionnons des intervalles dans un tableau de nombres
  • dans la deuxième étape, nous convertissons les intervalles en chaînes

Mais ensuite j'ai regardé cette décision. Et pas pour qu'il soit également parfait. Un peu verbeux, une entité supplémentaire «Intervalle» est introduite. Mais je reste convaincu que cette décision est beaucoup plus facile à lire et à comprendre.

Mais voici la question. Comment cette décision sera-t-elle évaluée dans une interview du point de vue d'un fan de programmation olympiade?

En général, je voudrais poursuivre cette discussion.

UPD 1. Ajouts à la tâche. Le tableau d'entrée est trié.
UPD 2. Le message d'origine est à nouveau disponible, habr.com/en/post/470407

Source: https://habr.com/ru/post/fr470660/


All Articles