พลิกใบไม้ใหม่


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$}$โดยเรียงกลับลำดับ นอกจากนี้ฟังก์ชั่นที่ไม่ระบุชื่อจะบันทึกหนึ่งไบต์ผ่านโปรแกรมเต็มรูปแบบ
Dennis

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.