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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы