Yeni bir sayfa açmak


19

Bilgisayar bilimi geleneğinde vardır bir ağaç, verilen konum kök üst ve en yaprakların alt kısmında. Yaprak düğümleri sayılarla etiketlenmiştir. Amacınız işaretli özel yaprağı almak -1ve yeni kök olarak yukarı taşımaktır.

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

resim açıklamasını buraya girin

Özel yaprağı tepeye döndürdüğünüzü ve ağacın geri kalanının ondan sarktığını hayal edebilirsiniz. Tüm dalların doğru soldan sağa sırasını elde etmek için ağacı döndürürken düzlemde tutmak.

Yeni ağaç, orijinal ağacın tüm yaprakları dışında -1.

Giriş:

Bir yaprağı hariç, yaprakları belirgin pozitif tamsayılar olan bir ağaç -1. Ağacın kökünde en az iki dal çıkacaktır.

Giriş, [3, [[16], -1], [[4]]]dize temsili gibi iç içe bir liste olarak verilir . Sınırlayıcılar isteğe bağlıdır ve size bağlıdır, ancak bitişik sayıların ayrılması gerekir.

Çıktı:

Ters çevrilmiş ağacı girişinizle aynı formatta yazdırın veya yazdırın. Liste girişlerinin sırası doğru olmalıdır. Yerinde değişiklik yapılması iyidir.

Giriş / çıktınız bir veri tipiyse, varsayılan olarak gerekli formatta yazdırılmış olmalıdır. Temel olarak görevi sizin için yapan yerleşiklere izin verilmez.

Test senaryoları:

>> [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
Örnek şemaya uygun görünmüyor. 4Daha onun etrafında iki parantez vardır 3, ancak yalnızca 1 kat daha derin diyagram olarak.
isaacg

Yanıtlar:


7

CJam, 24 24 22 bayt

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

Çevrimiçi deneyin .

Dennis 2 bayt ayırdığınız için teşekkürler.

açıklama

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$}$Sıralama düzeni ters çevrilmiş şekilde kullanabilirsiniz . Ayrıca, anonim bir işlev bir baytı tam bir programa kaydeder.
Dennis

1
@Dennis Teşekkürler. Ama eğer bu bir işlevse, sanırım bir ekstraa ihtiyacım olacak [.
jimmy23013

6

Pyth, 26 25 24 23 bayt

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

Gösteri. Test Donanımı.

Bu, yiç içe bir Pyth listesini girdi olarak alan bir işlevi tanımlar .

Üçlü ?ve try - hariç fonksiyonu nedeniyle bu özyinelemeli işlevde keşfedilecek üç durum vardır .x. Fonksiyonda, giriş b.

İlk durum doğru olduğunda ortaya çıkar }\-`Jtb. Bu , ilk öğesinin dışında tümü olan "kuyruğunun" -dize olarak temsil edilip edilmediğini test eder . içinde de saklanır . Bunun dışındaki tüm etiketler pozitif olduğundan , bu yalnızca listenin ilk öğesinde değilse doğru olur .tbbbtbJ-1-1

Bu durumda, b1 ile döngüsel olarak sağa kaydırırız .>b1ve sonra işlevi özyinelemeli olarak çağırırız. Bu -1, listenin başı (ilk öğe) olarak içeren öğeyle bir sonraki adıma geçmemizi sağlar .

Sonraki iki durumda, yukarıdakiler sahtedir, bu yüzden -1listenin başında yer almaktadır.

İkinci durumda, ahbJbir hata atmaz. Bir hata yalnızca ve hbbir tam sayı ise atılır . Durum böyle değilse, o hbzaman bir listedir ve ağacı -1kökün daha yakın olacak şekilde döndürmemiz gerekir . ahbJekleyerek gerçekleştirir Jsonunda tek bir öğe olarak hbetkili bir ağacın kök hareket, biçin hb.

Üçüncü ve son durumda, bir hata atılır. Böylece, hbtek bir elementtir. Çünkü test ilk durumda hbolmalı -1. Böylece, geri kalan döndürebilir b, yani, Jyani, bir listede, sarılmış ]J.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.