Genera sequenza lineare


14

Definizione

Dalla descrizione su OEIS A006345 :

Per trovare a(n), considera a 1o a 2. Per ciascuno, trova il suffisso ripetuto più lungo, ovvero, per ciascuno dei a(n)=1,2, trova la sequenza più lunga scon la proprietà con cui a(1),...,a(n)termina la sequenza ss. Utilizzare la cifra che risulta nel suffisso più breve. a(1) = 1.

Esempio risolto

a(1)=1.

Se a(2)=1avremo la sequenza in 1 1cui si trova la sottostringa raddoppiata più lunga dall'estremità 1. Se a(2)=2invece, sarebbe la sottostringa vuota. Pertanto a(2)=2.

Quando n=6, scegliamo tra 1 2 1 1 2 1e 1 2 1 1 2 2. Nella prima scelta, 1 2 1viene raddoppiato consecutivamente dalla fine. Nella seconda scelta, 2invece è . Perciò,a(6)=2 .

Quando n=9, scegliamo tra 1 2 1 1 2 2 1 2 1 e 1 2 1 1 2 2 1 2 2. Nella prima scelta, la sottostringa consecutiva raddoppiata più a lungo è 2 1, mentre nella seconda scelta 1 2 2viene raddoppiata consecutivamente alla fine. Pertanto a(9)=1.

Compito

Dato n, ritorno a(n).

Specifiche

  • n sarà positivo.
  • È possibile utilizzare 0 indicizzato anziché 1 indicizzato. In tal caso, indicalo nella tua risposta. Inoltre, in quel caso, npuò essere 0anche.

Casi test

I casi di test sono 1 indicizzati. Tuttavia, è possibile utilizzare 0 indicizzato.

n  a(n)
1  1
2  2
3  1
4  1
5  2
6  2
7  1
8  2
9  1
10 1
11 2
12 1
13 2
14 2
15 1
16 1
17 2
18 1
19 1
20 1

Riferimenti


1
Nel caso di test di n=9, la prima scelta 1 2 1 1 2 2 1 2 1ha la sottostringa raddoppiata 2 1alla fine.
Sherlock9

1
Si noti che la pagina OEIS collegata ha una soluzione Perl golfata di ~ 43 byte.
Liori

Risposte:


7

Haskell, 146 140 137 133 118 byte

s!l|take l s==take l(drop l s)=l|1<2=s!(l-1)
g[w,x]|w<x=1|1<2=2
a 1=1
a n=g$(\s x->(x:s)!n)(a<$>[n-1,n-2..1])<$>[1,2]

Ne hai davvero bisogno (\x->(\s->...? Altrimenti potresti scrivere (\x s->....
Flawr

Questo aiuta a salvarne alcuni
Programma man

Benvenuti in PPCG!
Betseg,

Invece di usare il limite superiore sano div ..., puoi usare il più corto n. I confronti aggiuntivi restituiranno tutti false e non modificheranno il risultato.
Christian Sievers,

ooh bello, immagino di aver pensato che si sarebbe schiantato se avesse dato un valore troppo grande
Program man

6

Python, 137 byte

def a(n,s=[0],r=lambda l:max([0]+filter(lambda i:l[-i:]==l[-i*2:-i],range(len(l))))):
 for _ in[0]*n:s+=[r(s+[0])>r(s+[1])]
 return-~s[n]

Questa soluzione utilizza l'indicizzazione basata su 0.


6

Gelatina , 25 24 22 20 byte

2 byte grazie a Dennis.

2;€µḣJf;`€$ṪLµÞḢ
Ç¡Ḣ

Provalo online!

Una porta della mia risposta in Pyth .

Ç¡Ḣ   Main chain

 ¡    Repeat for (input) times:
Ç         the helper chain
  Ḣ   Then take the first element



2;€µḣJf;`€$ṪLµÞḢ  Helper chain, argument: z

2;€               append z to 1 and 2, creating two possibilities
   µ         µÞ   sort the possibilities by the following:
    ḣJ                generate all prefixes from shortest to longest
       ;`€            append the prefixes to themselves
      f   $           intersect with the original set of prefixes
           Ṫ          take the last prefix in the intersection
            L         find its length
                 Ḣ   take the first (minimum)

4

Mathematica, 84 byte

a@n_:=a@n=First@MinimalBy[{1,2},Array[a,n-1]~Append~#/.{___,b___,b___}:>Length@{b}&]


2

MATL , 34 byte

vXKi:"2:"K@h'(.+)\1$'XXgn]>QhXK]0)

Provalo online! o verifica tutti i casi di test .

Spiegazione

v             % Concatenate stack vertically: produces empty array
XK            % Copy to clipboard K. This clipboard holds the current sequence
i:            % Take input n. Generate vector [1 2 ... n]
"             % For each k in [1 2 ... n]
  2:          %   Push [1 2]. These are the possible digits for extending the sequence
  "           %     For each j in [1 2]
    K         %       Push contents of clipboard K (current sequence)
    @         %       Push j (1 or 2)
    h         %       Concatenate horizontally: gives a possible extension of sequence
    '(.+)\1$' %       String to be used as regex pattern: maximal-length repeated suffix
    XX        %       Regex match
    gn        %       Convert to vector and push its length: gives length of match
  ]           %    End. We now have the suffix lengths of the two possible extensions
  >           %    Push 1 if extension with "1" has longer suffix than with "2"; else 0 
  Q           %    Add 1: gives 2 if extension with "1" produced a longer suffix, or 1
              %    otherwise. This is the digit to be appended to the sequence
  h           %    Concatenate horizontally
  XK          %    Update clipboard with extended sequence, for the next iteration
]             % End
0)            % Get last entry (1-based modular indexing). Implicitly display

2

Python 2, 94 byte

import re
s='1'
exec"s+=`3-int(re.search(r'(.*)(.)\\1$',s).groups()[1])`;"*input()
print s[-1]

Utilizza l'indicizzazione basata su 0. Provalo su Ideone .


2

Pyth , 26 byte

huh.mleq#.<T/lT2._b+RGS2QY

Suite di test.

Spiegazione

Quando n = 6, scegliamo tra 1 2 1 1 2 1e1 2 1 1 2 2 .

Generiamo queste due possibilità e quindi esaminiamo i loro suffissi.

Per il primo, i suffissi sono: 1, 2 1, 1 2 1, 1 1 2 1, 2 1 1 2 1, 1 2 1 1 2 1.

Filtriamo i suffissi raddoppiati verificando che siano uguali dopo averli ruotati per la loro lunghezza divisa per 2 (si scopre che questo controllo non è perfetto, perché conferma 1e 2anche).

Prendiamo l'ultimo suffisso raddoppiato e poi prendiamo la sua lunghezza.

Scegliamo quindi la possibilità che corrisponde a una lunghezza minima generata sopra.

Quindi passiamo al valore successivo di n.

Ai fini di questo programma, invece, era più golfoso generare l'array invertito.

huh.mleq#.<T/lT2._b+RGS2QY
 u                      QY   repeat Q (input) times,
                             start with Y (empty array),
                             storing the temporary result in G:
                   +RGS2         prepend 1 and 2 to G,
                                 creating two possibilities
   .m             b              find the one that
                                 makes the following minimal:
                ._                   generate all prefixes
       q#                            filter for prefixes as T
                                     that equals:
         .<T/lT2                         T left-rotated
                                         by its length halved
      e                              take the last one
     l                               generate its length
  h                              take the first minimal one
h                                take the first one from the generated
                                 array and implicitly print it out

2

Pyth, 46 29 byte

Ha preso ispirazione dall'eccellente risposta Pyth di @Leaky Nun. Ho provato a vedere se c'era un modo più breve di usare le stringhe. Ancora 3 byte in meno!

huh.melM+kf!x>blTT._bm+dGS2Qk

Puoi provarlo qui .


L'uso di red uce invece di esplicito for-loop ti fa risparmiare 4 byte
Leaky Nun


2

Perl, 40 byte

$a.=/(.*)(.)\1$/^$2for($a)x$_;$_=$a%5+1

Il codice è lungo 39 byte e richiede l' -popzione ( +1 byte).

Il ciclo si ispira alla soluzione Perl nella relativa pagina OEIS , anche se mi sono inventato indipendentemente con l'espressione regolare.

Provalo su Ideone .


Hai superato OEIS, in particolare Ton Hospel / Phil Carmody ...
Leaky Nun

Non paragonabile in quanto lo script OEIS non accetta input e stampa l'intera sequenza.
Dennis

1

JavaScript (ES6), 84

Base indice 0

n=>eval("s='1';for(r=d=>(s+d).match(/(.*)\\1$/)[0].length;n--;s+=c)c=r(1)>r(2)?2:1")

Meno golf

n=>{
  r = d => (s+d).match(/(.*)\1$/)[0].length;
  c = '1';
  for(s = c; n--; s += c)
    c = r(1) > r(2) ? 2 : 1;
  return c;
}

Test

F=
n=>eval("s='1';for(r=d=>(s+d).match(/(.*)\\1$/)[0].length;n--;s+=c)c=r(1)>r(2)?2:1")

for(n=0;n<20;n++)console.log(n,F(n))

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.