To wyzwanie dotyczy rekurencji (wątek gliniarzy)

15

Wątek gliniarzy

W tym wątku Twoim zadaniem jest utworzenie programu / funkcji opartej na rekurencji w celu wygenerowania dowolnej liczby całkowitej. Rabusie spróbują znaleźć krótsze nierekurencyjne rozwiązanie w wątku Rabusiów .

Wyzwanie streszczenie

W wielu językach funkcje rekurencyjne mogą znacznie uprościć zadanie programowania. Jednak narzut składni dla prawidłowej rekurencji może ograniczyć jego użyteczność w golfowym kodzie.

Te gliny tworzy program lub funkcję biorąc jedną liczbę całkowitą n, która generuje na pierwszej npozycji z roztworów o całkowitą, przy użyciu tylko rekursji 1 . Powinny również upewnić się, że istnieje krótszy nierekurencyjny sposób generowania sekwencji, aby oznaczyć ich wpis jako bezpieczny.

W rabusie spróbuje znaleźć krótszy program lub funkcję w tym samym języku, tworząc taką samą serię całkowitą, używając żadnych rekursji 2 .

Jeśli oświadczenie gliniarzy nie zostanie złamane w ciągu dziesięciu dni (240 godzin), gliniarz udowodni, że w rzeczywistości możliwe było zastosowanie krótszego nierekurencyjnego podejścia, ujawniając własne rozwiązanie. Następnie mogą oznaczyć swoje zgłoszenie jako bezpieczne .

Zwycięzca wyzwania gliniarzy będzie najkrótszy (według ) rekursja oparta na rekurencji oznaczona jako bezpieczna.

Zwycięzcą wyzwania rabusiów będzie rabuś, który złamał najwięcej rozwiązań.

1: Trzeba tylko rekurencyjnie składni; nie musisz się martwić, na przykład, optymalizacją ogona.

2: Ponownie, brak rekurencji w składni; więc nie możesz opublikować rozwiązania rekurencyjnego i twierdzić, że jest ono skompilowane w pętli dzięki optymalizacji wywołania ogona.

Wymagania dotyczące przedłożenia

Każde przesłanie zajmie jedną liczbę całkowitą n(zero lub jeden). Przesłanie spowoduje następnie wygenerowanie lub zwrócenie pierwszych nwpisów z wybranej liczby całkowitej. (zauważ, że ta seria liczb całkowitych nie może zależećn ). Metoda wejścia i wyjścia może różnić się między podejściem rekurencyjnym i nierekurencyjnym. Szereg całkowity może być dowolną serią deterministyczną o długości co najmniej 5. Szereg ten należy odpowiednio wyjaśnić.

Twoje zgłoszenie nie musi działać dla dowolnych dużych n, ale powinno działać przynajmniej n=5. Podejście nierekurencyjne musi być w stanie działać co najmniej tak samo njak podejście rekurencyjne lub do n=2^15-1, w zależności od tego, które jest mniejsze.

Rekurencja

Ze względu na to wyzwanie rekurencję definiuje się jako tworzenie pożądanej sekwencji przy użyciu funkcji (lub konstruktu podobnego do funkcji), który wywołuje siebie (lub wywołuje sekwencję funkcji, która ostatecznie wywołuje samą siebie; obejmuje to konstrukty takie jak kombinator Y). Głębokość rekurencji powinna osiągnąć nieskończoność, podobnie jak nnieskończoność. Podejście nierekurencyjne to wszystko, co nie jest rekurencyjne.

Sanchises
źródło
Dla Thyme, gdzie forodbywa się za pomocą rekurencji, jest forrekurencyjne czy pętla?
l4m2
Czy mogę powiedzieć, że kod działa na dowolnie duży, njeśli jest teoretycznie poprawny, ale nie można go uruchomić z powodu ograniczeń czasowych lub pamięciowych?
Bubbler,
@Bubbler Oczywiście, ale przynajmniej n=5trzeba to obliczyć
Sanchises
@ l4m2 Nie wszystkie języki mogą konkurować. Wygląda na to, że ten język nie ma natywnego sposobu nieużywania rekurencji (chyba że xforjest dostępny poprzez jakiś import?), Więc może ten język nie może konkurować.
Sanchises
Rekurencyjny, który nie idzie tak często, gdy n staje się duży, czy jest rekurencyjny?
l4m2

Odpowiedzi:

4

Python 3 , 65 bajtów (bezpieczny)

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)

Wypróbuj online!

Kolejna próba w Pythonie.

Sekwencja jest „liczbą sposobów na wypełnienie planszy 2 na n domino w trzech kolorach, tak aby żadne dwa domino tego samego koloru nie stykały się ze sobą”. Nie w OEIS.


Powiedzmy Chodźmy n=6. Tablica wygląda następująco:

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

i są to prawidłowe domino w trzech kolorach ( 1-3każdy reprezentuje kolor):

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

ale tak nie jest (dotykają się dwa domino tego samego koloru):

112323 332333 211113
112323 112311 233223

Sekwencja zlicza wszystkie możliwe nachylenia domina, które spełniają reguły dla każdego z nich n.


Zamierzone rozwiązanie, 58 bajtów

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

Wypróbuj online!

Niestety wygląda na to, że nikt nie zadał sobie trudu, aby uprościć relację powtarzalności, co wyraźnie pokazano w kodzie rekurencyjnym. Tworzenie programu z podaną podwójną powtarzalnością w stanie „jak jest” nie działa, ponieważ jest to Python 3.

Bubbler
źródło
1
Czy mógłbyś podać bardziej szczegółowe wyjaśnienie sekwencji, proszę.
tsh
@tsh Dodano wyjaśnienie. Czy to wygląda lepiej?
Bubbler
2

Oktawa , 47 bajtów, pęknięta przez 14m2

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

Wypróbuj online!

Jako przykład podajemy wpis Octave, który generuje pierwsze ndodatnie liczby całkowite, https://oeis.org/A000027 .

Sanchises
źródło
Pęknięty . +1 za wykonanie rekurencyjnej anonimowej funkcji ... Nie są one często używane :)
Stewie Griffin
@StewieGriffin Uwielbiam grać w golfa rekurencyjne anonimowe funkcje w Octave, chociaż nigdy nie okazują się krótsze niż ich wersja oparta na pętli. Odwrotna sytuacja tego wyzwania byłaby z pewnością wyzwaniem dla gliniarzy w Octave.
Sanchises
@StewieGriffin Nie jestem pewien, czy ping na czacie działał, nawiasem mówiąc, ale pobiłem l4m2cię.
Sanchises
2

Dalej (gforth) , 39 bajtów, złamany przez NieDzejkob

: | dup 1 > if dup 1 - recurse then . ;

Wypróbuj online!

jmarkmurphy
źródło
1
Masz inną serię liczb całkowitych niż [1,2,...,n], wiesz, prawda?
Sanchises
Cracked
NieDzejkob
Pomyślałem o tym, ponieważ crack jest po prostu wyszukiwarką Google dla liczonych pętli za pomocą czwartej. Ale tak naprawdę wszystko, co jest w środku, można łatwo odtworzyć wewnątrz pętli.
jmarkmurphy
2

Röda , 40 bajtów

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

Wypróbuj online!

Ta funkcja daje następującą skończoną sekwencję (90 pierwszych liczb Fibonacciego):

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

Wiem, że może generować więcej liczb Fibonacciego, ale na potrzeby tego wyzwania wystarczy wygenerować te liczby.

fergusq
źródło
1

JavaScript (Node.js) , 91 bajtów, Pęknięty przez 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]

Wypróbuj online!

Drukuje pierwsze n wyrażeń sekwencji OEIS A022559 (zaczynając od i = 1).

l4m2 pasuje 3 dla pętli do 74 72 bajtów i złamał mój post gliniarza:

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

Jednak moja zamierzona odpowiedź ma w rzeczywistości tylko 2 pętle:

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

Wypróbuj online!

Shieru Asakoto
źródło
zhakowany
l4m2
@ l4m2 Właściwie mam 73-bajtowy;) W każdym razie gratulacje
Shieru Asakoto
Idź na golfa, koleś Jest teraz 72 @ user71546
l4m2
1

Funkcja x86 .COM, 12 bajtów, Cracked przez NieDzejkob

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

Wejście DX, Wyjście [DI] ~ [DI + 2 * DX-1]

Rozwiązanie krakersa:

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

Zamierzone rozwiązanie:

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret
l4m2
źródło
Cracked
NieDzejkob
Zmieniłem metodę wyjściową. Możesz patrzeć
NieDzejkob,
1

Python 3 , 62 bajty, Cracked przez mwchase

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

Wypróbuj online!

Myślę, że ten będzie zbyt łatwy ...

Sekwencja jest sekwencją Fibonacciego f(n) = f(n-1) + f(n-2)zf(0) = f(1) = 1

PunPun1000
źródło
Możesz przejść do wbudowanej instrukcji trójskładnikowej złożonej z operatorów boolowskich, która umieszcza ją w jednej instrukcji, która może następnie przejść bezpośrednio po dwukropku. Oszczędza co najmniej osiem bajtów.
mwchase,
Przejście na lambda oszczędza dwa (EDYCJA: cztery) więcej.
mwchase
2
@mwchase, choć doceniam twoje sugestie i będę o nich pamiętać w przypadku przyszłych zgłoszeń golfowych w kodzie python, nie będę grał w golfa w policjantów i złodziei z kilku powodów. Po pierwsze, jeśli nadal będę grał w golfa, to ustawia ruchomy cel dla złodzieja, co nie jest pożądane w tego rodzaju słupku. Drugie granie w golfa oznaczałoby, że musiałbym również zagrać w golfa w mojej iteracyjnej wersji, co może nie być w stanie zrobić w tym samym stopniu
PunPun1000,
cracked
mwchase
1

Gol> <> , 15 bajtów, złamane przez mbomb007

I1AZZ;
M:K:?ZNB

Wypróbuj online!

Seria jest 0,1,2,3,4,5 ale po każdym elemencie występuje tyle zer.

Na przykład pierwsze kilka wartości to:

 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.
Jo King
źródło
Pęknięty
mbomb007
0

JavaScript, 63 bajty, pęknięty

f=x=>(x?[f(x-1)[0]&&1?3*f(x-1)[0]+1:f(x-1)[0]/2,...f(x-1)]:[7])

Wypróbuj online!

Zwraca pierwsze n elementów w odwróconej tablicy

Fəˈnɛtɪk
źródło
Pęknięty
l4m2
Wydaje się, że obecnie również odwrócone zwracanie tablic jest niedozwolone
l4m2
0

Windows .BAT, 80 bajtów

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

Stosowanie:

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

Wersja pętli może przyjmować w bieżącym słowniku, ale musi zostać zainicjowana lub zresetowana

l4m2
źródło
0

Python, 82 bajty; pęknięty

Jest to rekurencyjna implementacja w Pythonie sekwencji OEIS A004001 w 82 bajtach. Więcej informacji na temat tej serii można znaleźć w Mathworld Wolframa .

def A(n):
 if n in[1,2]:return[1]*n
 S=A(n-1);return S+[S[S[n-2]-1]+S[n-S[n-2]-1]]

Pierwsze 30 liczb w tej sekwencji to:

1, 1, 2, 2, 3, 4, 4, 4, 5, 6, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16
agtoever
źródło
Pęknięty
l4m2