Какие призы нужно получить каждому обладателю счастливого билета - Prolog

Узнай цену своей работы

Формулировка задачи:

Пять обладателей выигрышных лотерейных билетов должны получить по два приза. На десяти карточках написали номера от одного до десяти и пригласили каждого счастливчика вытянуть по две карточки. К сожалению, при записи результатов произошла ошибка. В то время, как один из членов тиражной комиссии называл вслух числа, стоявшие на извлечённых кар-точках (например, «Пять и семь»), другой по рассеянности складывал эти числа и записывал лишь их сумму (в рассмотренном нами примере это было число 12). Поэтому результаты в протоколе записаны так: Петров — 11, Семенов — 4, Ива-нов—7, Сидоров — 16, Локтев — 17. Требуется определить, какие призы нужно получить каждому обладателю счастливого билета (номер каждого выигранного им приза), если карточки назад не возвращались. Написать программу, возвращающую результат в виде троек значений: Фамилия, Номер первого приза, Номер второго приза.

Решение задачи: «Какие призы нужно получить каждому обладателю счастливого билета»

textual
Листинг программы
  1. % Д.Визам, Я.Герцег
  2.  
  3. % ИГРА И ЛОГИКА
  4. % 85 ЛОГИЧЕСКИХ ЗАДАЧ
  5.  
  6. % Часть 1
  7. % ПЕРВОЕ ЗНАКОМСТВО
  8.  
  9. % Задача 2
  10. % ЛОТЕРЕЯ
  11.  
  12. /*
  13. На каждой из десяти карточек из плотной бумаги написали по одному целому числу
  14. от 1 до 10. Карточки тщательно свернули, бросили в чью-то шляпу и
  15. пригласили каждого из пяти счастливых обладателей выигрышных билетов
  16. вытянуть по две карточки.
  17. К сожалению, при записи результатов лотереи произошла ошибка.
  18. В то время как один из членов тиражной комиссии называл вслух числа,
  19. стоявшие на извлеченных из шляпы карточках (например: «Пять и семь»),
  20. другой по рассеянности складывал эти числа и записывал лишь их сумму
  21. (в рассмотренном нами примере он записал число 12).
  22. Поэтому результаты лотереи (совпадающие с истинными размерами выигрышей)
  23. в протоколе распределились так:
  24. Эрдеи—11, Фёльди — 4, Хедьи — 7, Мезеи—16, Визи — 17.
  25. Между тем каждый из пяти участников лотереи должен получить по два выигрыша
  26. в соответствии с теми двумя числами, которые значились на вытащенных им карточках.
  27. Нельзя ли установить, какие два числа выпали каждому участнику лотереи?
  28. (Вытащенные один раз карточки обратно в шляпу не возвращались.)
  29. */
  30.  
  31. % Диалект: SWI-Prolog
  32.  
  33. % Запуск решения:
  34. % ? wins(Wins).
  35.  
  36. % карточки
  37. cards([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).
  38.  
  39. % записанные выигрыши
  40. records([[erdei, 11], [feldi, 4], [heldi, 7], [mezei, 16], [vizi, 17]]).
  41.  
  42. % реальные выигрыши
  43. wins(Wins) :-
  44.     records(Records),
  45.     cards(Cards),
  46.     wins(Records, Cards, Wins),
  47.     !.
  48. wins([], [], []).
  49. wins([[Name, Sum]|Teil], Cards, [[Name, [Num1, Num2]]|Rest]) :-
  50.     remove(Num1, Cards, Cards1),
  51.     remove(Num2, Cards1, Cards2),
  52.     Sum is Num1 + Num2,
  53.     wins(Teil, Cards2, Rest).
  54.  
  55. %
  56. remove(Elem, [Elem|Tail], Tail).
  57. remove(Elem, [Head|Tail], [Head|Rest]) :-
  58.         remove(Elem, Tail, Rest).
  59.  
  60. %

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


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

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

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы