Quanti mesas iniziano con una data stringa?


11

Chiamiamo un elenco non vuoto di stringhe una mesa se valgono le seguenti condizioni:

  1. Ogni stringa elencata non è vuota e utilizza solo caratteri presenti nella prima stringa.
  2. Ogni stringa successiva è esattamente più lunga di un carattere rispetto alla stringa precedente.
  3. Nessuna stringa nell'elenco è una sottosequenza di qualsiasi altra stringa nell'elenco.

Il termine "mesa" deriva dalla visualizzazione in questo modo (dove i xs devono essere vari personaggi):

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

NB: È un fatto matematico che solo in modo finito molti mesas iniziano con una data stringa. Si noti la distinzione tra sottosequenza vs. sottostringa ; ad esempio, "anna" è una sottosequenza (ma non una sottostringa) di "banana".

Sfida:

  • Scrivi il programma più breve che accetta una stringa di input alfanumerica non vuota arbitraria e genera il numero di mesas che iniziano con quella stringa.

Input (stdin):

  • Qualsiasi stringa alfanumerica non vuota.

Uscita (stdout):

  • Il numero di mesas che iniziano con la stringa di input.

punteggio:

  • Il vincitore è il programma con il minor numero di byte.

Esempio mesas

Solo una mesa inizia con a:

a

Solo una mesa inizia con aa:

aa

Molti mesas iniziano con ab:

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

Come viene determinata l'unicità di una mesa? Ad esempio, avrei potuto ab, bbbcome mesa, fermarmi al secondo mandato. È valido? O devono sempre essere fatti il ​​più a lungo possibile? Inoltre, se ci sono più possibili riarrangiamenti del nthtermine (ad esempio baa, aba, aab), fanno tutti contano come mesas separati così (a condizione, naturalmente, tutti seguono le regole)?
mellamokb,

@mellamokb - Sono mesas diversi se differiscono in qualche modo. Ad esempio, ab, ab/baa, ab/bbb, ab/bbb/bbaa, ab/bbb/bbaa/baaaa, ab/bbb/bbaa/baaaa/aaaaaasono diversi mesas.
res

@mellamokb - Sollevi altre buone domande; ad esempio, quanti mesas di lunghezza massima iniziano con una determinata stringa e qual è quella lunghezza massima. Altre versioni di queste domande fisserebbero un alfabeto di una determinata dimensione (la dimensione dell'alfabeto sarebbe l'input) e considererebbero tutti i mesas (ridefiniti senza la condizione n. 1) che usano solo lettere dell'alfabeto dato - di nuovo ce ne sono solo finitamente molti.
res

Risposte:



2

Rubino, 142 caratteri

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

Questo algoritmo è costruttivo, ovvero crea tutti i mesas possibili per la stringa di input e li conta. Rende il programma davvero, molto lento - ma ehi, è codegolf.

Esempi di esecuzione:

> a
1
> aa
1
> ab
43

Speravo che tutti i mesas che iniziano con alcune delle stringhe binarie non banali di lunghezza 3 (ad es. aab) Siano di lunghezza fattibile, ma non sono sicuro - il tuo programma ha funzionato per circa un'ora per quell'esempio. NB: Non ci sarà un output fattibile per qualsiasi input che coinvolga più di due lettere distinte; ad esempio, alcuni dei mesas che iniziano con abchanno una lunghezza maggiore del 7000 ° numero di Ackermann .
res

Ho creato una versione ottimizzata in C # e, dopo aver generato le 300,000voci con, aabvedevo ancora che i primi 10 termini erano tutti identici. Quindi penso che potrebbe non essere fattibile per qualcosa di più grande di due personaggi. Almeno, non senza un po 'di intelligenza e calcoli euristici.
mellamokb,
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.