Кучи , также известные как приоритетная очередь, это абстрактный тип данных. Концептуально это двоичное дерево, в котором дочерние элементы каждого узла меньше или равны самому узлу. (Предполагая, что это максимальная куча.) Когда элемент перемещается или выталкивается, куча перестраивается, так что самый большой элемент - следующий. Его легко реализовать в виде дерева или массива.
Ваша задача, если вы решите принять ее, - определить, является ли массив допустимой кучей. Массив находится в форме кучи, если дочерние элементы каждого элемента меньше или равны самому элементу. Возьмите следующий массив в качестве примера:
[90, 15, 10, 7, 12, 2]
Действительно, это двоичное дерево, организованное в виде массива. Это потому, что у каждого элемента есть дети. 90 имеет двоих детей, 15 и 10 лет.
15, 10,
[(90), 7, 12, 2]
15 также имеет детей, 7 и 12:
7, 12,
[90, (15), 10, 2]
10 имеет детей:
2
[90, 15, (10), 7, 12, ]
и следующим элементом также будет ребенок 10 лет, за исключением того, что там нет места. 7, 12 и 2 также имели бы потомков, если бы массив был достаточно длинным. Вот еще один пример кучи:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
И вот визуализация дерева, которое делает предыдущий массив:
На случай, если этого недостаточно, вот явная формула для получения дочерних элементов i-го элемента.
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Вы должны принять непустой массив в качестве входных данных и вывести истинное значение, если массив находится в порядке кучи, и ложное значение в противном случае. Это может быть куча с 0 индексами или куча с 1 индексом, если вы указываете, какой формат ожидает ваша программа / функция. Вы можете предположить, что все массивы будут содержать только положительные целые числа. Вы не можете использовать какие-либо кучи. Это включает, но не ограничивается
- Функции, которые определяют, находится ли массив в форме кучи
- Функции, которые преобразуют массив в кучу или в форму кучи
- Функции, которые принимают массив в качестве входных данных и возвращают структуру данных кучи
Вы можете использовать этот скрипт Python, чтобы проверить, находится ли массив в форме кучи или нет (0 проиндексировано):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
Тест IO:
Все эти входные данные должны возвращать True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
И все эти входные данные должны возвращать False:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
Как обычно, это код-гольф, поэтому применяются стандартные лазейки и выигрывает самый короткий ответ в байтах!
[3, 2, 1, 1]
?Ответы:
Желе,
1195 байт4 байта удалены благодаря Деннису!
Попробуй это здесь.
объяснение
источник
JavaScript (ES6),
3430 байтИзменить: Исправление моего кода для уточнения спецификации стоит 1 байт, так что спасибо @ edc65 за сохранение 4 байта.
источник
[93, 15, 87, 7, 15, 5]
и 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 байта
или
источник
J, 24 байта
объяснение
источник
MATL ,
1312 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
Массив является правдивым, если он не пуст и все его записи ненулевые. В противном случае это ложь. Вот несколько примеров .
объяснение
источник
Python 2, 45 байт
Выходы 0 для Falsy, ненулевые для Truthy.
Проверяет, что последний элемент меньше или равен своему родительскому элементу в индексе
len(l)/2-1
. Затем рекурсивно проверяется, что то же самое имеет значение True с удаленным последним элементом списка, и так далее, пока список не станет пустым.48 байтов:
Проверяет, что в каждом индексе
i
элемент является не более чем его родительским в индексе(i-1)/2
. Разделение по этажам дает 0, если это не так.Выполнение базового варианта так же
i/len(l)or
дает одинаковую длину. Сначала я пробовал архивировать, но получил более длинный код (57 байт).источник
R
97 8882 байтаНадеюсь, я правильно понял. Теперь посмотрим, смогу ли я избавиться от еще нескольких байтов. Бросил rbind и положил в саппли и правильно разбирался с вектором на основе 1.
Реализовано как безымянная функция
С несколькими из тестовых случаев
источник
seq(Y)
вместо1:length(Y)
.CJam,
19161312 байтГольф от 3 байтов благодаря Деннису.
Попробуй это здесь.
источник
Pyth, 8 байт
Попробуйте онлайн
источник
Сетчатка , 51 байт
Попробуйте онлайн!
Принимает разделенный пробелами список чисел в качестве входных данных. Выходы
1
/0
для правдивых / ложныхисточник
C ++ 14,
134105 байтТребуется
c
контейнер для поддержки.operator[](int)
и.size()
, какstd::vector<int>
.Ungolfed:
Может быть меньше, если допустимы истина
0
и ложь1
.источник
R, 72 байта
Немного другой подход от другого R ответа .
Считывает входные данные из стандартного ввода, создает вектор всех пар сравнения, вычитает их друг из друга и проверяет, является ли результат отрицательным числом или нулем.
объяснение
Прочитать ввод от stdin:
Создайте наши пары. Мы создаем индексы
1...N
(гдеN
длинаx
) для родительских узлов. Мы принимаем это дважды, так как каждый родитель имеет (максимально) двух детей. Мы также берем детей,(1...N)*2
и(1...N)*2+1
. Для индексов, превышающих длинуx
, R возвращаетNA
«недоступно». Для ввода90 15 10 7 12 2
этот код дает нам90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.В этом векторе пар каждый элемент имеет своего партнера на расстоянии
N*2
. Например, партнер позиции 1 находится в позиции 12 (6 * 2). Мы используем,diff
чтобы рассчитать разницу между этими парами, указавlag=N*2
для сравнения предметов с их правильными партнерами. Любые операции надNA
элементами просто возвращаютсяNA
.Наконец, мы проверяем, что все эти возвращаемые значения меньше
1
(то есть, что первое число, родитель, был больше, чем второе число, дочерний), исключаяNA
значения из рассмотрения.источник
На самом деле , 16 байтов
Этот ответ в значительной степени основан на ответе Jelly на jimmy23013 . Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing
источник