Перевернуть новый лист

19

Вам дано дерево, которое в традициях информатики имеет корень вверху и листья внизу. Узлы листа обозначены цифрами. Ваша цель - взять специальный лист с пометкой -1и переместить его вверх, чтобы он стал новым корнем.

[3, [[16], -1], [4]] --> [[[[4], 3], [16]]]

введите описание изображения здесь

Вы можете представить, как повернуть специальный лист наверх и позволить ему повиснуть на дереве. Держите дерево в плоскости, поворачивая его, чтобы получить правильный порядок слева направо всех ветвей.

У нового дерева есть все листья исходного дерева, кроме -1.

Входные данные:

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

Вход задается в виде вложенного списка , как [3, [[16], -1], [[4]]]и его строковое представление. Разделители являются необязательными и зависят от вас, но соседние числа должны быть разделены.

Выход:

Выход или распечатать перевернутое дерево в том же формате, что и ваш вклад. Порядок записей в списке должен быть правильным. Модификация на месте в порядке.

Если ваш ввод / вывод относится к типу данных, он должен по умолчанию печататься в требуемом формате. Встроенные модули, которые в основном делают задачу для вас не допускаются.

Тестовые случаи:

>> [3, [[16], -1], [4]]
[[[[4], 3], [16]]]

>> [2, -1]
[[2]]

>> [44, -1, 12]
[[12, 44]]

>> [[[[-1]]], [[[[4]]]]]
[[[[[[[[[4]]]]]]]]]

>> [[1, 2, 3], [4, -1, 6], [7, 8, 9]]
[[6, [[7, 8, 9], [1, 2, 3]], 4]]

>> [9, [8, [7, [6, -1, 4], 3], 2], 1]
[[4, [3, [2, [1, 9], 8], 7], 6]]
XNOR
источник
1
Пример не совпадает с диаграммой. 4Имеет еще две скобки вокруг него , чем 3, но только 1 схематически слой глубже.
Исаак

Ответы:

7

CJam, 24 24 22 байта

l~{):T]{s$}$(+T1+}gW<p

Попробуйте онлайн .

Спасибо Денису за удаление 2 байтов.

объяснение

l~          e# Read the input.
{           e# Do:
    ):T     e# Save the last item to T.
    ]       e# Wrap everything else (as an array) and the last item into an array,
    {s$}$   e#   where the one with -1 (having "-" if stringified) is the first item.
    (+      e# Insert the second array into the first array as the first item,
            e#   or just move the -1 to the end if the first item is already -1.
    T1+     e# Check if the array before this iteration ended with -1.
}g          e# Continue the loop if it did't.
W<p         e# Remove the -1 and print.
jimmy23013
источник
Вы можете использовать {s$}$с обратным порядком сортировки. Кроме того , анонимная функция будет сохранить один байт по полной программе.
Деннис
1
@Dennis Спасибо. Но если это функция, думаю, мне понадобится дополнительная [.
jimmy23013
6

Pyth, 26 25 24 23 байта

L?y.>b1}\-`Jtb.xyahbJ]J

Демонстрация. Тест Жгут.

Это определяет функцию, yкоторая принимает вложенный список Pyth в качестве входных данных.

Есть три случая , чтобы исследовать в этой рекурсивной функции, в связи с тройным, ?, и попробовать - за исключением функции .x. В функции, вход b.

Первый случай возникает, когда }\-`Jtbправдив. Это тесты , имеются ли -в строковом представлении tb, в «хвосте» b, который все , bкроме первого элемента. tbтакже хранится в J. Поскольку все метки положительны , за исключением -1, это будет справедливо , если и только если -1не в первом элементе списка.

В этом случае мы циклически сдвигаемся вправо bна 1 с .>b1, а затем вызываем функцию рекурсивно. Это гарантирует , что мы будем переходить к следующему шагу с элементом , содержащий в -1качестве главного (первый элемент) списка.

В следующих двух случаях вышеупомянутое ложно, так же -1как и в начале списка.

Во втором случае ahbJне выдает ошибку. Ошибка будет выдана, если и только если hbявляется целым числом. Если это не так, то hbсписок, и нам нужно повернуть дерево так , что -1лист ближе к корню. ahbJЭто достигается путем добавления Jв конце одного элемента hb, который эффективно перемещает корень дерева из bв hb.

В третьем и последнем случае выдается ошибка. Таким образом, hbэто один элемент. Из-за теста в первом случае, hbдолжно быть -1. Таким образом, мы можем вернуть оставшуюся часть b, а именно J, завернутый в списке, а именно ]J.

isaacg
источник