Решение №15 из главы 15.Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k

Задача №15 из главы 15

Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
Например:

Для N = 6, k=2:
202211 длина=4
Для N = 10, k=2:
2022110012 длина=3
Для N = 15, k=3:
202233002303210 длина=4
Для N = 7, k=2:
0100020 длина=5

program seq_in_list15_15;

{ Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 0 до k, где 0≤k<N.
Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.
}

type Arr = array[1..100] of integer; // секция обьявления типов

 {  функция возвращает boolean значение } 
function seq_in_list( seq_in: Arr; ls_in: Arr;  len_seq: integer; ran : integer): boolean;
  var n, i, j : integer;
  
begin // начало тела функции
  n := 0;
  for i:=1 to ran do
  begin
     for j:=1 to len_seq do
     begin
         if( seq_in[i] ) = ( ls_in[j] ) then
         begin
             n += 1;
             break
         end;
     end;
  end;
  if(n = ran) then
     seq_in_list := True
  else
     seq_in_list := False;
  
end;  // завершение тела функции }

var
  i, j, k, b, m, count, len_list, range, step_len : integer;
   fl: boolean;
  list_seq: Arr; // массив от 0 до k
  Arr_rand: Arr; // массив из случайно выбранных чисел из диапазона от 0 до k
  checklist: Arr; // массив для проверки 

begin   // основная программа
  k := 1;
  b := 1;
  m := 1;
  count := 0;
  fl := True;
  writeln('Input range');
  read(range);
  for i:=1 to range do // заполнение первого массива от 1 до range
    list_seq[i] := i;

  len_list := high(Arr_rand);
  step_len := range;
 
  for i:=1 to range  do   // вывод первого массива 
    write( list_seq[i], ' ');
  writeln();
  
  for j:=1 to high(Arr_rand) do  // заполнение второго массива
     Arr_rand[j]:=random(range)+1;
     
   for j:=1 to high(Arr_rand) do 
     write( Arr_rand[j], '  ');  // вывод второго массива
   writeln();

  
  while (step_len <= len_list) and (fl = True) do
  begin
    j := 0;
    { кол-во проходов фрагмента, например в l = [1, 6, 4, 5, 1, 4, 2] кол-во 
       проходов из 3 элементов ([1,6,4], [6,4,5], [4,5,1],[5,1,4]),[1,4,2])
       будет = 5 с каждым новым витком уменьшая число проходов, например 
       в l = [1, 6, 4, 5, 1, 4, 2] кол-во 
       проходов из 4 элементов ([1,6,4,5], [6,4,5,1], [4,5,1,4],[5,1,4,2])
       будет = 4 и т.д  }
    while(j < len_list - range + 1 - count) do 
    begin                                      
       i := m;
       while(i <= step_len) do 
       begin
           checklist[b] := Arr_rand[i]; // список для проверки
           b += 1;
           i += 1;
       end;
       for k:=1 to (range + count)do // вывод списка
          write(checklist[k], ' ');                          
       writeln();
       { вызов функции }
       if(seq_in_list(list_seq,checklist,range + count, range)) then
       begin
           writeln('True');
           for i:=1 to (range + count) do  // вывод результата
           begin
              write(checklist[i],'  ');
           end;
           fl := False;
           break  
       end
       else
         { значения проверяемого списка делаем равным нулю если функция 
           вернула отрицательный результат }
          for k:=1 to(step_len) do 
              checklist[k] := 0;
       step_len += 1; // увеличение шага проверки
       j += 1;
       b := 1;
       m += 1;
    end;
    
   m := 1;
   count += 1;
   step_len := range + count;
   if not fl then // выход из цикла
       break
  end;
  if(step_len >= len_list) then
       writeln('False');
end.