type ExtractGenerics<T extends readonly unknown[]> = T extends readonly []
? []
: T extends readonly [G<infer V>, ...infer Next]
? [V, ...ExtractGenerics<Next>]
: never;
function unwrap<C extends readonly G<unknown>[]>(containers: C) {
return containers.map(container => container.value) as ExtractGenerics<C>
}
const channelId = channel.id;
const guildId = channel.guild?.id;
const adapterCreator = channel.guild?.voiceAdapterCreator;
if (!channelId || !guildId || !adapterCreator) {
message.channel.send(`Please log into the voice channel`);
return;
}
if (command === 'join') {
const connection = joinVoiceChannel({
channelId,
guildId,
adapterCreator
});
message.channel.send(`Already here !`);
}
if (error.value && 'data' in error.value) {
// ...
}
Интересует @Injectable()
str.replace(/\s+/g, ' ').trim();
return str.replace(/\s+/g, ' ').trim();
use std::rc::{Rc, Weak};
pub struct Node {
parent: Weak<Node>,
data: u32,
pub left: Option<Rc<Node>>,
pub right: Option<Rc<Node>>,
}
#[derive(Debug)]
pub struct SetChildError;
impl Node {
pub fn new(data: u32) -> Self {
Self {
parent: Weak::new(),
data,
left: None,
right: None,
}
}
pub fn set_left(self: &mut Rc<Self>, mut child: Rc<Self>) -> Result<(), SetChildError> {
let child_mut = Rc::get_mut(&mut child).ok_or(SetChildError)?;
child_mut.parent = Rc::downgrade(self);
let self_mut = Rc::get_mut(self).ok_or(SetChildError)?;
self_mut.left = Some(child);
Ok(())
}
}
// Сохраняем исходные индексы и сортируем по высоте по убыванию
const preparedData = data
.map((e, i) => ({i, e}))
.sort((a, b) => b.e.height - a.e.height);
for (const el of preparedData) {
const { height } = el.e;
// тут никогда не вернет -1, так как мы ищем элемент который точно есть в массиве - минимальный
const index = columnHeight.indexOf(Math.min(...columnHeight));
// обновляем данные массивов по выбранному индексу
columnHeight[index] += height;
columns[index].push(el);
}
// нормализуем columns
for (let i = 0; i < columns.length; ++i) {
// восстановим исходный порядок, отсортировав по сохраненному индексу по возрастанию
columns[i].sort((a, b) => a.i - b.i);
// избавимся от сохраненных индексов, оставив только исходные объекты
columns[i] = columns[i].map(({ e }) => e);
}
1)curr = dummy = ListNode()
что это за конструкция. ну вернее я знаю, что это объект класса, но зачем сразу 2 переменные? сделал вот так
dummy = ListNode()
и не работает
Через if выбрали из какого из 2 списков будем вставлять ноду в наш список и добавили ее туда, потом запомнили ссылку на следующую ноду выбранного спискаобъясните пожалуйста вот эти 2 строчкиif l1.val >l2.val: curr.next = l2 l2 = l2.next
curr.next = l2 l2 = l2.next
3) Почему возвращаем именно dummy и next?В dummy у нас начальная нода нашего списка, но она опорная, мы ее сами создали, а не взяли из исходных списков, а вот следующая - уже нода одного из списков.
return dummy.next