Tourner une nouvelle page

19

On vous donne un arbre qui, dans la tradition informatique, a la racine en haut et les feuilles en bas. Les nœuds foliaires sont étiquetés avec des nombres. Votre objectif est de prendre la feuille spéciale marquée -1et de la déplacer pour devenir la nouvelle racine.

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

entrez la description de l'image ici

Vous pouvez imaginer faire tourner la feuille spéciale vers le haut et laisser le reste de l'arbre en suspendre. Garder l'arbre dans le plan tout en le faisant tourner pour obtenir l'ordre correct de gauche à droite de toutes les branches.

Le nouvel arbre a toutes les feuilles de l'arbre d'origine à l'exception de -1.

Contribution:

Un arbre dont les feuilles sont des entiers positifs distincts, à l'exception d'une feuille de -1. La racine de l'arbre aura au moins deux branches qui se détacheront.

L'entrée est donnée sous la forme d'une liste imbriquée [3, [[16], -1], [[4]]]ou de sa représentation sous forme de chaîne. Les délimiteurs sont facultatifs et dépendent de vous, mais les numéros adjacents doivent être séparés.

Production:

Sortez ou imprimez l'arborescence inversée dans le même format que votre entrée. L'ordre des entrées de la liste doit être correct. La modification sur place est très bien.

Si votre entrée / sortie est un type de données, ce doit être celui qui imprime par défaut au format requis. Les éléments intégrés qui font essentiellement la tâche pour vous ne sont pas autorisés.

Cas de test:

>> [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]]
xnor
la source
1
L'exemple ne semble pas correspondre au diagramme. Le 4a deux supports supplémentaires autour de lui 3, mais n'est représenté que 1 couche plus profondément.
isaacg

Réponses:

7

CJam, 24 24 22 octets

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

Essayez-le en ligne .

Merci Dennis d'avoir supprimé 2 octets.

Explication

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.
jimmy23013
la source
Vous pouvez utiliser {s$}$, avec l'ordre de tri inversé. En outre, une fonction anonyme permettrait d'économiser un octet sur un programme complet.
Dennis
1
@Dennis Merci. Mais s'il s'agit d'une fonction, je suppose que j'aurai besoin d'un supplément [.
jimmy23013
6

Pyth, 26 25 24 23 octets

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

Manifestation. Harnais de test.

Ceci définit une fonction, yqui prend en entrée une liste Pyth imbriquée.

Il y a trois cas à explorer dans cette fonction récursive, en raison du ternaire, ?et l'essai - sauf fonction .x. Dans la fonction, l'entrée est b.

Le premier cas se produit quand }\-`Jtbest véridique. Ceci teste s'il y a une -représentation de chaîne dans tb, la "queue" de b, qui est tout bsauf son premier élément. tbest également stocké dans J. Puisque toutes les étiquettes sont positives à l'exception de -1, cela sera vrai si et seulement si le -1n'est pas dans le premier élément de la liste.

Dans ce cas, nous décalons cycliquement vers la droite bde 1 avec .>b1, puis appelons la fonction récursivement. Cela garantit que nous passerons à l'étape suivante avec l'élément contenant -1comme tête (premier élément) de la liste.

Dans les deux cas suivants, ce qui précède est faux, il en -1est de même en tête de liste.

Dans le second cas, ahbJne renvoie pas d'erreur. Une erreur sera levée si et seulement si hbest un entier. Si ce n'est pas le cas, alors hbc'est une liste, et nous devons faire pivoter l'arbre afin que la -1feuille soit plus proche de la racine. ahbJaccomplit cela en ajoutant Jun seul élément à la fin de hb, ce qui déplace efficacement la racine de l'arbre de bà hb.

Dans le troisième et dernier cas, une erreur est levée. Ainsi, hbest un élément unique. En raison du test dans le premier cas, hbdoit être -1. Ainsi, nous pouvons retourner le reste de b, à savoir J, enveloppé dans une liste, à savoir ]J.

isaacg
la source