L'idea qui è quella di produrre un modello quasi ripetitivo. Cioè, la sequenza che si sta costruendo cambia all'ultimo momento per evitare una ripetizione di qualche sottosequenza. Le conseguenze del tipo AA e ABA devono essere evitate (dove B non è più lungo di A).
Esempi:
Vado avanti e inizierò elencando tutti i piccoli esempi per rendere più chiara la mia descrizione. Cominciamo con 0.
Valido: 0 Non valido: 00 (modello AA) Valido: 01 Non valido: 010 (modello ABA) Non valido: 011 (modello AA) Valido: 012 Valido: 0120 Non valido: 0121 (modello ABA) Non valido: 0122 (modello AA) Non valido: 01200 (modello AA) Non valido: 01201 (modello ABA; 01-2-01) Non valido: 01202 (modello ABA) Valido: 01203
Ora, credo fermamente che a 4
non sia mai necessario, anche se non ne ho una prova, perché ho trovato facilmente sequenze di centinaia di caratteri che usano solo 0123
. (Probabilmente è strettamente correlato al modo in cui sono necessari solo tre caratteri per avere stringhe infinite che non hanno alcun modello AA. C'è una pagina Wikipedia su questo.)
Input Output
L'input è un numero intero singolo, positivo, diverso da zero n
. Si può presumere che n <= 1000
.
L'output è una n
sequenza di caratteri senza sottosequenze che corrispondono a uno schema proibito (AA o ABA).
Ingressi e uscite di esempio
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Regole
- Sono
0123
ammessi solo i personaggi . - B non è più di A. Questo per evitare la situazione in cui
012345
deve essere seguita da6
perché0123451
ha questo:1-2345-1
. In altre parole, la sequenza sarebbe banale e poco interessante. n
può essere immesso attraverso qualsiasi metodo desiderato, ad eccezione della codifica hardware.- L'output può essere un elenco o una stringa, a seconda di quale è più semplice.
- Nessuna forza bruta ; il tempo di esecuzione dovrebbe essere dell'ordine dei minuti, al massimo un'ora su una macchina molto lenta, per
n=1000
. (Questo ha lo scopo di squalificare le soluzioni che attraversano semplicemente tutte len
permutazioni di lunghezza{0,1,2,3}
, in modo tale che i trucchi e i trucchi simili siano vietati.) - Le scappatoie standard non sono consentite, come al solito.
- Il punteggio è in byte. Si tratta di code-golf , quindi vince l'ingresso più breve (probabilmente - vedi bonus).
- Bonus: seleziona la cifra più bassa consentita ad ogni passaggio. Se
1
e3
sono possibili scelte per la cifra successiva nella sequenza, selezionare1
. Sottrai 5 byte dal tuo punteggio. Tuttavia, prendere nota della nota seguente.
Nota!
I vicoli ciechi sono possibili. Il tuo programma o funzione deve evitare questi. Ecco un esempio:
Ceppo: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031023 Ceppo: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301323013023 Ceppo: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123022032102301 Ceppo: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301332013023
Ognuna di queste sequenze non può essere estesa ulteriormente (senza usare a 4
). Ma nota anche che c'è una differenza cruciale tra i primi due e i secondi due. Sostituirò la sottosequenza iniziale condivisa con una X
per renderlo più chiaro.
Ceppo: X2130120 Ceppo: X2130123 Ceppo: X320 Ceppo: X321301203102130
Le ultime due cifre di X
sono 10
, quindi le uniche scelte possibili per la cifra successiva sono 2
e 3
. La scelta 2
porta a una situazione in cui la sequenza deve terminare. L'algoritmo goloso non funzionerà qui. (Non senza backtracking, comunque.)
n
, ma dato che i ceppi che il mio programma trova tendono ad allungarsi di una media di 10 cifre ogni volta, sono sicuro che esista una sequenza infinita. Non sono sicuro di come un algoritmo semi-avido possa essere testato per sequenze arbitrariamente grandi. Potrei limitare il requisito a n
= 1000 e semplicemente non preoccuparmi di un livello superiore n
.
AA
sia davvero il tipo ABA
dove B
è vuoto. Questo potrebbe forse aiutare a semplificare alcune soluzioni.
n
? Se qualcuno fornisce un algoritmo euristico semi-avido, come verificherai che non si verifichino problemi per un periodo molto lungo? Il problema generale è interessante e non sono stato in grado di trovare nulla sull'evitamento del motivo in cui limitiamo la lunghezza di parte del motivo. Se qualcuno può produrre una ricetta generale, mi aspetto che sia l'approccio migliore.