Abbina le permutazioni!


15

La tua sfida è creare una regex che corrisponda a ogni permutazione di stringa di se stessa e nient'altro. La corrispondenza deve anche essere sensibile al maiuscolo / minuscolo.

Quindi, ad esempio, se la tua regex è:

ABC

Dovrebbe corrispondere (e corrispondere solo) a queste stringhe:

ABC
ACB
BAC
BCA
CAB
CBA

Non dovrebbe corrispondere a cose come:

AABC (contains an extra A)
ABCD (contains an extra D)
AC   (no B)
AAA  (no B and C, extra 2 A's)
abc  (case-sensitive)

Regole:

  • Puoi usare qualsiasi tipo di regex che ti piace.
  • Si applicano scappatoie standard.
  • Devi avere almeno due caratteri diversi nel tuo codice. Ciò significa che soluzioni come 1non sono valide.
  • Il regex dovrebbe contenere solo ASCII stampabile e nient'altro.



Ho pensato (ABC|ACB|BAC|BCA|CAB|CBA)ma tu volevi una risposta generalizzata.
Stephen Quan,

Risposte:


11

JavaScript, 64 57 byte

4 byte rimossi grazie a Martin Ender.

^(?!.*([^])(.*\1){3}]?)[$$[-^?!!.'''-*11{33}5577\\-]{57}$

Provalo qui.

Spiegazioni (obsolete)

^                                  # Beginning of the string.
(?!.*                              # Match only the strings that don't contain...
  (.)(.*\1){4}                     #     5 occurrences of the same character.
  [^1]?[^1]?                       #     Something that doesn't matter.
)
[]zzz^(?!!!.**[)\\1{{44}}666]{64}  # 64 occurrences of these 16 characters.
                                   # Some are duplicated to make sure the regex
                                   # contains 4 occurrences of each character.
\z                                 # End of the string.

2
Penso che questo ^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z funzioni
Martin Ender,

Questo funziona quasi in .NET:^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
jimmy23013

Cosa non funziona? Trailing linefeed?
Martin Ender,

@MartinEnder Sì.
jimmy23013,

2

Perl e PCRE regex, 280 byte

^(?=(.*z){2})(?=(.*\(){43})(?=(.*\)){43})(?=(.*\*){22})(?=(.*\.){23})(?=(.*0){2})(?=(.*1){6})(?=(.*2){16})(?=(.*3){7})(?=(.*4){4})(?=(.*5){1})(?=(.*6){3})(?=(.*7){2})(?=(.*8){2})(?=(.*9){1})(?=(.*=){22})(?=(.*\?){22})(?=(.*\\){11})(?=(.*\^){2})(?=(.*\{){23})(?=(.*\}){23}).{280}\z

(Leggermente) più leggibile:

^
(?=(.*z){2})
(?=(.*\(){43})
(?=(.*\)){43})
(?=(.*\*){22})
(?=(.*\.){23})
(?=(.*0){2})
(?=(.*1){6})
(?=(.*2){16})
(?=(.*3){7})
(?=(.*4){4})
(?=(.*5){1})
(?=(.*6){3})
(?=(.*7){2})
(?=(.*8){2})
(?=(.*9){1})
(?=(.*=){22})
(?=(.*\?){22})
(?=(.*\\){11})
(?=(.*\^){2})
(?=(.*\{){23})
(?=(.*\}){23})
.{280}\z

Funziona in O (2 ^ n) tempo come scritto, quindi è incredibilmente inefficiente. Il modo più semplice per testarlo è sostituire ogni occorrenza di .*con .*?, il che fa sì che il caso in cui corrisponda venga prima verificato (il che significa che corrisponde in tempo lineare, ma impiega comunque tempo esponenziale se non riesce a corrispondere).

L'idea di base è che imponiamo che la lunghezza della regex sia uguale a 280 e utilizziamo le asserzioni lookahead per forzare ogni personaggio nella regex ad apparire almeno un certo numero di volte, ad esempio (?=(.*z){2})forzando il zpersonaggio ad apparire almeno due volte. 2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23è 280, quindi non possiamo avere occorrenze "extra" di nessun personaggio.

Questo è un esempio di programmazione di un autogramma , una frase che si descrive elencando il numero di ciascun carattere che contiene (e, in questo caso, anche la lunghezza totale). Sono stato abbastanza fortunato nel costruirlo (normalmente devi usare la forza bruta ma mi sono imbattuto in questa soluzione mentre testavo il mio programma di forza bruta prima che avessi finito di scriverlo).

Perl e PCRE regex, 253 byte, in collaborazione con Martin Ender

Ho ipotizzato che potrebbero esserci soluzioni più brevi che omettono alcune cifre (molto probabilmente 9, 8 o 7). Martin Ender ne ha trovato uno, mostrato di seguito:

^(?=(.*z){2})(?=(.*\(){39})(?=(.*\)){39})(?=(.*\*){20})(?=(.*\.){21})(?=(.*0){4})(?=(.*1){6})(?=(.*2){11})(?=(.*3){6})(?=(.*4){3})(?=(.*5){2})(?=(.*6){3})(?=(.*9){4})(?=(.*=){20})(?=(.*\?){20})(?=(.*\\){9})(?=(.*\^){2})(?=(.*{){21})(?=(.*}){21}).{253}\z

Versione leggibile:

^
(? = (. * Z) {2})
(? = (. * \ () {39})
(? = (. * \)) {39})
(? = (. * \ *) {20})
(? = (. * \.) {21})
(? = (. * 0) {} 4)
(? = (. * 1) {} 6)
(? = (. * 2) {11})
(? = (. * 3) {} 6)
(? = (. * 4) {3})
(? = (. * 5) {2})
(? = (. * 6) {3})
(? = (. * 9) {} 4)
(? = (. * =) {20})
(? = (. * \?) {20})
(? = (. * \\) {9})
(? = (. * \ ^) {2})
(? = (. * {) {21})
(? = (. *}) {21})
. {253} \ z

Non penso che tu debba scappare da quelli {}negli ultimi due lookaheads. Inoltre, non è necessario aggiungere cose come (?=(.*5){1})poiché non ci sarebbe un 5se non avessi quel lookahead. Un problema è che $consente un avanzamento riga finale, quindi dovrai usarlo \zinvece di $come ha fatto Jimmy, ma questo non ti costerà un byte, credo, dal momento che lo salvi \nel primo lookahead.
Martin Ender,

Sono consapevole che è possibile omettere cose come le cifre. Tuttavia, sono lì per far funzionare l' autogramma . La rimozione di qualsiasi parte del programma causerà l'interruzione di tutto il resto, poiché non descrive più correttamente il programma. (I conteggi per ogni riga contano i conteggi per ogni riga! Quindi, in generale, è sostanzialmente impossibile cambiare il programma.) Per quanto riguarda $consentire una nuova riga alla fine della stringa, ciò dipende generalmente da come il regex viene chiamato dall'ambiente circostante programma (normalmente vengono eseguiti su codice già analizzato in righe).

O per essere più precisi: (?=(.*5){1})in questo caso mi serve . Se lo avessi rimosso, ci sarebbe un 5 nel programma, perché la (?=(.*1){6})riga ora dovrebbe leggere (?=(.*1){5}).

Per quanto riguarda il linefeed finale non sembra esserci alcuna restrizione nella sfida sul tipo di input per la tua regex, quindi di solito significa che dovrebbe funzionare per qualsiasi stringa e che il passaggio $a \znon fa alcun danno (e non non rompere l'autogramma).
Martin Ender,

Oh, capisco; si cambia il \$... $a z... \z. Che funzioni; Vado a cambiarlo.
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.