Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2018, 22:36   #1
emoface
 
Регистрация: 01.03.2018
Сообщений: 7
Восклицание Задача из "101 головоломка" PROLOG

Здравствуйте. Есть интересная загадка про 13 мышей, её нужно написать на ПРОЛОГЕ:
Все 13 мышей, окружающие кошку, обречены попасть ей на обед. Но кошка желает съесть их в определённом порядке: каждый раз она отсчитывает по часовой стрелке 13-ю, и съедает её.
С какой мыши она должна начать, чтобы белая оказалась съеденной последней?

В решениях сказано, что нужно начать с мышки, которая возле хвоста. Но очевидно, что нужно осуществить некий перебор событий, начиная с разных мышек и приходя к тому, что белая мышь будет последней съеденной. Как осуществить этот перебор на ПРОЛОГЕ? Ну, или решить по другому. Помогите, пожалуйста.
Всем добра и с первым днём весны
Изображения
Тип файла: jpg defmouse.jpg (53.8 Кб, 120 просмотров)
emoface вне форума Ответить с цитированием
Старый 02.03.2018, 14:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а это не классическая задача Иосифа Флавия ?
см. Задача Иосифа Флавия или считалка Джозефуса — известная математическая задача с историческим подтекстом.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.03.2018, 14:43   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На прологе не, ни капли. Могу подкинуть делфийское решение для любого количества мышей и шага обреченности ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.03.2018, 17:18   #4
emoface
 
Регистрация: 01.03.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
На прологе не, ни капли. Могу подкинуть делфийское решение для любого количества мышей и шага обреченности ))
Давайте, будет круто)))

Но вообще если кто-то сможет воспроизвести это на прологе - будет очень и очень благодарен
emoface вне форума Ответить с цитированием
Старый 02.03.2018, 17:22   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
function CalcFirstNumber(Count,Step: Integer): Integer;
type PMyRecord = ^TMyRecord;
     TMyRecord = record
       Number: Integer;
       Next: PMyRecord;
     end;
var i: Integer;
    p0,p1,p2: PMyRecord;
begin
  for i:=1 to Count do begin
    New(p1);
    if i=1 then p0:=p1 else p2.Next:=p1;
    p1.Number:=i;
    p1.Next:=p0;
    p2:=p1;
  end;

  while p0<>p0.Next do begin
    for i:=2 to Step do begin p1:=p0; p0:=p0.Next; end;
    p1.Next:=p0.Next;
    Dispose(p0);
    p0:=p1.Next;
  end;

  Result:=p0.Number;
  Dispose(p0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Count,Step: Integer;
begin
  Count:=13; // > 1
  Step:=13;  // > 1
  //нумерация с 1 и белой мыши по часовой стрелке
  Edit1.Text:=IntToStr(((Count+1-CalcFirstNumber(Count,Step)) mod Step)+1);
end;
Название функции не фонтан, ближе к телу было бы CalcLastNumber. И вообще лучше было бы окончательный расчет, который в Button1Click засунуть в функцию
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.03.2018 в 17:29.
Аватар вне форума Ответить с цитированием
Старый 03.03.2018, 02:28   #6
emoface
 
Регистрация: 01.03.2018
Сообщений: 7
По умолчанию Java

Переписал на Java. В общем здесь захардкодил под свою лог.задачу, индекс мыши с который нужно начать(killIdx) = 6. Если кто вдруг шарит джаву и/или пролог, помогите это осуществить на нём.

Код:
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        System.out.println("Count of mouses: " + Josephus.execute(14, 1));
        System.out.println("Still alive: " + Josephus.executeAllButM(13, 13, 1));
    }
}

class Josephus {
    public static int execute(int n, int k) {
        int killIdx = 0;
        ArrayList<Integer> prisoners = new ArrayList<Integer>(n);
        for (int i = 0; i < n; i++) {
            prisoners.add(i);
        }
        System.out.println("Mouses order:");
        while (prisoners.size() > 1) {
            killIdx = (killIdx + k - 1) % prisoners.size();
            System.out.print(prisoners.get(killIdx) + " ");
            prisoners.remove(killIdx);
        }
        System.out.println();
        return prisoners.get(0);
    }

    public static ArrayList<Integer> executeAllButM(int n, int k, int m) {
        int killIdx = 6;
        ArrayList<Integer> prisoners = new ArrayList<Integer>(n);
        for (int i = 0; i < n; i++) {
            prisoners.add(i);
        }
        System.out.println("Mouses killed in order:");
        while (prisoners.size() > m) {
            killIdx = (killIdx + k - 1) % prisoners.size();
            System.out.print(prisoners.get(killIdx) + " ");
            prisoners.remove(killIdx);
        }
        System.out.println();
        return prisoners;
    }
}
Ещё нашёл реализацию на прологе в соседних форумах, но здесь есть какой-то косяк и я не понимаю где он и как поправить.
Код:
main:-read(L), read(M), read(N), joseph(L, M, N).
joseph(L, M, N):-N =/= 0, del()
del([], _, _).
del([H|T], M, R):- M =:= 0, M1 is M - 1, writeln(H), del(T, M1, R).
del([H|T], M, [H|R]):- M =/= 0, M1 is M - 1, del(T, M1, R)
emoface вне форума Ответить с цитированием
Старый 15.03.2018, 20:09   #7
emoface
 
Регистрация: 01.03.2018
Сообщений: 7
По умолчанию

Привет ещё раз. Сделал прошлую задачу, теперь мне нужно реализовать новую и тут я вообще без понятия как это сделать.
Помогите, пожалуйста.
Муха на занавеске

На оконной занавеске с рисунком в клетку уселись 9 мух. Случайно они расположились так, что никакие две мухи не оказались в одном и том же ряду — ни прямом, ни косом (рис.)

Спустя несколько минут три мухи сменили места и переползли в соседние, незанятые клетки; остальные 6 не двигались. Но забавно: хотя три мухи перешли на другие места, все 9 снова оказались размещенными так, что никакая пара не находилась в одном прямом или косом ряду. Можете ли вы сказать, какие три мухи и куда пересели?
Ответ: a6->b6, b3->a4, d4->d3, но нужно реализовать на SWI Prolog.
Изображения
Тип файла: jpg мухи.jpg (45.8 Кб, 80 просмотров)
emoface вне форума Ответить с цитированием
Старый 22.03.2018, 12:24   #8
emoface
 
Регистрация: 01.03.2018
Сообщений: 7
По умолчанию

Если есть идеи, как это возможно решить, просьба поделиться ими, пожалуйста
emoface вне форума Ответить с цитированием
Старый 22.03.2018, 12:31   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В циклах прямым перебором не катит? Вполне решаемо - вариантов выборки трех мух 74, у трех мух вариантов новых клеток 512 или меньше, если муха на краю или достаточно близко от другой.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2018, 12:58   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Можете ли вы сказать, какие три мухи и куда пересели?
нет. это могут быть почти любые.
одна(ЛЮБАЯ) по диагонали(любой из доступных). Ответ: a6->b6, b3->a4, d4->d3
другая с вновь занятой горизонтали на освободившуюся Ответ: a6->b6, b3->a4, d4->d3
третья с вновь занятой вертикали также на освободившуюся Ответ: a6->b6, b3->a4, d4->d3.
число возможных вариантов <=9(мух)*4(диагонали по максимуму)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2018 в 13:04.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" Sandakan01 Помощь студентам 1 24.02.2016 03:20