Nhìn qua mặt khác của sự việc


19

Bạn được tặng một cái cây, theo truyền thống khoa học máy tính, có gốc ở đỉnh và ở phía dưới. Các nút lá được dán nhãn với số. Mục tiêu của bạn là lấy chiếc lá đặc biệt được đánh dấu -1và di chuyển nó lên để trở thành gốc mới.

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

nhập mô tả hình ảnh ở đây

Bạn có thể tưởng tượng việc xoay chiếc lá đặc biệt lên đỉnh và để phần còn lại của cây treo trên đó. Giữ cây trong mặt phẳng trong khi xoay nó để có được thứ tự từ trái sang phải của tất cả các nhánh.

Cây mới có tất cả các lá của cây ban đầu trừ -1.

Đầu vào:

Một cây có lá là số nguyên dương khác biệt, ngoại trừ một lá của -1. Rễ cây sẽ có ít nhất hai nhánh mọc ra.

Đầu vào được đưa ra dưới dạng một danh sách lồng nhau như [3, [[16], -1], [[4]]]hoặc biểu diễn chuỗi của nó. Dấu phân cách là tùy chọn và tùy thuộc vào bạn, nhưng các số liền kề cần được tách ra.

Đầu ra:

Xuất hoặc in cây lật theo cùng định dạng với đầu vào của bạn. Thứ tự của các mục danh sách phải chính xác. Sửa đổi tại chỗ là tốt.

Nếu đầu vào / đầu ra của bạn là một kiểu dữ liệu, thì nó phải là một kiểu in theo định dạng bắt buộc theo mặc định. Xây dựng mà về cơ bản làm nhiệm vụ cho bạn không được phép.

Các trường hợp thử nghiệm:

>> [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
Ví dụ này dường như không phù hợp với sơ đồ. Có 4hai dấu ngoặc quanh nó hơn 3, nhưng chỉ được sơ đồ sâu hơn 1 lớp.
isaacg

Câu trả lời:


7

CJam, 24 24 22 byte

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

Hãy thử trực tuyến .

Cảm ơn Dennis vì đã xóa 2 byte.

Giải trình

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.

Bạn có thể sử dụng {s$}$, với thứ tự sắp xếp đảo ngược. Ngoài ra, một hàm ẩn danh sẽ lưu một byte trên toàn bộ chương trình.
Dennis

1
@Dennis Cảm ơn. Nhưng nếu đó là một chức năng, tôi đoán tôi sẽ cần thêm [.
jimmy23013

6

Pyth, 26 25 24 23 byte

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

Trình diễn. Khai thác thử nghiệm.

Cái này định nghĩa một hàm, ylấy danh sách Pyth lồng nhau làm đầu vào.

Có ba trường hợp để khám phá trong hàm đệ quy này, do ternary ?, và thử - ngoại trừ chức năng , .x. Trong chức năng, đầu vào là b.

Trường hợp đầu tiên xảy ra khi sự }\-`Jtbthật. Điều này kiểm tra xem có một -đại diện trong chuỗi tb, "đuôi" của b, tất cả bngoại trừ phần tử đầu tiên của nó hay không. tbcũng được lưu trữ trong J. Vì tất cả các nhãn đều dương ngoại trừ -1, điều này sẽ đúng nếu và chỉ khi phần tử -1này không nằm trong phần tử đầu tiên của danh sách.

Trong trường hợp này, chúng tôi dịch chuyển đúng theo chu kỳ bbằng 1 với .>b1, và sau đó gọi hàm đệ quy. Điều này đảm bảo rằng chúng tôi sẽ chuyển sang bước tiếp theo với phần tử chứa -1phần đầu (phần tử đầu tiên) của danh sách.

Trong hai trường hợp tiếp theo, ở trên là giả mạo, vì vậy -1là trong đầu của danh sách.

Trong trường hợp thứ hai, ahbJkhông ném lỗi. Một lỗi sẽ được ném khi và chỉ khi hblà một số nguyên. Nếu đây không phải là trường hợp, thì đó hblà một danh sách, và chúng ta cần xoay cây sao cho -1lá gần gốc hơn. ahbJthực hiện điều này bằng cách nối thêm Jthành một phần tử duy nhất ở cuối hb, giúp di chuyển hiệu quả gốc của cây từ bđến hb.

Trong trường hợp thứ ba và cuối cùng, một lỗi được đưa ra. Như vậy, hblà một yếu tố duy nhất. Bởi vì thử nghiệm trong trường hợp đầu tiên, hbphải được -1. Vì vậy, chúng ta có thể trả về phần còn lại của b, cụ thể J, được gói trong một danh sách, cụ thể là ]J.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.