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.