Skip to content

Instantly share code, notes, and snippets.

@nm17
Created June 19, 2025 13:13
Show Gist options
  • Save nm17/cc4ca14cb48250e57ec6017089275868 to your computer and use it in GitHub Desktop.
Save nm17/cc4ca14cb48250e57ec6017089275868 to your computer and use it in GitHub Desktop.
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