Какие призы нужно получить каждому обладателю счастливого билета - 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). %
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д