สร้างลำดับไลนัส


14

คำนิยาม

จากคำอธิบายเกี่ยวกับ OEIS A006345 :

เพื่อหาa(n)พิจารณาอย่างใดอย่างหนึ่งหรือ1 2สำหรับแต่ละค้นหาคำต่อท้ายที่ยาวที่สุดซ้ำ, ที่อยู่, สำหรับแต่ละa(n)=1,2ค้นหาลำดับที่ยาวที่สุดsกับทรัพย์สินที่ลำดับปลายด้วยa(1),...,a(n) ssใช้ตัวเลขที่เป็นผลลัพธ์ของคำต่อท้ายที่สั้นกว่า a(1) = 1.

ตัวอย่างออกกำลังกาย

a(1)=1.

ถ้าa(2)=1เราจะมีลำดับที่เท่าย่อยที่ยาวที่สุดจากจุดสิ้นสุดคือ1 1 1ถ้าa(2)=2เป็นเช่นนั้นมันจะเป็นสตริงย่อยว่าง a(2)=2ดังนั้น

เมื่อn=6เราเลือกระหว่างและ1 2 1 1 2 1 1 2 1 1 2 2ในตัวเลือกแรก1 2 1เป็นสองเท่าติดต่อกันจากจุดสิ้นสุด ในตัวเลือกที่สองมันเป็น2แทน ดังนั้นa(6)=2.

เมื่อn=9เราเลือกระหว่างและ1 2 1 1 2 2 1 2 1 1 2 1 1 2 2 1 2 2ในตัวเลือกแรกซับสตริงที่ต่อเนื่องเป็นสองเท่าที่ยาวที่สุดคือ2 1ในขณะที่ในตัวเลือกที่สอง1 2 2จะเพิ่มเป็นสองเท่าติดต่อกันในตอนท้าย a(9)=1ดังนั้น

งาน

ได้รับผลตอบแทนna(n)

รายละเอียด

  • n จะเป็นบวก
  • คุณสามารถใช้ดัชนี 0 แทนดัชนี 1 ดัชนี ในกรณีนั้นโปรดระบุคำตอบของคุณ นอกจากนี้ในกรณีnนั้น0ยังสามารถ

Testcases

การทดสอบมีการจัดทำดัชนี 1 ชุด อย่างไรก็ตามคุณสามารถใช้ดัชนี 0

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

อ้างอิง


1
ในกรณีทดสอบของn=9ตัวเลือกแรก1 2 1 1 2 2 1 2 1จะมีสตริงย่อยสองเท่า2 1ที่ส่วนท้าย
Sherlock9

1
โปรดทราบว่าหน้า OEIS ที่เชื่อมโยงมีโซลูชัน Perl ที่ตีกอล์ฟที่มีขนาด ~ 43 ไบต์
liori

คำตอบ:


7

Haskell, 146 140 137 133 118 ไบต์

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]

คุณต้องการจริงๆ(\x->(\s->...เหรอ? (\x s->...มิฉะนั้นคุณสามารถเขียน
ข้อบกพร่อง

ที่ช่วยให้ประหยัดไม่กี่คน
โปรแกรม

ยินดีต้อนรับสู่ PPCG!
betseg

แทนการใช้สติผูกพันบนคุณสามารถใช้สั้นdiv ... nการเปรียบเทียบพิเศษทั้งหมดจะคืนค่าเท็จและจะไม่เปลี่ยนผลลัพธ์
Christian Sievers

โอ้ดีฉันเดาว่าฉันคิดว่าจะผิดพลาดถ้าได้รับค่ามากเกินไป
โปรแกรมชาย

6

Python ขนาด 137 ไบต์

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]

โซลูชันนี้ใช้การจัดทำดัชนีแบบ 0


6

เยลลี่ , 25 24 22 20 ไบต์

2 ไบต์ขอบคุณเดนนิส

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

ลองออนไลน์!

พอร์ตของฉันคำตอบใน 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)



2

MATL , 34 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

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 ไบต์

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

ใช้การจัดทำดัชนีแบบ 0 ทดสอบบนIdeone


2

Pyth , 26 ไบต์

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

ชุดทดสอบ

คำอธิบาย

เมื่อn = 6เราเลือกระหว่างและ1 2 1 1 2 11 2 1 1 2 2

เราสร้างความเป็นไปได้สองอย่างนี้แล้วดูคำต่อท้าย

สำหรับคนแรกคำต่อท้ายคือ: 1 , 2 1, 1 2 1, 1 1 2 1, 2 1 1 2 1,1 2 1 1 2 1 ,

เรากรองส่วนต่อท้ายสองเท่าโดยตรวจสอบว่าพวกเขาเหมือนกันหลังจากหมุนพวกเขาตามความยาวหารด้วย 2 (ปรากฎว่าการตรวจสอบนี้ไม่สมบูรณ์เพราะเป็นการยืนยัน1และ2ยัง)

เราใช้คำต่อท้ายสองเท่าสุดท้ายจากนั้นใช้ความยาว

จากนั้นเราเลือกความเป็นไปได้ที่สอดคล้องกับความยาวขั้นต่ำที่สร้างขึ้นด้านบน

nจากนั้นเราจะดำเนินการให้เป็นค่าต่อไปของ

สำหรับวัตถุประสงค์ของโปรแกรมนี้มันเป็นนักกอล์ฟที่จะสร้างอาเรย์กลับด้านแทน

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 ไบต์

รับแรงบันดาลใจจากคำตอบ Pyth ที่ยอดเยี่ยมของ @Leaky Nun พยายามที่จะดูว่ามีวิธีที่สั้นกว่าโดยใช้สตริง ยังคง 3 ไบต์สั้น!

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

คุณสามารถลองมันออกมาที่นี่


การใช้สีแดงuแทนการใช้ for-loop อย่างชัดเจนจะช่วยให้คุณประหยัด 4 ไบต์
Leun Nun


2

Perl, 40 ไบต์

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

รหัสมีความยาว39 ไบต์และต้องการ-pสวิตช์ ( +1ไบต์)

การวนซ้ำนั้นได้แรงบันดาลใจจากโซลูชัน Perl บนหน้า OEIS ที่เกี่ยวข้องถึงแม้ว่าฉันจะแสดงความคิดเห็นแบบปกติ

ทดสอบบนIdeone


คุณโตเร็วกว่า OEIS โดยเฉพาะ Ton Hospel / Phil Carmody ...
Nun

ไม่สามารถเทียบเคียงได้จริงเนื่องจากสคริปต์ OEIS ไม่มีการป้อนข้อมูลและพิมพ์ลำดับทั้งหมด
เดนนิส

1

JavaScript (ES6), 84

ดัชนีฐาน 0

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

น้อย golfed

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

ทดสอบ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.