新しい葉をひっくり返す


19

コンピュータサイエンスの伝統では、最上部にを持ち、最下部にを持つ木が与えられます。リーフノードには番号が付いています。目標は、マークされた特別な葉を取り、-1それを上に移動して新しいルートにすることです。

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

ここに画像の説明を入力してください

特別な葉を上に回転させ、残りの木を垂れ下がらせることを想像できます。すべての枝の正しい左から右の順序を取得するために、ツリーを回転させながらツリーを保持します。

新しいツリーには、を除く元のツリーの葉がすべてあり-1ます。

入力:

葉が異なる正の整数であるツリー-1。ただし、の1つの葉を除きます。ツリーのルートには、少なくとも2つのブランチが外れます。

入力は、ネストされたリスト[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周りには、よりも2つのブラケットがありますが、31層だけ深く描かれています。
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バイトを節約します。
デニス

1
@デニスありがとう。しかし、それが関数である場合、余分なが必要になると思います[
jimmy23013

6

Pyth、26 25 24 23バイト

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

デモンストレーション。 テストハーネス。

これは、yネストされたPythリストを入力として受け取る関数を定義します。

この再帰関数では、3項、、?およびtry- 例外関数のために、3つのケースを調査する必要があります.x。関数では、入力はbです。

最初のケースは、}\-`Jtb真実であるときに発生します。これは、-の文字列表現にが存在するかどうかをテストします。これtbはの「テール」でbb最初の要素以外はすべてです。tbもに保存されJます。を除くすべてのラベルは正であるため-1-1リストの最初の要素にない場合にのみtrue になります。

この場合、でb1 ずつ循環的に右シフトし.>b1、関数を再帰的に呼び出します。これにより-1、リストの先頭(最初の要素)として含まれている要素を使用して、次のステップに進むことが保証されます。

次の2つのケースでは、上記は偽であるため-1、リストの先頭にあります。

2番目の場合、ahbJエラーをスローしません。hb整数の場合にのみエラーがスローされます。これが当てはまらない場合hbは、リストであり、-1葉がルートに近づくようにツリーを回転させる必要があります。ahbJ追加することによってこれを達成するJの終わりに単一の要素としてhb効果からツリーのルートを移動bしますhb

3番目の最後のケースでは、エラーがスローされます。したがって、hb単一の要素です。最初のケースのテストのため、でhbなければなりません-1。したがって、残りのb、つまりJリストにラップされたを返すことができます]J

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.