Linus Dizisi Oluştur


14

Tanım

OEIS A006345'teki açıklamadan :

Bulmak için a(n)a 1veya a'yı düşünün 2. Her biri için, en uzun tekrarlanan soneki bulun, yani her biri için a(n)=1,2, sdizinin a(1),...,a(n)bittiği özelliğe sahip en uzun diziyi bulun ss. Böyle soneklerin daha kısa olmasına neden olan rakamı kullanın. a(1) = 1.

Çalışma Örneği

a(1)=1.

Eğer a(2)=1, 1 1sondan en uzun iki katına çıkan alt dizenin olduğu sıraya sahip olacağız 1. Eğer a(2)=2bunun yerine, o zaman boş alt dize olurdu. Bu nedenle a(2)=2.

Ne zaman n=6, 1 2 1 1 2 1ve arasından seçim yaparız 1 2 1 1 2 2. İlk seçimde, 1 2 1arka arkaya iki katına çıkar. İkinci seçimde, bunun 2yerine. Bu nedenle a(6)=2,.

Ne zaman n=9, 1 2 1 1 2 2 1 2 1 ve arasından seçim yaparız 1 2 1 1 2 2 1 2 2. İlk seçimde, en uzun iki kat üst üste alt dize, 2 1ikinci seçimde 1 2 2ise arka arkaya iki katına çıkar. Bu nedenle a(9)=1.

Görev

Verilen n, geri dön a(n).

gözlük

  • n olumlu olacak.
  • 1 dizinli yerine 0 dizinli kullanabilirsiniz. Bu durumda, lütfen cevabınızda belirtin. Ayrıca, bu durumda da nolabilir 0.

testcases

Test senaryoları 1 endekslidir. Ancak, 0 dizinli kullanabilirsiniz.

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

Referanslar


1
Test durumunda n=9, ilk seçim sonunda 1 2 1 1 2 2 1 2 1çiftlenmiş alt dize vardır 2 1.
Sherlock9

1
Bağlantılı OEIS sayfasının ~ 43 baytlık golf Perl çözümüne sahip olduğunu unutmayın.
liori

Yanıtlar:


7

Haskell, 146 140 137 133 118 bayt

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]

Gerçekten ihtiyacın var (\x->(\s->...mı? Aksi takdirde yazabilirsiniz (\x s->....
flawr

Bu biraz tasarruf yardımcı olur
Program adam

PPCG'ye Hoşgeldiniz!
16'da

Aklı başında üst sınır div ...kullanmak yerine, daha kısa kullanabilirsiniz n. Ekstra karşılaştırmaların hepsi yanlış döndürür ve sonucu değiştirmez.
Christian Sievers

ooh güzel, sanırım çok büyük bir değer verilirse almak çökeceğini varsayıyorum
Program adam

6

Python, 137 bayt

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]

Bu çözüm 0 tabanlı indeksleme kullanıyor.


6

Jöle , 25 24 22 20 bayt

Dennis sayesinde 2 bayt.

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

Çevrimiçi deneyin!

Pyth'teki cevabımın bir limanı .

Ç¡Ḣ   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 bayt

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


2

MATL , 34 bayt

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

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

açıklama

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 bayt

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

0 tabanlı indeksleme kullanır. Ideone üzerinde test edin .


2

Pyth , 26 bayt

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

Test odası.

açıklama

Ne zaman n = 6, 1 2 1 1 2 1ve arasından seçim yaparız 1 2 1 1 2 2.

Bu iki olasılığı yaratıyoruz ve sonra onların son eklerine bakıyoruz.

İlki için, ekleri şunlardır: 1, 2 1, 1 2 1, 1 1 2 1, 2 1 1 2 1, 1 2 1 1 2 1.

İkili sonekleri, uzunlukları 2'ye böldükten sonra aynı olup olmadıklarını kontrol ederek filtreliyoruz (bu kontrolün mükemmel olmadığı ortaya çıkıyor, çünkü onaylıyor 1ve 2ayrıca).

Son iki kat ekini alıp uzunluğunu alıyoruz.

Daha sonra yukarıda üretilen minimum uzunluğa karşılık gelen olasılığı seçiyoruz.

Sonra bir sonraki değerine geçiyoruz n.

Bu programın amacı için, tersine çevrilmiş diziyi üretmek daha golfçüdür.

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 bayt

@Leaky Nun'in mükemmel Pyth cevabından biraz ilham aldı. Dizeleri kullanarak daha kısa bir yol olup olmadığını görmek için çalıştı. Hala 3 bayt kısa!

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

Burada deneyebilirsiniz .


uAçık for-loop yerine kırmızı ce kullanmak 4 bayt kazandırır
Leaky Nun


2

Perl, 40 bayt

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

Kod 39 bayt uzunluğundadır ve -panahtar ( +1 bayt) gerektirir .

Döngü, ilgili OEIS sayfasındaki Perl çözümünden ilham alıyor , ancak normal ifadeyi bağımsız olarak buldum.

Ideone üzerinde test edin .


OEIS'i, özellikle Ton Hospel / Phil Carmody'yi geride bıraktın ...
Leaky Nun

OEIS betiği herhangi bir girdi almadığından ve tüm diziyi yazdırdığı için gerçekten karşılaştırılamaz.
Dennis

1

JavaScript (ES6), 84

Endeks tabanı 0

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

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

Ölçek

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.