Tantangan ini adalah tentang rekursi (utas Polisi)

15

Utas polisi

Di utas ini, tugas Anda adalah membuat program / fungsi berbasis rekursi untuk menghasilkan seri integer apa pun. Perampok akan mencoba dan menemukan solusi non-rekursif yang lebih pendek di utas Perampok .

Tantang sinopsis

Dalam banyak bahasa, fungsi rekursif secara signifikan dapat menyederhanakan tugas pemrograman. Namun, sintaks overhead untuk rekursi yang tepat dapat membatasi kegunaannya dalam kode-golf.

The polisi akan membuat program atau fungsi mengambil satu bilangan bulat n, yang akan menghasilkan pertama nentri dari seri integer, hanya menggunakan rekursi 1 . Mereka juga harus memastikan ada cara non rekursif yang lebih pendek untuk menghasilkan urutan agar menandai entri mereka aman.

The perampok akan mencoba untuk menemukan lebih pendek program atau fungsi dalam bahasa yang sama, menghasilkan seri integer yang sama, tidak menggunakan rekursi 2 .

Jika pengajuan polisi tidak retak dalam sepuluh hari (240 jam), polisi akan membuktikan bahwa sebenarnya mungkin untuk memiliki pendekatan non-rekursif yang lebih pendek dengan mengungkapkan solusi mereka sendiri. Mereka kemudian dapat menandai pengiriman mereka sebagai aman .

Pemenang tantangan polisi adalah pengajuan berbasis rekursi terpendek (menurut ) yang ditandai aman.

Pemenang tantangan perampok adalah perampok yang memecahkan sebagian besar solusi.

1: Itu hanya perlu rekursif dalam sintaksis; Anda tidak perlu khawatir tentang misalnya optimasi panggilan ekor.

2: Sekali lagi, non-rekursif dalam sintaksis; jadi Anda tidak dapat memposting solusi rekursif dan mengklaimnya dikompilasi ke loop berkat optimasi panggilan ekor.

Persyaratan pengiriman

Setiap pengajuan akan mengambil bilangan bulat tunggal n(berbasis nol atau satu). Pengajuan kemudian akan menampilkan atau mengembalikan nentri pertama dari serangkaian pilihan integer. (perhatikan bahwa seri bilangan bulat ini tidak boleh bergantung pada n). Metode input dan output mungkin berbeda antara pendekatan rekursif dan non-rekursif. Seri integer dapat berupa seri deterministik dengan panjang setidaknya 5. Seri harus dijelaskan dengan benar.

Kiriman Anda tidak harus bekerja untuk yang sewenang-wenang n, tetapi setidaknya harus bekerja n=5. Pendekatan non-rekursif harus dapat bekerja hingga setidaknya sama ndengan pendekatan rekursif, atau hingga n=2^15-1, mana yang lebih kecil.

Pengulangan

Demi tantangan ini, rekursi didefinisikan sebagai menciptakan urutan yang diinginkan menggunakan fungsi (atau fungsi seperti konstruksi) yang memanggil dirinya sendiri (atau memanggil urutan fungsi yang akhirnya memanggil dirinya sendiri; ini termasuk konstruksi seperti kombinator Y). Kedalaman rekursi harus menuju ke infinity seperti nmenuju infinity. Pendekatan non-rekursif adalah segala sesuatu yang tidak rekursif.

Sanchises
sumber
Untuk Thyme di mana fordilakukan dengan rekursif di belakang, apakah forrekursif atau loop?
l4m2
Dapatkah saya mengatakan kode berfungsi besar secara sewenang-wenang njika secara teoritis benar, tetapi tidak dapat dijalankan karena kendala waktu atau memori?
Bubbler
@ Lubbler Tentu saja, tetapi setidaknya n=5harus dihitung
Sanchises
@ l4m2 Tidak semua bahasa dapat bersaing. Sepertinya bahasa ini tidak memiliki cara asli untuk tidak menggunakan rekursi (kecuali xfortersedia melalui semacam impor?) Jadi mungkin bahasa ini tidak dapat bersaing.
Sanchises
Sebuah rekursif yang tidak terlalu banyak ketika n menjadi besar, apakah itu rekursif?
l4m2

Jawaban:

4

Python 3 , 65 byte (Aman)

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)

Cobalah online!

Coba lagi dengan Python.

Urutannya adalah "jumlah cara untuk mengisi papan 2-by-n dengan kartu domino dalam tiga warna, sehingga tidak ada dua kartu domino berwarna sama yang saling menyentuh". Bukan pada OEIS.


Katakan saja n=6. Papan terlihat seperti:

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

dan ini adalah domino tilings yang valid dalam tiga warna ( 1-3masing-masing mewakili warna):

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

tetapi ini bukan (dua domino berwarna sama saling bersentuhan):

112323 332333 211113
112323 112311 233223

Urutan menghitung semua kemungkinan domino yang memenuhi aturan untuk masing-masing n.


Solusi yang dimaksudkan, 58 byte

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

Cobalah online!

Sayangnya sepertinya tidak ada yang peduli untuk menyederhanakan hubungan perulangan, yang jelas ditunjukkan dalam kode rekursif. Membuat program dengan perulangan ganda sebagaimana adanya tidak berfungsi karena Python 3.

Bubbler
sumber
1
Bisakah Anda memberikan penjelasan lebih rinci tentang urutannya?
tsh
@tsh Menambahkan beberapa penjelasan. Apakah ini terlihat lebih baik?
Bubbler
2

Oktaf , 47 byte, dipecahkan oleh l4m2

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

Cobalah online!

Sebagai contoh, di sini adalah entri Oktaf yang menghasilkan nbilangan bulat positif pertama , https://oeis.org/A000027 .

Sanchises
sumber
Retak . +1 untuk membuat fungsi anonim rekursif ... Tidak sering yang digunakan :)
Stewie Griffin
@StewieGriffin Saya sangat suka bermain anonim rekursif golf di Octave, meskipun mereka tidak pernah menjadi lebih pendek dari versi berbasis loop mereka. Kebalikan dari tantangan ini pasti akan menjadi tantangan di Octave untuk polisi.
Sanchises
@StewieGriffin Tidak yakin apakah obrolan berhasil, namun l4m2mengalahkan Anda.
Sanchises
2

Keempat (gforth) , 39 byte, dipecahkan oleh NieDzejkob

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

Cobalah online!

jmarkmurphy
sumber
1
Anda diizinkan seri integer berbeda dari [1,2,...,n], Anda tahu itu kan?
Sanchises
Cracked
NieDzejkob
Saya berpikir tentang hal itu karena crack hanya pencarian google untuk loop dihitung menggunakan sebagainya. Tapi sungguh apa pun yang ada di dalam fungsi dapat dengan mudah diciptakan kembali di dalam loop.
jmarkmurphy
2

Röda , 40 byte

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

Cobalah online!

Fungsi ini memberikan urutan terbatas berikut (90 angka Fibonacci pertama):

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

Saya tahu ini dapat menghasilkan lebih banyak angka Fibonacci, tetapi untuk tujuan tantangan ini cukup untuk menghasilkan angka-angka ini.

fergusq
sumber
1

JavaScript (Node.js) , 91 byte, Retak oleh 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]

Cobalah online!

Mencetak n hal pertama dari urutan OEIS A022559 (mulai dari i = 1).

l4m2 cocok 3 untuk loop ke 74 72 byte dan meretakkan pos polisi saya:

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

Namun, jawaban yang saya maksudkan sebenarnya hanya memiliki 2 untuk loop:

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

Cobalah online!

Shieru Asakoto
sumber
diretas
l4m2
@ l4m2 Sebenarnya saya punya 73 byte;) Pokoknya selamat
Shieru Asakoto
Pergi bermain golf sekarang 72 @ user71546
l4m2
1

Fungsi x86 .COM, 12 byte, Retak oleh 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

Input DX, Output [DI] ~ [DI + 2 * DX-1]

Solusi Cracker:

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

Solusi yang dimaksudkan:

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret
l4m2
sumber
Cracked
NieDzejkob
Saya telah mengubah metode keluaran. Bisakah kamu melihat?
NieDzejkob
1

Python 3 , 62 byte, Retak oleh mwchase

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

Cobalah online!

Saya merasa ini akan terlalu mudah ...

Urutannya adalah urutan Fibonacci f(n) = f(n-1) + f(n-2)denganf(0) = f(1) = 1

PunPun1000
sumber
Anda dapat beralih ke pernyataan terner inline yang dibuat dari operator boolean, yang menempatkannya dalam satu pernyataan, yang kemudian dapat langsung pergi setelah titik dua. Menghemat delapan byte, setidaknya.
mwchase
Beralih ke lambda menghemat dua (EDIT: empat) lebih banyak.
mwchase
2
@ mwchase sementara saya menghargai saran Anda dan akan mengingatnya untuk pengiriman golf kode python di masa depan, saya tidak akan mengirim golf kepada polisi dan perampok karena beberapa alasan. Pertama jika saya terus bermain golf maka itu menetapkan target bergerak untuk perampok, yang tidak diinginkan dalam jenis posting ini. Bermain golf kedua ini berarti saya harus bermain golf versi iteratif saya juga, yang mungkin tidak bisa saya lakukan pada tingkat yang sama
PunPun1000
retak
mwchase
1

Gol> <> , 15 byte, dipecahkan oleh mbomb007

I1AZZ;
M:K:?ZNB

Cobalah online!

Seri ini 0,1,2,3,4,5tetapi setiap elemen diikuti oleh banyak 0s.

Misalnya, beberapa nilai pertama adalah:

 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
sumber
Cracked
mbomb007
0

JavaScript, 63 byte, Retak

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

Cobalah online!

Mengembalikan elemen n pertama dalam array terbalik

fəˈnɛtɪk
sumber
Cracked
l4m2
Juga pengembalian array yang terbalik tampaknya saat ini tidak diizinkan
l4m2
0

Windows .BAT, 80 Bytes

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

Pemakaian:

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

Versi loop dapat diasumsikan dalam kamus saat ini, tetapi harus init atau reset

l4m2
sumber
0

Python, 82 byte; retak

Ini adalah implementasi Python rekursif dari urutan OEIS A004001 dalam 82 byte. Lebih banyak latar belakang pada seri ini dapat ditemukan di Wolfram's Mathworld .

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

30 angka pertama dalam urutan ini adalah:

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
sumber
Cracked
14m2