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


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]]

1
Приклад, схоже, не співпадає з діаграмою. 4Має ще дві дужки навколо нього , ніж 3, але тільки 1 схематично шар глибше.
isaacg

Відповіді:


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.

Ви можете використовувати {s$}$, із упорядкованим порядком сортування. Також анонімна функція зберегла б один байт протягом повної програми.
Денніс

1
@ Денніс Дякую Але якщо це функція, я думаю, мені знадобиться додаткова [.
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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.