Bu zorluk özyineleme ile ilgilidir (Polisler dizisi)


15

Polisler dizisi

Bu iş parçacığında, göreviniz herhangi bir tamsayı serisi oluşturmak için özyineleme tabanlı bir program / işlev yapmaktır. Robbers, Robbers'ın iş parçacığında daha kısa bir özyinelemeli olmayan çözüm bulmaya çalışacak .

Meydan okuma özeti

Birçok dilde, özyinelemeli işlevler bir programlama görevini önemli ölçüde basitleştirebilir. Bununla birlikte, düzgün bir özyineleme için sözdizimi yükü, kod golfündeki kullanılabilirliğini sınırlayabilir.

Polis tek tamsayı alan bir program ya da işlev oluşturur nilk üretecek, nbir tamsayı dizisinin girişleri sadece özyinelemeye kullanılarak 1 . Ayrıca, girişlerini güvenli olarak işaretlemek için diziyi oluşturmanın daha kısa bir yinelemesiz yolu olduğundan emin olmalıdırlar.

Soyguncular bir bulmaya çalışacağız kısa , aynı tamsayı dizisi üreten aynı dilde program veya fonksiyon Yinelemesiz kullanarak 2 .

Polislerin gönderimi on gün (240 saat) içinde çatlamazsa, polis aslında kendi çözümlerini ortaya koyarak daha kısa özyinelemesiz bir yaklaşımın mümkün olduğunu kanıtlayacaktır. Daha sonra gönderimlerini güvenli olarak işaretleyebilirler .

Polisler yarışmasının galibi en kısa olacak ( golf'e göre) özyineleme tabanlı gönderim güvenli olarak işaretlendi.

Soyguncular yarışmasının galibi en çok çözümü kıran hırsız olacak.

1: Sadece sözdiziminde özyinelemeli olmalıdır; örneğin kuyruk çağrısı optimizasyonu hakkında endişelenmenize gerek yoktur.

2: Yine, sözdiziminde özyinelemesiz; böylece özyinelemeli bir çözüm gönderemezsiniz ve kuyruk çağrısı optimizasyonu sayesinde bir döngüde derlendiğini iddia edemezsiniz.

Başvuru şartları

Her gönderim tek bir tamsayı alır n(sıfır veya bir tabanlı). Gönderme daha sonra nseçilen bir tamsayı serisinin ilk girişlerini çıkarır veya döndürür . (bu tamsayı serisinin aşağıdakilere bağlı olmaması gerektiğini unutmayın:n ). Giriş ve çıkış yöntemi, özyinelemeli ve özyinelemesiz yaklaşım arasında farklılık gösterebilir. Tamsayı serisi, uzunluğu en az 5 olan herhangi bir deterministik seri olabilir. Seri düzgün bir şekilde açıklanmalıdır.

Gönderinizin keyfi olarak çalışmak zorunda değil, nen azından çalışması gerekiyor n=5. Özyinelemesiz yaklaşım en azından nözyinelemeli yaklaşımla aynı şekilde çalışabilmelidir veyan=2^15-1 hangisi daha küçükse .

özyineleme

Bu zorluk uğruna, özyineleme, kendisini çağıran bir işlev (veya işlev benzeri yapı) kullanarak istenen diziyi oluşturmak olarak tanımlanır (veya kendisini çağıran bir dizi işlevi çağırır; bu Y birleştiricisi gibi yapıları içerir). Özyineleme derinliği sonsuza kadar sonsuza gitmelidir n. Özyinesiz yaklaşım olduğu bir şey değil özyinelemeli.


Kekik için forarkada özyinelemeyle nerede yapılır, forözyinelemeli veya döngü mü?
l4m2

nTeorik olarak doğruysa bir kodun rastgele çalıştığını söyleyebilir miyim , ancak zaman veya bellek kısıtlamaları nedeniyle çalıştırılamaz mı?
Bubbler

@Bubbler Kesinlikle, ama en azından n=5hesaplanmalıdır
Sanchises

@ l4m2 Tüm diller rekabet edemez. Bu dilin özyinelemeyi kullanmamanın yerel bir yolu olmadığı anlaşılıyor ( xforbir çeşit içe aktarma yoluyla mevcut olmadıkça ?) Bu yüzden belki de bu dil rekabet edemez.
Mart'ta Sanchises

N büyük olduğunda o kadar gitmeyen bir özyinelemeli, özyinelemeli mi?
l4m2

Yanıtlar:


4

Python 3 , 65 bayt (Güvenli)

f=lambda n,a=3,b=0,c=6,d=6:n*[1]and[a+b]+f(n-1,c,d,2*c+d,2*a+3*b)

Çevrimiçi deneyin!

Python'da bir başka deneme.

Dizi "2-n-n bir tahtayı üç renkte dominolarla doldurmanın yollarının sayısıdır, böylece iki aynı renkli domino birbirine değmez". OEIS'de değil.


Diyelim n=6. Tahta şöyle görünüyor:

######
######

ve bunlar üç renkte geçerli domino eğimleridir ( 1-3her biri bir rengi temsil eder):

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

ama bunlar değil (aynı renkli iki domino birbirine dokunuyor):

112323 332333 211113
112323 112311 233223

Dizi, her biri için kuralları karşılayan tüm olası domino eğimlerini sayar n.


Öngörülen çözüm, 58 bayt

n=int(input());a=3;b=12
for _ in[0]*n:print(a);a,b=b,a*4+b

Çevrimiçi deneyin!

Ne yazık ki hiç kimse yinelemeli kodda açıkça gösterilen yineleme ilişkisini basitleştirmek için uğraşmamış gibi görünüyor. Python 3 olduğu için verilen çift yinelemeyle olduğu gibi bir program yapmak işe yaramaz.


1
Sıra hakkında daha ayrıntılı bilgi verebilir misiniz lütfen.
tsh

@tsh Bazı açıklamalar eklendi. Daha iyi görünüyor mu?
Bubbler

2

Oktav , 47 bayt, l4m2 ile kırık

@(n)(f=@(r,m){@()[r(r,m-1),m],[]}{~m+1}())(f,n)

Çevrimiçi deneyin!

Örnek olarak, ilk npozitif tam sayıları üreten bir Octave girişi , https://oeis.org/A000027 .


Kırık . Yinelenen anonim bir işlev yapmak için +1 olsa da ... Sık kullanılanlar değil :)
Stewie Griffin

@StewieGriffin Her ne kadar döngü tabanlı versiyonlarından daha kısa ortaya çıkmasalar da, Octave'deki golf özyinelemeli anonim işlevleri kesinlikle seviyorum. Bu zorluğun tersi, Octave'de polisler için kesinlikle bir meydan okuma olurdu .
18'de Sanchises

@StewieGriffin Bu arada sohbetteki ping'in işe yarayıp yaramadığından emin değilim, ama l4m2sizi yendi.
18'de Sanchises



2

Röda , 40 bayt

f x,a=1,b=2{[a];f x-1,a=b,b=a+b if[x>1]}

Çevrimiçi deneyin!

Bu işlev aşağıdaki sonlu diziyi verir (ilk 90 Fibonacci sayısı):

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309

Daha fazla Fibonacci sayısı üretebileceğini biliyorum, ancak bu meydan okuma için bu sayıları üretmek yeterlidir.


1

JavaScript (Node.js) , 91 bayt, Crack tarafından l4m2

f=x=>[w=~-x&&(g=(n,y=2)=>~-n&&(n<y?1:n%y?g(n,y+1):1+g(n/y,y)))(x)+f(x-1),console.log(w)][0]

Çevrimiçi deneyin!

OEIS dizisi A022559'un ilk n terimlerini yazdırır (i = 1'den başlayarak).

l4m2 içine döngüler için 3 sığacak 74 72 byte ve benim polis görevini çatlamış:

n=>{for(i=s=0;j=i++<n;console.log(s))for(x=i;j++<i;)for(;x%j<1;x/=j)s++}

Ancak, amaçladığım cevabın aslında döngüler için sadece 2'si var:

n=>{for(i=c=0;i++<n;console.log(c))for(p=2,z=i;p<=z;z%p?p++:(z/=p,c++));}

Çevrimiçi deneyin!



@ l4m2 Aslında 73 baytlık bir tane var;) Yine de tebrikler
Shieru Asakoto

Haydi golfing adam Şimdi 72 @ user71546
l4m2

1

x86 .COM işlevi, 12 bayt, NieDzejkob tarafından kırık

0000 52                     push dx
0001 4A                     dec dx
0002 7403                   je 0007
0004 E8F9FF                 call 0000
0007 58                     pop ax
0008 F7E0                   mul ax
000A AB                     stosw


000B C3                     ret

Giriş DX, Çıkış [DI] ~ [DI + 2 * DX-1]

Kraker çözümü:

0: 31 C0    xor ax, ax
2: BF 01 00 mov di, 1
5: 01 F8    add ax, di
7: AB       stosw
8: E2 FB    loop 5
A: C3       ret

Amaçlanan çözüm:

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret


Çıktı yöntemini değiştirdim. Bakar mısınız?
NieDzejkob

1

Python 3 , 62 bayt, kırık mwchase tarafından

def f(x):
 if(x<1):return[1]
 return f(x-1)+[sum(f(x-1)[-2:])]

Çevrimiçi deneyin!

Bunun çok kolay olacağını hissediyorum ...

Dizi Fibonacci dizisidir f(n) = f(n-1) + f(n-2).f(0) = f(1) = 1


Boole operatörlerinden yapılan satır içi üçlü ifadeye geçebilir ve bu ifadeyi tek bir ifadeye koyar, bu da doğrudan kolondan sonra gidebilir. En az sekiz bayt kurtarır.
mwchase

Lambda'ya geçmek iki (EDIT: dört) daha tasarruf sağlar.
mwchase

2
Ben önerilerinizi takdir ve gelecekteki python kodu golf gönderimleri için onları akılda tutarken mwchase, ben birkaç nedenden dolayı bir polisler ve soyguncular teslim golf olmayacak. İlk önce golf oynamaya devam edersem, soyguncu için hareketli bir hedef belirler, bu da bu yazı tipinde istenmez. İkinci golf bu aynı zamanda yapmak mümkün olmayabilir benim yinelemeli sürümü de golf gerekir anlamına gelir
PunPun1000


1

Göl> <> , 15 bayt, çatlamış mbomb007 tarafından

I1AZZ;
M:K:?ZNB

Çevrimiçi deneyin!

Seri 0,1,2,3,4,5ancak her öğeyi o kadar çok 0 takip eder.

Örneğin, ilk birkaç değer şunlardır:

 1: 0  First element, followed by 0 zeroes
 2: 1  Followed by 1 zero
 3: 0
 4: 2  Followed by 2 zeroes
 5: 0
 6: 0
 7: 3  Followed by 3 zeroes
 8: 0
 9: 0
10: 0
    etc.



0

Windows .BAT, 80 Bayt

@set /a n=%1-1
@echo 8%3
@if 0 neq %n% @call %0 %n% 2%3 6%2%3

Kullanımı:

CD <PATH>
<FILENAME> <N_1>
<FILENAME> <N_2>
<FILENAME> <N_3>

Döngü sürümü geçerli sözlükte kabul edilebilir, ancak başlatması veya sıfırlaması gerekir


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.