Regex inversa di interesse composto


9

Koronkorko è la parola finlandese per interesse composto . Non vogliamo interesse composto per le nostre stringhe, quindi troviamo l'espressione regolare più breve possibile per escluderla.

Data una stringa composta solo dai caratteri alfabetici maiuscoli AZ, determinare l'espressione regolare più breve possibile che corrisponda alla stringa se non contiene la sottostringa KORONKORKO. Qualsiasi stringa che contiene KORONKORKOcome sottostringa non deve corrispondere al regex.

Solo i personaggi A- Z, [, ], -, ^, , ?, *, +, |, (, e )dovrebbero essere utilizzati nell'espressione.

Penso che questo possa essere fatto con 118 caratteri nell'espressione. Puoi renderlo più breve?

Nota: questa sfida è di Ohjelmointiputka (in finlandese).


Se !fosse un personaggio consentito, avresti potuto farlo ^((?!KORONKORO).)*$per 19 byte.
Mama Fun Roll

3
@MamaFunRoll Penso che sia per questo che ! non è permesso.
Alex A.

Mi sono divertito a cercare di aggirare il sito finlandese e credo che ciò che stai cercando siano espressioni regex teoriche che corrispondono / rifiutano la stringa di input. Ad esempio, il sito sembra consentire solo l'uso di -e ^all'interno di classi di caratteri (quindi ^non può essere utilizzato come ancora) e una corrispondenza viene conteggiata solo se l'intera stringa è abbinata al regex (ovvero un circostante implicito ^$, come al contrario dei normali "regex" che contano una stringa come corrispondente se una parte di essa corrisponde al regex)
Sp3000

Come tale ho eliminato la mia risposta PCRE che, sebbene dovrebbe funzionare anche in PHP, in questo caso è quasi del tutto indesiderata.
Sp3000,

Ho dimenticato di dire che il sito verifica se l'espressione è valida dalla funzione ereg di PHP. È stato detto in discussione in ohjelmointiputka.net/keskustelu/…
ospite

Risposte:


6

204 caratteri

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

Generato trasformandosi .*KORONKORKO.*in una macchina a stati finiti, invertendo la macchina a stati finiti e trasformandola in una regex.


Perché questa è diventata la migliore risposta?
Bálint,

1

Python, 77 79 97 118 byte

Modifica 3: riscrivi. Utilizza lookahead nidificati

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Regex 101

Modifica 2: aggiunto "$ |" durante la regex. Ora, se un prefisso di KORONKORKO è stato abbinato, l'elemento successivo da abbinare è end-of-string, un carattere che termina il prefisso o un carattere che estende il prefisso se è seguito da qualcosa che termina il prefisso.

Funziona con questo regex re.fullmatch(), che è stato aggiunto in Python 3.4. Per l'uso con re.match(), ^e $devono essere aggiunti all'inizio e alla fine del pattern, rispettivamente, per ulteriori 2 byte.

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Link Regex101

Soluzione errata precedente (vedi commenti):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

Modifica: aggiunto singolo K


2
Non credo che questo corrisponda K.
orlp,

@orip - Buona cattura. Fisso.
Radice Due

L'ultimo aggiornamento ora non riesce perKKORONKORKO
Sp3000,

È riparabile? Qualche idea?
Root Due

1
L'inizio ^e la fine $non sono necessari. Inoltre, =e $non sono ammessi.
LegionMammal978,
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.