Rassemblez la poubelle

9

Vous regardez une avenue, et quelqu'un a laissé la poubelle! Vous devez écrire un programme pour aider à résoudre le problème, en mettant la corbeille dans des poubelles.

La tâche

L'avenue est constituée d'une chaîne de caractères ASCII imprimables, par exemple:

[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

Certains des crochets ici sont inégalés; ce ne sont que des leurres. Ce qui nous intéresse, ce sont les jeux de supports assortis.

Une poubelle est une chaîne commençant par [et se terminant par ], et avec des crochets et des parenthèses correspondant en interne. Par exemple, []et [[](dust)[]]sont des poubelles dans la chaîne ci-dessus.

Un sac poubelle est une chaîne commençant par (et se terminant par ), et avec des parenthèses et des parenthèses correspondant en interne. Par exemple, (dust)est un sac poubelle dans la chaîne ci-dessus.

Il est possible que certains sacs à ordures soient déjà dans des poubelles. Cependant, au moins un aura été laissé de côté, et nous devons déplacer les sacs poubelles afin qu'ils soient tous à l'intérieur des poubelles. Plus précisément, pour chaque sac poubelle qui n'est pas actuellement à l'intérieur d'une poubelle (c'est-à-dire une sous-chaîne de cette poubelle), nous devons le supprimer de son emplacement actuel dans la chaîne et l'insérer dans un emplacement qui se trouve à l'intérieur d'une poubelle .

Il y a une règle supplémentaire ici. Parce que nous ne voulons pas dépenser trop d'argent pour les ramasseurs d'ordures, et que leur itinéraire les mène le long de l'avenue de droite à gauche, nous voulons déplacer chaque sac poubelle vers la gauche (critère le plus important, en supposant que nous devons le déplacer à tous) et la distance la plus courte possible (tant qu'elle est déplacée vers la gauche). Ainsi, par exemple, la seule sortie correcte pour

[can1](bag)[can2]

est

[can1(bag)][can2]

(en déplaçant le sac d'un seul caractère vers la gauche). De plus, les sacs doivent rester dans le même ordre relatif:

[can](bag1)(bag2)

doit devenir

[can(bag1)(bag2)]

(c'est-à-dire que vous ne pouvez pas mettre (bag2)à gauche de (bag1).)

Clarifications

  • Il n'y aura pas de sacs poubelle à gauche de la poubelle la plus à gauche; il sera toujours possible de mettre toutes les poubelles en le déplaçant vers la gauche.
  • Il y aura toujours au moins un sac à déplacer. Il pourrait y en avoir plus d'un.
  • Il n'y aura jamais de poubelle à l'intérieur d'un sac poubelle (les boîtes sont trop précieuses pour être jetées).
  • Si un sac est déjà à l'intérieur d'une boîte, laissez-le tranquille.
  • Il est normal que l'entrée et la sortie diffèrent dans les espaces de fin (y compris les retours à la ligne).

Exemples:

  • Contribution: [[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

    Production: [[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence

  • Contribution: []] (unusable) door (filthy) car

    Production : [(unusable)(filthy)]] door car

Ewan Delanoy
la source
5
Chers électeurs, pourriez-vous expliquer ce que vous trouvez peu clair? La publication va être difficile à corriger sans un guide explicite sur ce qui ne va pas.
@ ais523 Je ne comprends pas quelle est la tâche. Certes, cela pourrait être parce que je suis fatigué, mais le libellé actuel n'a pas beaucoup de sens
Blue
1
Fondamentalement, pour chaque sous-chaîne qui se trouve entre parenthèses mais pas à l'intérieur des crochets, déplacez-la vers la gauche jusqu'à ce qu'elle soit également à l'intérieur des crochets.
Parce que ce problème se ferme et se rouvre à plusieurs reprises, je l'ai modifié avec ma compréhension du problème. J'espère que je n'ai pas changé le problème dans le processus.
@ ais523 C'est très bien pour moi. Merci beaucoup pour toute votre retouche.
Ewan Delanoy

Réponses:

3

JavaScript (ES6), 263 228 209 205 184 177 177 173 162 octets

Toute aide avec le code / les expressions régulières est grandement appréciée.

f=s=>s.match(t=/\[\[][\w()]*\[]]|\[]/g,g=/\([\w()]*\)/g,i=0,u=s.split(t).filter(e=>e)).map(e=>e.substr(0,e.length-1)+u[i].match(g).join``+`]`+u[i++].replace(g,``)).join``

Une fonction anonyme; prend un Stringparamètre, set renvoie la sortie.

/\[\[][\w()]*\[]]|\[]/g correspond aux poubelles avec des sacs poubelles imbriqués, mais je ne pense pas que cela puisse vérifier les supports équilibrés dans les sacs poubelle si nécessaire.

XavCo7
la source