Raccogli la spazzatura


9

Stai guardando un viale e qualcuno ha lasciato fuori la spazzatura! È necessario scrivere un programma per aiutare a risolvere il problema, inserendo il cestino nei cestino.

L'obiettivo

Il viale è costituito da una stringa di caratteri ASCII stampabili, ad esempio:

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

Alcune parentesi qui non hanno eguali; quelli sono solo esche. Ciò a cui teniamo sono i set di parentesi corrispondenti.

Un cestino è una stringa che inizia con [e termina con ]e con parentesi e parentesi abbinate internamente. Ad esempio, []e [[](dust)[]]sono pattumiere nella stringa sopra.

Un cestino è una stringa che inizia con (e termina con )e con parentesi e parentesi abbinate internamente. Ad esempio, (dust)è un cestino nella stringa sopra.

È possibile che alcuni dei sacchetti della spazzatura siano già nei bidoni della spazzatura. Tuttavia, almeno uno sarà stato escluso e dobbiamo spostare i sacchetti della spazzatura in modo che siano tutti all'interno dei bidoni della spazzatura. In particolare, per ogni cestino che non è attualmente all'interno di un cestino (ovvero una sottostringa di quel cestino), dobbiamo rimuoverlo dalla sua posizione corrente nella stringa e inserirlo invece in un posto che si trova all'interno di un cestino .

C'è una regola aggiuntiva qui. Poiché non vogliamo spendere troppi soldi per i raccoglitori di rifiuti, e il loro percorso li porta lungo il viale da destra a sinistra, vogliamo spostare ogni sacco della spazzatura a sinistra (criterio più importante, supponendo che dobbiamo spostarlo a tutto) e la distanza più breve possibile (purché sia ​​spostata a sinistra). Quindi, ad esempio, l'unico output corretto per

[can1](bag)[can2]

è

[can1(bag)][can2]

(spostando la borsa solo di un personaggio verso sinistra). Inoltre, i sacchetti devono rimanere nello stesso ordine relativo:

[can](bag1)(bag2)

deve diventare

[can(bag1)(bag2)]

(cioè non puoi metterlo (bag2)a sinistra di (bag1).)

chiarimenti

  • Non ci saranno sacchi della spazzatura a sinistra del cestino più a sinistra; sarà sempre possibile can tutta la spazzatura spostandola a sinistra.
  • Ci sarà sempre almeno una borsa da spostare. Potrebbe essercene più di uno.
  • Non ci sarà mai un bidone della spazzatura all'interno di un sacchetto della spazzatura (le lattine sono troppo preziose per essere gettate via).
  • Se una borsa è già dentro una lattina, lasciala da sola.
  • Va bene che l'input e l'output differiscano nello spazio bianco finale (comprese le nuove righe).

Esempi:

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

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

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

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


5
Visti elettori, potresti spiegare cosa trovi poco chiaro? Il post sarà difficile da risolvere senza una guida esplicita su cosa c'è che non va.

@ ais523 Non riesco a capire quale sia il compito. Certo, potrebbe essere perché sono stanco, ma l'attuale formulazione non ha molto senso
Blue

1
Fondamentalmente, per ogni sottostringa racchiusa tra parentesi ma non racchiusa tra parentesi, spostarla verso sinistra fino a quando non si trova anche tra parentesi.

Poiché questo problema viene ripetutamente chiuso e riaperto, l'ho modificato con la mia comprensione del problema. Spero di non aver modificato il problema nel processo.

@ ais523 Per me va bene. Grazie mille per tutte le tue modifiche.
Ewan Delanoy,

Risposte:


3

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

Qualsiasi aiuto con il codice / espressioni regolari è molto apprezzato.

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``

Una funzione anonima; accetta un Stringparametro se restituisce l'output.

/\[\[][\w()]*\[]]|\[]/g abbina i bidoni della spazzatura con i sacchi della spazzatura nidificati, tuttavia non credo che potrebbe controllare le parentesi bilanciate all'interno dei sacchi della spazzatura, se necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.