Tạo chuỗi Linus


14

Định nghĩa

Từ mô tả trên OEIS A006345 :

Để tìm a(n), xem xét một 1hoặc a 2. Đối với mỗi, tìm hậu tố lặp lại dài nhất, nghĩa là, đối với mỗi a(n)=1,2, tìm chuỗi dài nhất svới thuộc tính mà chuỗi a(1),...,a(n)kết thúc ss. Sử dụng chữ số dẫn đến hậu tố ngắn hơn như vậy. a(1) = 1.

Ví dụ làm việc

a(1)=1.

Nếu a(2)=1, chúng ta sẽ có chuỗi 1 1trong đó chuỗi con nhân đôi dài nhất từ ​​cuối là 1. Nếu a(2)=2thay vào đó, thì nó sẽ là chuỗi con trống. Do đó a(2)=2.

Khi nào n=6, chúng ta chọn giữa 1 2 1 1 2 11 2 1 1 2 2. Trong lựa chọn đầu tiên, 1 2 1được nhân đôi liên tiếp từ cuối. Trong lựa chọn thứ hai, nó là 2thay thế. Do đó , a(6)=2.

Khi nào n=9, chúng ta chọn giữa 1 2 1 1 2 2 1 2 11 2 1 1 2 2 1 2 2. Trong lựa chọn đầu tiên, chuỗi con liên tiếp nhân đôi dài nhất là 2 1, trong khi ở lựa chọn thứ hai 1 2 2được nhân đôi liên tiếp ở cuối. Do đó a(9)=1.

Bài tập

Cho n, trả lại a(n).

Thông số kỹ thuật

  • n sẽ tích cực.
  • Bạn có thể sử dụng 0-index thay vì 1-index. Trong trường hợp đó, xin vui lòng nêu trong câu trả lời của bạn. Ngoài ra, trong trường hợp đó, ncũng có thể 0.

Tủ thử

Các testcase là 1 chỉ mục. Tuy nhiên, bạn có thể sử dụng 0-indexed.

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

Người giới thiệu


1
Trong trường hợp thử nghiệm n=9, lựa chọn đầu tiên 1 2 1 1 2 2 1 2 1có chuỗi con nhân đôi 2 1ở cuối.
Sherlock9

1
Lưu ý rằng trang OEIS được liên kết có giải pháp Perl được đánh gôn ~ 43 byte.
liori

Câu trả lời:


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]

Bạn có thực sự cần (\x->(\s->...? Nếu không bạn có thể viết (\x s->....
flawr

Điều đó giúp tiết kiệm một vài
Người đàn ông chương trình

Chào mừng đến với PPCG!
betseg

Thay vì sử dụng giới hạn trên lành mạnh div ..., bạn có thể sử dụng ngắn hơn n. Các so sánh bổ sung sẽ trả về sai và không thay đổi kết quả.
Christian Sievers

Ồ, thật tuyệt, tôi đoán tôi đã giả sử sẽ mất nếu giá trị quá lớn
Người đàn ông chương trình

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]

Giải pháp này đang sử dụng lập chỉ mục dựa trên 0.


6

Thạch , 25 24 22 20 byte

2 byte nhờ Dennis.

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

Hãy thử trực tuyến!

Một cổng câu trả lời của tôi trong 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

Toán học, 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)

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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]

Sử dụng lập chỉ mục dựa trên 0. Kiểm tra nó trên Ideone .


2

Bình thường , 26 byte

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

Bộ thử nghiệm.

Giải trình

Khi nào n = 6, chúng ta chọn giữa 1 2 1 1 2 11 2 1 1 2 2.

Chúng tôi tạo ra hai khả năng này, và sau đó xem xét các hậu tố của chúng.

Đối với người đầu tiên, hậu tố là: 1, 2 1, 1 2 1, 1 1 2 1, 2 1 1 2 1, 1 2 1 1 2 1.

Chúng tôi lọc cho hậu tố gấp đôi bằng cách kiểm tra nếu họ đều giống nhau sau khi xoay chúng cho chiều dài chia cho 2 (nó chỉ ra rằng việc kiểm tra này không phải là hoàn hảo, bởi vì nó khẳng định 12cũng).

Chúng tôi lấy hậu tố nhân đôi cuối cùng và sau đó lấy chiều dài của nó.

Sau đó, chúng tôi chọn khả năng tương ứng với độ dài tối thiểu được tạo ở trên.

Sau đó, chúng tôi tiến hành giá trị tiếp theo của n.

Với mục đích của chương trình này, thay vào đó, người chơi golf đã tạo ra mảng đảo ngược.

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

Bình thường, 46 29 byte

Lấy một số cảm hứng từ câu trả lời Pyth tuyệt vời của @Leaky Nun. Đã thử để xem nếu có một cách ngắn hơn bằng cách sử dụng chuỗi. Vẫn còn 3 byte ngắn!

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

Bạn có thể thử nó ở đây .


Sử dụng uce đỏ thay vì vòng lặp for rõ ràng giúp bạn tiết kiệm 4 byte
Leaky Nun


2

Perl, 40 byte

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

Mã này dài 39 byte và yêu cầu -pchuyển đổi ( +1 byte).

Vòng lặp được lấy cảm hứng từ giải pháp Perl trên trang OEIS có liên quan , mặc dù tôi đã đưa ra một cách độc lập với biểu thức thông thường.

Kiểm tra nó trên Ideone .


Bạn đã vượt qua OEIS, cụ thể là, TonMedel / Phil Carmody ...
Leaky Nun

Không thực sự có thể so sánh vì tập lệnh OEIS không có đầu vào và in toàn bộ chuỗi.
Dennis

1

JavaScript (ES6), 84

Chỉ số cơ sở 0

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

Ít chơi gôn

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

Kiểm tra

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.