Найти первый подсписок, который имеет все числа от 1 до K - PullRequest
0 голосов
/ 13 мая 2019

Мне нужно найти первый подсписок, имеющий все числа от 1 до K, и вернуть его и его длину.

Заранее извините за плохое редактирование


Поэтому я проверяю,От 1 до K находится в подсписке, если нет, то я удаляю элемент (Hd) из

NumList, добавляю его к нашему результату (SubList) и рекурсивно вызываю функцию

с хвостом в качестве нашего новогоСписок для проверки.

findFirstSubListHavingAllColors( NumList, [Hd|Tl] ,SubList, X):-
   (   oneToKinSub(SubList,NumList)
   ->  length(SubList,X)
   ;   delete(NumList,Hd,NumList1),
       append(SubList,[Hd],SubList1),
       findFirstSubListHavingAllColors(NumList1,Tl,SubList1,_)
   ).

oneToKinSub(_,[]).
oneToKinSub(SubString,[Hd|Tl]) :-
   member(Hd,SubString),
   oneToKinSub(SubString,Tl).

Например, если

NumList = [1,2,3]

[Hd | Tl] = [1,3,1,3,1,3,3,2 , 2,1]

ожидаемый результат должен быть SubList = [1,3,1,3,1,3,3, 2] и Х = 8

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Вы можете использовать append/3 и subtract/3 для получения первого подсписка, который содержит все элементы:

findFirstSubListHavingAllColors( NumList, List ,SubList, Len):-
  once((
   append(SubList, _, List),        % get SubList
   subtract(NumList, SubList, []),  % test whether NumList is contained in SubList
   length(SubList, Len)
  )).

once/1 здесь, чтобы избежать получения других (неправильных) решений по возврату.

0 голосов
/ 14 мая 2019

Вот еще одно решение, использующее aggegate_all / 3

firstSubList(NumList,  In, Out) :-
    aggregate_all(max(E),(member(X, NumList), once(nth1(E, In, X))), Len),
    length(Out, Len),
    append(Out, _, In).
Once/1 is used because numbers may appears many times in the list !
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...