Genera una sequenza Davenport-Schinzel


11

sfondo

Una sequenza di Davenport-Schinzel ha due parametri interi positivi de n. Indicheremo l'insieme di tutte le sequenze di Davenport-Schinzel per determinati parametri di DS(d,n).

Considera tutte le sequenze dei numeri naturali 1come n, compreso, che soddisfano:

  • Non ci sono due numeri consecutivi nella sequenza identici.
  • Non esiste una sottosequenza (non necessariamente consecutiva) di lunghezza maggiore di d, che si alterna tra due numeri diversi.

Puoi Lindicare la lunghezza massima di una tale sequenza (data de n). Quindi, DS(d,n)è l'insieme di tutte queste sequenze con lunghezza L.

Alcuni esempi potrebbero essere d'aiuto. Let d = 4, n = 3. Le sequenze più lunghe possibili con questi vincoli hanno L = 8. Quindi il seguente è un membro di DS(4,3):

[1, 2, 1, 3, 1, 3, 2, 3]

Non ci sono numeri identici consecutivi e ci sono sottosequenze alternate di lunghezza 4, ma non più lunghe:

 1  2  1           2
 1  2        1     2
 1        3  1  3
 1        3  1        3
    2     3        2  3
    2           3  2  3
       1  3  1  3
       1  3  1        3

I seguenti esempi non sono in DS(4,3):

[1, 2, 2, 3, 1, 3, 2, 3]  # Two consecutive 2's.
[1, 2, 1, 3, 1, 3, 2, 1]  # Contains alternating subsequences of length 5.
[1, 2, 1, 3, 1, 3, 2]     # Longer valid sequences for d = 4, n = 3 exist.

Per ulteriori informazioni consultare MathWorld e OEIS e i riferimenti che elencano.

La sfida

Dati due numeri interi positivi, ne d, generare qualsiasi sequenza Davenport-Schinzel in DS(d,n). Si noti che questi non sono in genere univoci, quindi emettere un singolo risultato valido.

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e restituendo il risultato dalla funzione o stampandolo su STDOUT (o l'alternativa più vicina).

Per l'output è possibile utilizzare qualsiasi stringa o formato elenco comodo e non ambiguo.

Questo è il golf del codice, quindi vince l'invio più breve (in byte).

Lunghezza delle sequenze

Dal momento che le sequenze non sono uniche, non è molto utile per singoli esempi in questa sfida. Tuttavia, i due problemi di validità generale sono abbastanza facili da verificare per qualsiasi output, quindi la domanda principale è solo se la sequenza ha la lunghezza giusta (o c'è una sequenza valida più lunga). Pertanto, ecco un elenco di 1 noto Lper dato de n:

 \ 
 d\n 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
   \-----------------------------------------------------------
 1 | 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 2 | 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 3 | 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
 4 | 1  4  8 12 17 22 27 32 37 42 47 53 58 64 69 75 81 86 92 98
 5 | 1  5 10 16 22 29 ...
 6 | 1  6 14 23 34 ...
 7 | 1  7 16 28 41 ...
 8 | 1  8 20 35 53 ...
 9 | 1  9 22 40 61 ...
10 | 1 10 26 47 73 ...

Non è necessario codificare in modo rigido tutte le informazioni da questa tabella nell'invio.

1 Questa tabella è del 1994, quindi da allora potrebbero esserci stati più progressi, ma dubito che qualsiasi presentazione sarà in grado di gestire anche le voci più grandi in questa tabella in un ragionevole lasso di tempo.

Risposte:


2

Python 2: 172

from itertools import*
d,n=input();S=[[1]]
for s in S:
 for v in range(1,n+1):
  if(v!=s[-1])*all(w[2:]!=w[:-2]for w in combinations(s+[v],d+1)):S.append(s+[v])
print S[-1]

L'input è semplicemente nel formato 4, 3.

Creo iterativamente tutte le sequenze, che iniziano 1e soddisfano le due proprietà e le memorizzo S. Dal momento che li creo in ordine ordinato (ordinati per lunghezza [e per valori]), l'ultima voce deve essere una sequenza Davenport-Schinzel. Usa il fatto carino, che puoi scorrere su un elenco mentre lo aggiungi.


Se stai già utilizzando python2, puoi salvare un byte combinando (quelli che presumo siano due spazi) in una scheda. Correggimi se sbaglio.
Zacharý,
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.