Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Теория шести рукопожатий (https://javascript.ru/forum/misc/40404-teoriya-shesti-rukopozhatijj.html)

Угумс 04.08.2013 01:45

Теория шести рукопожатий
 
Добрый день,

Подскажите пожалуйста мне нужно написать програмку типо Теории шести рукопожатий, то есть я должна создать цепь где каждое из звеньев связано с другими звеньями при чем не только в одном направлении:

друзья Kevin: Mathilde, Sophie, Aaron, Sarah
друзья Joelle: Sarah, Bob, Aaron, Louis
друзья Noah: Pascal, Julie, Mathilde
друзья Matteo: Sophie, Aaron
друзья Stephanie: Bob, Orianne
друзья Lucas: Aaron, Louis
друзья Roger: Julie
Sophie и Julie друзья
Orianne и Mathilde друзья.

Например при вводе каких нибудь двух имен програмка должна показывать связь между ними то есть:
Kevin и Pascal разделены 8 друзьями:
Kevin -> Mathilde -> Noah -> Julie -> Sophie -> Kevin -> Mathilde -> Noah -> Pascal.

структура должна быть подобна этой, при этом свойство друг это должен быть массив содержащий связь с другими друзьями:

var Maillon = function(friend1,name,friend2) {
//if (suiv === undefined)
//suiv = null;
this.name = name;
this.friend1 = friend1;
this.friend2 = friend2;

};

var Liste = function () {
this.tete = null;
this.size = 0;
this.queue = null;
};

Liste.prototype.addFirst = function(name) {
this.tete = new Maillon(name,this.tete);
if (this.size === 0)
this.queue = this.tete;
this.size++;

return this;
};

Я не знаю с чего начать как сделать что бы у каждого звена было по несколько соединений. Нужно ли мне использовать что то типа:var Kevin = new Maillon(friend1,nom,friend2);?
Подскажите пожалуйста где можно найти хоть какую нибудь информацию о том как строятся подобные звенья я нигде в интернете не нашла :(

Tim 04.08.2013 05:04

Ох, не программист я, не знаю хитрых алгоритмов, но вот что у меня получилось:

// Конструктор человека
var Person = function (name) {
    
    var self = this;

    this.name    = name;
    this.friends = {};

    this.AddFriends = function () {
        var max = arguments.length, man;
        while (max--) {
            man = arguments[max];                // Мой друг
            self.friends[man.name] = man;        // Моя связь с другом
            man.friends[self.name] = self;        // Связь друга со мной
        }
    };
};

// Создаём людей
var Kevin     = new Person('Kevin');
var Joelle    = new Person('Joelle');
var Noah      = new Person('Noah');
var Matteo    = new Person('Matteo');
var Stephanie = new Person('Stephanie');
var Lucas     = new Person('Lucas');
var Roger     = new Person('Roger');
var Mathilde  = new Person('Mathilde');    
var Sophie    = new Person('Sophie');
var Aaron     = new Person('Aaron');
var Sarah     = new Person('Sarah');
var Bob       = new Person('Bob');
var Louis     = new Person('Louis');
var Pascal    = new Person('Pascal');
var Julie     = new Person('Julie');
var Orianne   = new Person('Orianne');

// Дружим людей
Kevin.AddFriends(Mathilde, Sophie, Aaron, Sarah);
Joelle.AddFriends(Sarah, Bob, Aaron, Louis);
Noah.AddFriends(Pascal, Julie, Mathilde);
Matteo.AddFriends(Sophie, Aaron);
Stephanie.AddFriends(Bob, Orianne);
Lucas.AddFriends(Aaron, Louis);
Roger.AddFriends(Julie);
Sophie.AddFriends(Julie);
Orianne.AddFriends(Mathilde);

// Функция проверяющая дружбу
var isFriend = function (person1, person2) {
    var viewedPerson = {};
    var chainFriends = [];

    console.log('Ищем связь между "' + person2.name + '" и "' + person1.name + '".');

    function searchFriens(person) {
        var friend;
        viewedPerson[person.name] = true;  // Запоминаем что смотрели друзей этого человека
        chainFriends.push(person.name);    // Добавим чела в цепочку связей
        // Пройдёмся по корешам
        for (var name in person.friends) {
            friend = person.friends[name];
            // Если чел не является сам собой, нужным нам челом и раньше не исследовался
            if (friend !== person1 && friend !== person2 && viewedPerson[friend.name] === undefined) {
                searchFriens(friend);    // Рекурсивный вызов
            } else if (friend === person1) {
                // Ура, это то что нам нужно
                console.log(chainFriends.join(' -> ') + ' -> ' + person1.name);
            }
        }
        chainFriends.slice(chainFriends.length - 1, 1); // Удалим чела из цепочки
    }
    
    searchFriens(person2);
};


// Найдём связь для "Kevin" и "Pascal"
isFriend(Kevin, Pascal);



В консоли получаю такое
Код:

Ищем связь между "Pascal" и "Kevin".
Pascal -> Noah -> Mathilde -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Julie -> Roger -> Sarah -> Kevin


Tim 04.08.2013 09:43

Дзен-трансгуманист,
Интересно. Где узнал про него? Порекомендуй почитать что нибудь по алгоритмам.

Угумс 05.08.2013 00:30

Добрый день, спасибо вам большое, что помогли я бы то такого не додумалась, я только начинаю программировать, прочитала в задании что циклы использовать для поиска друзей нельзя, а чем еще можно заменить цикл?

Tim 05.08.2013 02:55

forEach
Метод arr.forEach(callback[, thisArg]) вызывает функцию callback для каждого элемента массива.

filter
Метод arr.filter(callback[, thisArg]) создаёт новый массив, в который войдут только те элементы arr, для которых вызов callback(item, i, arr) возвратит true.

map
Метод arr.map(callback[, thisArg]) создаёт новый массив, который будет состоять из результатов вызова callback(item, i, arr) для каждого элемента arr.

every/some
Метод arr.every(callback[, thisArg]) возвращает true, если вызов callback вернёт true для каждого элемента arr.

Метод arr.some(callback[, thisArg]) возвращает true, если вызов callback вернёт true для какого-нибудь элемента arr.

reduce/reduceRight
Метод arr.reduce(reduceCallback[, initialValue]) применяет функцию reduceCallback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.


http://learn.javascript.ru/array-methods#foreach

cyber 05.08.2013 11:28

Цитата:

Сообщение от Tim
forEach
Метод arr.forEach(callback[, thisArg]) вызывает функцию callback для каждого элемента массива.

в общем тот же цикл но реализован по другому.
Цитата:

Сообщение от Угумс
Добрый день, спасибо вам большое, что помогли я бы то такого не додумалась, я только начинаю программировать, прочитала в задании что циклы использовать для поиска друзей нельзя, а чем еще можно заменить цикл?

В общем цикл можно заменить правильным алгоритмом, но есть задачи в которых циклы нужны по любому ( как эта), чем меньше циклов тем лучше.

Угумс 05.08.2013 17:34

а если например вводишь имя через prompt которого нет в списке как его добавить? а потом и его друзей? мне нужно вызвать функцию Person а затем Person.addFriends? для этих имен?
У меня почему то не получается ввести имена через prompt, если я их ввожу в функции isFriend то они становятся undefined.

Tim 05.08.2013 17:45

Цитата:

У меня почему то не получается ввести имена через prompt
ага, там строка по тому что, а ф-я ждёт объекты

var name  = prompt('sina pona?');
var friend = window[name];

Угумс 05.08.2013 18:50

Цитата:

Сообщение от Tim (Сообщение 265954)
ага, там строка по тому что, а ф-я ждёт объекты

var name  = prompt('sina pona?');
var friend = window[name];

все равно выдает ошибку: "TypeError: Cannot read property 'Kevin" of undefined"

Tim 06.08.2013 01:55

код в студию!

рони 06.08.2013 04:44

Tim, строка 63 во 2 посте
в той песочнице свои законы
var viewedPerson = {};

print(viewedPerson["Kevin"]===undefined);

cannot read the undefined variable undefined


var viewedPerson = {};

print(viewedPerson["Kevin"]===void(0));

true

или ещё == null можно но не === null
в остальном ок.

Tim 06.08.2013 08:32

рони,
print? дык это печать на принтере. мб alert?


Цитата:

cannot read the undefined variable undefined
как так то? :blink:
Цитата:

undefined Эта глобальная переменная содержит элементарное неопределенное значение - то, которое имеет переменная, значение которой не указано.
http://javascript.ru/undefined

рони 06.08.2013 13:25

Tim,
print да это типа замена алерт -- повторю с вашим кодом всё в порядке, а вот с песочницей где студентам необходимо запускать код есть вопросы - http://codeboot.org/
https://github.com/feeley/codeboot -- но это уже не к вам, просто инфа для Угумс,

bes 06.08.2013 21:58

Цитата:

Сообщение от Tim
undefined Эта глобальная переменная содержит элементарное неопределенное значение - то, которое имеет переменная, значение которой не указано.
http://javascript.ru/undefined

http://javascript.ru/node/4119
Цитата:

Кстати, глобальных переменных в javascript на самом деле нет. То, что называют "глобальными" - на самом деле свойства специального объекта window.
подтверждение
http://es5.javascript.ru/x15.1.html#x15.1.1

Tim 07.08.2013 03:32

к чему это? с какого места читать?

Цитата:

глобальных переменных в javascript на самом деле нет
ну вы совсем меня уже за новичка держите :)

Угумс 07.08.2013 07:18

Добрый день, спасибо всем кто мне помогает без вас я бы ничего не сделала. :thanks:
prompt работает без проблем, но у меня есть еще один вопросик:help: не подскажите как можно сделать что бы например выводилась только самая маленькая связь и заодно считала сколько друзей их разделяет?

Например программка выводит:
Ищем связь между "Pascal" и "Kevin".

Pascal -> Noah -> Mathilde -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Julie -> Roger -> Sarah -> Kevin

а нужно, что бы выводила:
Pascal -> Noah -> Mathilde -> Kevin
Pascal и Kevin разделены двумя друзьями

Если кто знает как это делается подскажите пожалуйста очень нужно:(

Tim 07.08.2013 07:54

Цитата:

выводилась только самая маленькая связь
Дзен-трансгуманист приводил модифицированный в соответствии с волновым алгоритмом скрипт. Он, если не ошибаюсь, как раз это и делает.

Цитата:

и заодно считала сколько друзей их разделяет
foundPath.join(' -> ') - тут мы склеиваем цепочку друзей, те массив
а свойство length - это его длина, т.е. кол-во друзей в цепочке

и да, советую изучить как работает код, иначе это палево

Угумс 07.08.2013 19:27

[quote=Tim;266202]Дзен-трансгуманист приводил модифицированный в соответствии с волновым алгоритмом скрипт. Он, если не ошибаюсь, как раз это и делает.

Боюсь, что нужно с рекурсией как Вы сделали
if (friend !== person1 && friend !== person2 && viewedPerson[friend.name] === undefined) { searchFriens(friend); // Рекурсивный вызов
но при этом чтобы одну строчку всего выводила программка:help:

bes 07.08.2013 20:59

Цитата:

Сообщение от Tim
к чему это? с какого места читать?

это к тому, что приведённая ниже цитата была оттуда

Цитата:

Сообщение от Tim
ну вы совсем меня уже за новичка держите

я лишь указал на противоречие в двух разных источниках одного не малоизвестного автора ;)

хотя-я ... хм ... неиспользование возможности "Цитата выделенного" при дате регистрации 4-годичной давности заставляет задуматься :)

Tim 08.08.2013 04:36

Цитата:

я лишь указал на противоречие в двух разных источниках одного не малоизвестного автора
Я тоже всегда называю их глобальными переменными ибо к ним можно обратиться не упоминая объект в котором они находятся. Но всегда помню что это не переменные.

Цитата:

при дате регистрации 4-годичной давности заставляет задуматься
Я больше забочусь о том что сам о себе думаю. Но всё равно спасибо. Приятно знать что о тебе кто то думает. :)

bes 08.08.2013 19:39

Цитата:

Сообщение от Tim
Я больше забочусь о том что сам о себе думаю. Но всё равно спасибо. Приятно знать что о тебе кто то думает.

вона куда тебя твоя фантазия понесла, её полёт становится всё более непредсказуемым :)

Tim 09.08.2013 08:55

Цитата:

её полёт становится всё более непредсказуемым
Надеюсь ты прав. Мне это сейчас не лишним будет.

Tim 09.08.2013 08:58

bes,
Расскажи свою версию тогда. О чём ты там задумался.

bes 09.08.2013 20:14

Цитата:

Сообщение от Tim
bes,
Расскажи свою версию тогда. О чём ты там задумался.

контекст был такой:

ты говоришь
Цитата:

Сообщение от Tim
ну вы совсем меня уже за новичка держите

я, судя по тому, что ты не используешь возможность "цитата выделенного" (то есть очевидно ты выделяешь текст, копируешь его, вставляешь в область ввода, затем обрамляешь bb-тегами quote (как минимум, 4 действия, если, конечно, не переписываешь это всё вручную :haha: ), когда можно было выделить и нажать "цитата выделенного" (2 действия) ) отвечаю
Цитата:

Сообщение от bes
хотя-я ... хм ... неиспользование возможности "Цитата выделенного" при дате регистрации 4-годичной давности заставляет задуматься

это означает, что я задумался, что для не новичка ты выполняешь слишком много действий по созданию цитат, хотя вроде как утверждаешь, что не новичок (на такие мелочи вроде как жалко своего времени)

на что ты отвечаешь
Цитата:

Сообщение от Tim
Приятно знать что о тебе кто то думает

то есть, если учесть, что ты понял контекст (очевидно, что это было не так), начинаешь фантазировать о любви к ближнему своему, вот и вся история о задумывании

как сказал один русский богатырь в не малоизвестном мультике: "я понятно объясняю?" :)

Tim 09.08.2013 21:43

bes,
Ну так объясняй чего хочешь яснее. А то троллишь меня несколько дней уже. То undefined не работает у тебя, то ещё чего.

Цитата:

я, судя по тому, что ты не используешь возможность "цитата выделенного"
Да, не использую и не буду. Привык так с самого начала. Я даже не задумываюсь над этим, всё на автомате.

bes 09.08.2013 21:49

Цитата:

Сообщение от Tim
Ну так объясняй чего хочешь яснее. А то троллишь меня несколько дней уже. То undefined не работает у тебя, то ещё чего.

ну опять ты фантазируешь, где это у меня не работал undefined
Цитата:

Сообщение от bes
я лишь указал на противоречие в двух разных источниках одного не малоизвестного автора ;)


Цитата:

Сообщение от Tim
Да, не использую и не буду. Привык так с самого начала. Я даже не задумываюсь над этим, всё на автомате.

ну давай на этом и завершим наш диалог, чё воду переливать из пустого в порожнее

Tim 09.08.2013 22:05

Цитата:

ну давай на этом и завершим наш диалог
true

bes 09.08.2013 22:10

Цитата:

Сообщение от Tim
true

ну почти всё :)
хочется ещё ответить на это
Цитата:

Сообщение от Tim
Привык так с самого начала.

привычка не самый лучший друг в этой области ;)

Tim 10.08.2013 00:12

возможно

Tim 10.08.2013 00:17

Я забываю про эту хрень. Даже не понял про что ты сначала. Так что иногда легче оставить привычки чем переучиваться, тем более что профита не так много.

bes 10.08.2013 10:44

Цитата:

Сообщение от Tim
Так что иногда легче оставить привычки чем переучиваться, тем более что профита не так много.

профит в том, что сразу становится понятно с кем ты разговариваешь (на чью реплику отвечаешь) + сообщения бывает удаляют, а цитата с указанием чья остаётся


Часовой пояс GMT +3, время: 08:30.