Il problema
Ho un sacco di espressioni regolari che devo usare in alcuni codici, ma sto usando un linguaggio di programmazione che non supporta regex! Fortunatamente, so che la stringa di test avrà una lunghezza massima e sarà composta solo da ASCII stampabile.
La sfida
È necessario inserire una regex e un numero n
e generare ogni stringa composta da ASCII stampabile (codici ASCII da 32 a 126 inclusi, a
~
, senza tabulazioni o nuove righe) di lunghezza inferiore o uguale a n
quella corrispondente a quella regex. Si può non utilizzare built-in espressioni regolari o funzioni corrispondenti regex nel codice a tutti. Le espressioni regolari saranno limitate alle seguenti:
- Personaggi letterali (e escape, che costringono un personaggio ad essere letterale, quindi
\.
è letterale.
,\n
è un letteralen
(equivalente a justn
), ed\w
è equivalente aw
. Non è necessario supportare sequenze di escape.) .
- carattere jolly (qualsiasi carattere)- Classi di caratteri,
[abc]
significa "a o b o c" e[d-f]
significa qualsiasi cosa da d a f (quindi, d o e o f). Gli unici personaggi che hanno un significato speciale in una classe di caratteri sono[
e]
(che saranno sempre sfuggiti, quindi non preoccuparti di quelli),\
(il carattere di fuga, ovviamente),^
all'inizio della classe di caratteri (che è una negazione ) e-
(che è un intervallo). |
- l'operatore OR, alternanza.foo|bar
significa ofoo
obar
e(ab|cd)e
corrisponde aabe
ocde
.*
- abbina il token precedente ripetuto zero o più volte, avido (prova a ripetere il maggior numero di volte possibile)+
- ripetuto una o più volte, goloso?
- zero o uno volte- Raggruppamento con parentesi, per i token di gruppo per
|
,*
.+
, o?
L'input regex sarà sempre valido (cioè, non è necessario gestire input simili ?abc
o (foo
o qualsiasi input non valido). Puoi generare le stringhe nell'ordine che preferisci, ma ogni stringa deve apparire una sola volta (non generare duplicati).
I casi di test
Ingresso: .*
, 1
Uscita: (stringa vuota), ,
!
, "
, ..., }
,~
Ingresso: w\w+
, 3
uscita: ww
,www
Ingresso: [abx-z][^ -}][\\]
, 3
uscita: a~\
, b~\
, x~\
, y~\
,z~\
Ingresso: ab*a|c[de]*
, 3
uscita: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Ingresso: (foo)+(bar)?!?
, 6
uscita: foo
, foo!
, foofoo
,foobar
Ingresso: (a+|b*c)d
, 4
uscita: ad
, cd
, aad
, bcd
, aaad
,bbcd
Ingresso: p+cg
, 4
uscita: pcg
,ppcg
Ingresso: a{3}
, 4
Uscita:a{3}
Il vincitore
Questo è code-golf , quindi vincerà il codice più breve in byte!
|
ha molto poco senso. Non sembra gestire gruppi nidificati o a|b|c
. Cosa c'è di sbagliato nell'usare le spiegazioni standard in termini di quanto fortemente concatenazione e alternanza si legano? (E non hai scuse per non usare la sandbox)