Новичок
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2008
|

23.11.2008, 18:38
Дана задача: Поиск всех счастливых билетов с числом 6:
1) сгенерировать все билеты в виде списка длиной 6
2) поиск счастливых билетов
Счастливый билет, это когда сумма первых и последних трех цифр одинакова (1+2+3 = 0+5+1).
1) Генерирую:
Код:
in(X,[X|_]).
in(X,[_|T]):-
in(X,T).
gen(0,[]).
gen(N,[X|T]):-
M is N-1,
gen(M,T),
in(X,[0,1,2,3,4,5,6,7,8,9]).
Вызов: gen(6,L).
Вопрос: Как осуществить поиск счастливых билетов?
Можно ли разбить сгенерированный список на элементы?
L=[A,B,C,D,E,F].
bilet(L):-A+B+C=D+E+F.
ИЛИ работать с подсчетом сумм. Т.е. считаем всю сумму
Код:
sum([], 0).
sum([H|T],S):-
sum(T,S_T),
S is S_T+H.
Как подсчитать сумму первых 3-х элементов и сравнить?
Вызов должен выглядеть примерно так: a(X):-gen(6,L),lucky(L,X).
Тут пример для строк и чисел: <a href="http://www.hardforum.ru/t62437" target="_blank">http://www.progz.ru/forum/index.php?showto...частливый+билет </a>. Мне не помогло
|
|
|
Специалист
Сообщений: 8,170
Сказал(а) спасибо: 5
Поблагодарили 339 раз(а) в 338 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

24.11.2008, 18:51
Что значит Вам не помогло?
Это таблетка как раз для Вас. Особенно второй пример.
И даже числа приведены такие же как у Вас: 1+2+3 = 0+5+1.
А если Вам надо проверять списки длиной 6, то вот:
test([Q,W,E,R,T,Y]):-Q+W+E=R+T+Y.
|
|
|
Новичок
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2008
|

24.11.2008, 20:00
Вот окончательный код в классическом Прологе:
Код:
in(X,[X|_]).
in(X,[_|T]):-
in(X,T).
gen(0,[]).
gen(N,[X|T]):-
M is N-1,
gen(M,T),
in(X,[0,1,2,3,4,5,6,7,8,9]).
bilet([Q,W,E,R,T,Y]):-
Z is Q+W+E,
X is R+T+Y,
Z is X.
Спасибо за указание верного направления  Был так рядом c ответом.
|
|
|
Специалист
Сообщений: 8,170
Сказал(а) спасибо: 5
Поблагодарили 339 раз(а) в 338 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

25.11.2008, 00:11
Что-то мне кажется, что прогу Вашу можно написать в ISO-Прологе более лаконично, и будет она более эффективней. Вы генерите список из шести ссылочных переменных, которые потом означиваете, это неэффективно и длинно. Можно сделать проще: генерить список из трёх элементов, вычислить их сумму, а потом догенерить этот список другими тремя элементами, сумма которых должна равняться первой сумме.
|
|
|
Member
Сообщений: 141
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.09.2008
Адрес: Tallinn, Estonia
|

25.11.2008, 13:40
код на ISO который строит список всех комбинаций которые будут счастливыми
Код:
:- dynamic(zzz_list/1).
% последовательно перебирает X значениями из списка
from_list(X,[X|_]).
from_list(X,[Y|L]):-from_list(X,L).
% список вариантов цифр используемых при переборе
num(X):-from_list(X,[0,1,3,4,5,6,7,8,9]).
% добавляет новый счастливый список X в уже существующий список счастливых номеров
put_value(X):-(zzz_list(Old),!,
retract(zzz_list(Old)),NewList = [X|Old],asserta(zzz_list(NewList)),nl);
asserta(zzz_list([X|[]])).
% возвращает список счастливых номеров N и чистит базу
get_hc_list(N):-zzz_list(N),abolish(zzz_list/1).
% генерирует список счастливых номеров
gen_hc:-num(A),num(B),num(C),num(D),num(E),num(F),
Lft is A+B+C, Rght is D+E+F, Lft=Rght,
Lst=[A,B,C,D,E,F],
put_value(Lst),fail.
% сформирует список всех счастливых комбинаций и вернет его в List
all_happy_combnations(List):-not(gen_hc), get_hc_list(List).
|
|
|
Специалист
Сообщений: 8,170
Сказал(а) спасибо: 5
Поблагодарили 339 раз(а) в 338 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
|

26.11.2008, 19:36
Цитата:
код на ISO который строит список всех комбинаций которые будут счастливыми
|
А вот код на VIP7, который выводит список счастливых комбинаций длиной 6:
Код:
class predicates
h:(integer_list) -> integer_list nondeterm.
clauses
h(L)=[Q,W,E,R,T,Y]:-
Q=getMember_nd(L),W=getMember_nd(L),E=getMember_nd(L),S=Q+W+E,
R=getMember_nd(L),T=getMember_nd(L),Y=getMember_nd(L),R+T+Y=S.
run():-write([L||L=h([0,1,2,3,4,5,6,7,8,9])]).
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
|