Generar secuencia de Linus

14

Definición

De la descripción en OEIS A006345 :

Para buscar a(n), considere a 1o a 2. Para cada uno, encuentre el sufijo repetido más largo, es decir, para cada uno a(n)=1,2, encuentre la secuencia más larga scon la propiedad con la que a(1),...,a(n)termina la secuencia ss. Use el dígito que resulta en el sufijo más corto. a(1) = 1.

Ejemplo resuelto

a(1)=1.

Si a(2)=1, tendremos la secuencia 1 1donde está la subcadena duplicada más larga desde el final 1. Si a(2)=2, en cambio, sería la subcadena vacía. Por lo tanto a(2)=2.

Cuando n=6, elegimos entre 1 2 1 1 2 1y 1 2 1 1 2 2. En la primera opción, 1 2 1se duplica consecutivamente desde el final. En la segunda opción, es en su 2lugar. Por lo tanto, a(6)=2.

Cuando n=9, elegimos entre 1 2 1 1 2 2 1 2 1 y 1 2 1 1 2 2 1 2 2. En la primera opción, la subcadena doble más larga consecutiva es 2 1, mientras que en la segunda opción 1 2 2se duplica consecutivamente al final. Por lo tanto a(9)=1.

Tarea

Dado n, regreso a(n).

Especificaciones

  • n será positivo
  • Puede usar 0 indexado en lugar de 1 indexado. En ese caso, indíquelo en su respuesta. Además, en ese caso, npuede ser 0también.

Casos de prueba

Las cajas de prueba están indexadas en 1. Sin embargo, puede usar 0 indexado.

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

Referencias

Monja permeable
fuente
1
En el caso de prueba de n=9, la primera opción 1 2 1 1 2 2 1 2 1tiene la subcadena duplicada 2 1al final.
Sherlock9
1
Tenga en cuenta que la página OEIS vinculada tiene una solución Perl de golf de ~ 43 bytes.
liori

Respuestas:

7

Haskell, 146 140 137 133 118 bytes

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]
Programa hombre
fuente
¿Realmente necesitas (\x->(\s->...? De lo contrario, podrías escribir (\x s->....
flawr
Eso ayuda a ahorrar unos pocos
Program man
Bienvenido a PPCG!
betseg
En lugar de usar el límite superior sano div ..., puede usar el más corto n. Todas las comparaciones adicionales devolverán falso y no cambiarán el resultado.
Christian Sievers
ooh agradable, supongo que asumí toma se estrellaría si se les da un valor demasiado grande
el hombre Programa
6

Python, 137 bytes

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]

Esta solución está usando indexación basada en 0.

Loovjo
fuente
6

Jalea , 25 24 22 20 bytes

2 bytes gracias a Dennis.

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

Pruébalo en línea!

Un puerto de mi respuesta en 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)
Monja permeable
fuente
4

Mathematica, 84 bytes

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

MATL , 34 bytes

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

Pruébalo en línea! o verificar todos los casos de prueba .

Explicación

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
Luis Mendo
fuente
2

Python 2, 94 bytes

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

Utiliza indexación basada en 0. Pruébelo en Ideone .

Dennis
fuente
2

Pyth , 26 bytes

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

Banco de pruebas.

Explicación

Cuando n = 6, elegimos entre 1 2 1 1 2 1y 1 2 1 1 2 2.

Generamos estas dos posibilidades, y luego miramos sus sufijos.

Para el primero, los sufijos son: 1, 2 1, 1 2 1, 1 1 2 1, 2 1 1 2 1,1 2 1 1 2 1 .

Filtramos los sufijos duplicados comprobando si son iguales después de rotarlos por su longitud dividida por 2 (resulta que esta comprobación no es perfecta, porque confirma 1y 2también).

Tomamos el último sufijo duplicado y luego tomamos su longitud.

Luego elegimos la posibilidad que corresponde a una longitud mínima generada anteriormente.

Luego procedemos al siguiente valor de n.

Para el propósito de este programa, era más golfoso generar la matriz invertida.

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
Monja permeable
fuente
2

Pyth, 46 29 bytes

Se inspiró en la excelente respuesta Pyth de @Leaky Nun. Intenté ver si había una forma más corta de usar cuerdas. Todavía 3 bytes cortos!

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

Puedes probarlo aquí .

Rhyzomatic
fuente
El uso de red uce en lugar de for-loop explícito le ahorra 4 bytes
Leaky Nun
2

Perl, 40 bytes

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

El código tiene 39 bytes de longitud y requiere el -pcambio ( +1 byte).

El bucle está inspirado en la solución Perl en la página OEIS relevante , aunque se me ocurrió de forma independiente con la expresión regular.

Pruébelo en Ideone .

Dennis
fuente
Has superado a OEIS, específicamente, Ton Hospel / Phil Carmody ...
Leaky Nun
No es realmente comparable ya que el script OEIS no toma entrada e imprime toda la secuencia.
Dennis
1

JavaScript (ES6), 84

Índice base 0

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

Menos 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;
}

Prueba

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))

edc65
fuente