Created
June 19, 2025 13:13
-
-
Save nm17/cc4ca14cb48250e57ec6017089275868 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const tree = shuffle([ | |
{ | |
name: "Александр Сергеевич Пушкин", | |
mother: "Надежда Осиповна Ганнибал", | |
father: "Сергей Львович Пушкин" | |
}, | |
{ | |
name: "Надежда Осиповна Ганнибал", | |
mother: "Мария Алексеевна Пушкина", | |
father: "Осип Абрамович Ганнибал" | |
}, | |
{ | |
name: "Сергей Львович Пушкин", | |
mother: "Ольга Васильевна Чичерина", | |
father: "Лев Александрович Пушкин" | |
}, | |
{ | |
name: "Лев Александрович Пушкин", | |
mother: "Евдокия Ивановна Головина", | |
father: "Александр Петрович Пушкин" | |
}, | |
{ | |
name: "Ольга Васильевна Чичерина", | |
mother: "Лукерья Васильевна Приклонская", | |
father: "Василий Иванович Чичерин" | |
}, | |
{ | |
name: "Мария Алексеевна Пушкина", | |
mother: "Сарра Юрьевна Ржевская", | |
father: "Алексей Федорович Пушкин" | |
}, | |
{ | |
name: "Осип Абрамович Ганнибал", | |
mother: "Христина Матвеевна Шеберг", | |
father: "Абрам Петрович Ганнибал" | |
}, | |
]) | |
// Функция для перемешивания массива. Не трогать и не убирать! | |
function shuffle(a) { | |
let j, x, i; | |
for (i = a.length - 1; i > 0; i--) { | |
j = Math.floor(Math.random() * (i + 1)); | |
x = a[i]; | |
a[i] = a[j]; | |
a[j] = x; | |
} | |
return a; | |
} | |
// На функцию подается объект определенного формата, который представляет семейное дерево семьи. | |
// Также один из параметров - name указывает на имя которое нам нужно найти. Параметр genAmount | |
// указывает какое поколение родителей относительно человека с именем name нужно вернуть. | |
// Вы должны написать функцию, которая возвращает genAmount-поколение родителей данного | |
// человека с именем name. Промежуточные поколения родителей тоже нужно выводить, если параметр includeGenerationsAfter = true. | |
// Где genAmount: 1 = Родители, 2 = Родители родителей и т.д | |
// Порядок элементов в tree не гарантирован! | |
function getNthParents(tree, name, genAmount, includeGenerationsAfter, parentsIdx={}) { | |
if (Object.keys(parentsIdx).length === 0) { | |
for (const person of tree) { | |
parentsIdx[person.name] = { | |
"mother": person.mother, | |
"father": person.father | |
} | |
} | |
} | |
if (genAmount === 0) { | |
return [] | |
} | |
if (genAmount === 1) { | |
return [parentsIdx[name].mother, parentsIdx[name].father] | |
} | |
return getNthParents(tree, parentsIdx[name].mother, genAmount-1, includeGenerationsAfter, parentsIdx) | |
.concat(getNthParents(tree, parentsIdx[name].father, genAmount-1, includeGenerationsAfter, parentsIdx)) | |
.concat(includeGenerationsAfter ? getNthParents(tree, name, genAmount-1, includeGenerationsAfter, parentsIdx) : []) | |
} | |
// Ответ: [ 'Ольга Васильевна Чичерина', 'Лев Александрович Пушкин' ] | |
console.log( | |
getNthParents(tree, "Сергей Львович Пушкин", 1, false) | |
) | |
// Ответ: [ | |
// 'Лукерья Васильевна Приклонская', | |
// 'Василий Иванович Чичерин', | |
// 'Евдокия Ивановна Головина', | |
// 'Александр Петрович Пушкин' | |
// ] | |
console.log( | |
getNthParents(tree, "Сергей Львович Пушкин", 2, false) | |
) | |
// Ответ: [ | |
// 'Лукерья Васильевна Приклонская', | |
// 'Василий Иванович Чичерин', | |
// 'Евдокия Ивановна Головина', | |
// 'Александр Петрович Пушкин', | |
// 'Ольга Васильевна Чичерина', | |
// 'Лев Александрович Пушкин' | |
// ] | |
console.log( | |
getNthParents(tree, "Сергей Львович Пушкин", 2, true) | |
) | |
// Ответ: [ | |
// 'Сарра Юрьевна Ржевская', | |
// 'Алексей Федорович Пушкин', | |
// 'Христина Матвеевна Шеберг', | |
// 'Абрам Петрович Ганнибал', | |
// 'Лукерья Васильевна Приклонская', | |
// 'Василий Иванович Чичерин', | |
// 'Евдокия Ивановна Головина', | |
// 'Александр Петрович Пушкин' | |
// ] | |
console.log( | |
getNthParents(tree, "Александр Сергеевич Пушкин", 3, false) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment