Какие призы нужно получить каждому обладателю счастливого билета - Prolog
Формулировка задачи:
Пять обладателей выигрышных лотерейных билетов должны получить по два приза. На десяти карточках написали номера от одного до десяти и пригласили каждого счастливчика вытянуть по две карточки.
К сожалению, при записи результатов произошла ошибка. В то время, как один из членов тиражной комиссии называл вслух числа, стоявшие на извлечённых кар-точках (например, «Пять и семь»), другой по рассеянности складывал эти числа и записывал лишь их сумму (в рассмотренном нами примере это было число 12). Поэтому результаты в протоколе записаны так: Петров — 11, Семенов — 4, Ива-нов—7, Сидоров — 16, Локтев — 17.
Требуется определить, какие призы нужно получить каждому обладателю счастливого билета (номер каждого выигранного им приза), если карточки назад не возвращались. Написать программу, возвращающую результат в виде троек значений: Фамилия, Номер первого приза, Номер второго приза.
Решение задачи: «Какие призы нужно получить каждому обладателю счастливого билета»
textual
Листинг программы
- % Д.Визам, Я.Герцег
- % ИГРА И ЛОГИКА
- % 85 ЛОГИЧЕСКИХ ЗАДАЧ
- % Часть 1
- % ПЕРВОЕ ЗНАКОМСТВО
- % Задача 2
- % ЛОТЕРЕЯ
- /*
- На каждой из десяти карточек из плотной бумаги написали по одному целому числу
- от 1 до 10. Карточки тщательно свернули, бросили в чью-то шляпу и
- пригласили каждого из пяти счастливых обладателей выигрышных билетов
- вытянуть по две карточки.
- К сожалению, при записи результатов лотереи произошла ошибка.
- В то время как один из членов тиражной комиссии называл вслух числа,
- стоявшие на извлеченных из шляпы карточках (например: «Пять и семь»),
- другой по рассеянности складывал эти числа и записывал лишь их сумму
- (в рассмотренном нами примере он записал число 12).
- Поэтому результаты лотереи (совпадающие с истинными размерами выигрышей)
- в протоколе распределились так:
- Эрдеи—11, Фёльди — 4, Хедьи — 7, Мезеи—16, Визи — 17.
- Между тем каждый из пяти участников лотереи должен получить по два выигрыша
- в соответствии с теми двумя числами, которые значились на вытащенных им карточках.
- Нельзя ли установить, какие два числа выпали каждому участнику лотереи?
- (Вытащенные один раз карточки обратно в шляпу не возвращались.)
- */
- % Диалект: SWI-Prolog
- % Запуск решения:
- % ? wins(Wins).
- % карточки
- cards([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).
- % записанные выигрыши
- records([[erdei, 11], [feldi, 4], [heldi, 7], [mezei, 16], [vizi, 17]]).
- % реальные выигрыши
- wins(Wins) :-
- records(Records),
- cards(Cards),
- wins(Records, Cards, Wins),
- !.
- wins([], [], []).
- wins([[Name, Sum]|Teil], Cards, [[Name, [Num1, Num2]]|Rest]) :-
- remove(Num1, Cards, Cards1),
- remove(Num2, Cards1, Cards2),
- Sum is Num1 + Num2,
- wins(Teil, Cards2, Rest).
- %
- remove(Elem, [Elem|Tail], Tail).
- remove(Elem, [Head|Tail], [Head|Rest]) :-
- remove(Elem, Tail, Rest).
- %
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д