Ci sono parentesi sotto mentite spoglie?


12

Qualcuno ci ha dato una stringa, ma tutti i caratteri simili a parentesi sono stati cambiati in quelli normali e non sappiamo quale, o anche quanti ce ne fossero. Tutto ciò che sappiamo è che se L1,L2,L3,...,LNfossero diversi tipi di parentesi sinistre e R1,R2,R3,...,RNfossero differenti tipi corrispondenti di parentesi quadre, tutte distinte (2N caratteri parentesi distinte), una stringa sarebbe valida se fosse una delle (+ è la normale concatenazione di stringhe):

  • L1+X+R1,, L2+X+R2...,, LN+X+RNdove Xè una stringa valida,

  • X+Y, dove Xe Ysono stringhe valide,

  • Qualsiasi carattere singolo che non sia un carattere parentesi.

  • La stringa vuota

Sappiamo che hanno iniziato con una stringa valida prima che cambiassero le parentesi e non li hanno cambiati in nessun carattere già esistente nella stringa. Almeno una coppia esisteva anche per ogni parentesi. Riesci a ricostruire quali personaggi erano originariamente coppie di parentesi destra e sinistra (trova le seguenti condizioni Lie Riseguenti)?

Stampa le coppie di caratteri tra parentesi. Ad esempio, se in (){}[]realtà fossero caratteri di parentesi quadre, potresti produrre (){}[]o {}[]()o [](){}, ecc. Potrebbero esserci più modi per farlo per una stringa, devi solo restituirne uno in modo tale che non ci sia assegnazione di parentesi con più coppie (vedi esempi). Si noti che la stringa di output deve sempre avere una lunghezza pari.

Esempi:

abcc- cnon può essere una parentesi, poiché non ci sono altri caratteri con due ricorrenze, ma abpuò essere una coppia di parentesi, quindi si produrrà esattamente ab.

fffff - qualsiasi stringa con al massimo un carattere non può avere parentesi, quindi restituiresti la stringa vuota o non restituiresti nulla.

aedbedebdcecdec - questa stringa non può avere parentesi perché ci sono 1 a, 2 bs, 3 cs, 4 ds e 5 es, quindi non ci sono due caratteri lo stesso numero di volte, che è necessario avere parentesi.

abcd- possibili assegnazioni sono ab, cd, abcd, cdab, adbc, bcad, ac, ad, bce bd, (così come l'assegnazione vuota, che tutti hanno), ma è necessario restituire uno dei compiti più lunghe, quindi è necessario tornare abcd, cdab, adbc, o bcad.

aabbcc, abc- questi hanno entrambi ab, ace bccome coppie valide. Devi restituire una di queste coppie, non importa quale.

abbac- aeb hanno lo stesso numero di caratteri, ma in realtà non possono funzionare, poiché uno di essi si verifica sia a sinistra che a destra di tutte le occorrenze dell'altro. Non restituire nulla.

aabcdb- cde absono le due coppie di parentesi esatte, quindi output cdabo abcd.

abcdacbd- solo una coppia può essere raggiunto in una sola volta, ma ab, ac, bd, cd, e adsono tutte le possibili coppie che si può tornare. Non importa quale coppia scegliate, ha un'istanza in cui un singolo altro personaggio è al suo interno, che vieta qualsiasi altra coppia, tranne nel caso di ad, dove le altre coppie bce cbnon sono neppure possibili da sole, e quindi non può essere possibile con ad.

Questo è il codice golf, quindi vince il codice più breve in byte. L'input proviene da STDIN se possibile per la tua lingua. Se non è possibile, indica il metodo di input nella tua risposta.


1
per l'input abcd, anche l'output adbcsarebbe accettabile, giusto?
Patrick Roberts,

Sì, l'ho aggiunto all'esempio.
Fricative Melon,

Risposte:


4

Rubino, 373 byte

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

Questo utilizza una versione golfizzata del parser dello stack qui .

Probabilmente può essere ulteriormente semplificato, ma non credo che il mio cervello sia più in grado di gestirlo.

Tutti i casi di test: http://ideone.com/gcqDkK

Con spazi bianchi: http://ideone.com/pLrsHg

Ungolfed (principalmente): http://ideone.com/oM5gKX

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.