改过自新


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 2015年

Answers:


7

CJam,24 24 22字节

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

在线尝试

感谢Dennis删除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 2015年

6

Pyth,26 25 24 23字节

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

示范。 测试线束。

这定义了一个函数,y该函数将嵌套的Pyth列表作为输入。

由于三元?函数和尝试除外函数,因此在此递归函数中有3种情况需要研究.x。在函数中,输入为b

第一种情况发生时}\-`Jtb为真。这测试-在字符串表示中是否存在tb,其的“ tail” 除其第一个元素外b全部为btb也存储在中J。由于除了-1,只有当且仅当-1不在列表的第一个元素中。

在这种情况下,我们循环右移b1.>b1,然后递归调用该函数。这样可以确保我们将包含-1作为列表的头(第一个元素)进行。

在接下来的两种情况下,以上都是虚假的,所以 -1位于列表的顶部。

在第二种情况下,ahbJ不会引发错误。当且仅当hb是整数时,才会引发错误。如果不是这种情况,hb则为一个列表,我们需要旋转树,以使-1叶更靠近根。ahbJ通过附加完成J在的末尾单个元素hb,从而有效地将树的根从b移到hb

在第三种也是最后一种情况下,将引发错误。因此,hb是一个元素。由于在第一种情况下的测试,hb必须为-1。因此,我们可以返回的休息b,即J在列表中,包裹,即]J

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.