Tantangan
Tulis fungsi yang mengambil dua bilangan bulat positif n dan k sebagai argumen dan mengembalikan jumlah orang terakhir yang tersisa dari n setelah menghitung masing-masing orang ke- k .
Ini adalah tantangan kode-golf, sehingga kode terpendek menang.
Masalah
n orang (yang diberi nomor dari 1 hingga n ) berdiri dalam lingkaran dan setiap k dihitung hingga satu orang tersisa (lihat artikel wikipedia yang sesuai ). Tentukan jumlah orang terakhir ini.
Misalnya untuk k = 3 dua orang akan dilewati dan yang ketiga akan dihitung. Yaitu untuk n = 7 angkanya akan dihitung dalam urutan 3 6 2 7 5 1 (secara detail 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 ) dan dengan demikian jawabannya adalah 4 .
Contohnya
J(7,1) = 7 // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7 // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4 // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
{k block}
lebih[0..n-1]
mendapatkan Andag(0,k) 0 k
untuk memulai dengan? Maaf, jika saya memposting pertanyaan ini di tempat yang salah.0 1 block
. Sangat mudah, itu kebetulan terjadig(1, k) (2-1) block
. Jadi itu mulai dari padag(1,k) 1
bukang(0,k) 0
. Kemudian setelah menjalankan blok, ia mendorong item berikutnya dari array (2
) dan mengeksekusi blok lagi, dll.Mesin Pendaftaran Minsky (25 negara bagian)
Secara teknis bukan fungsi, tetapi dalam paradigma komputasi yang tidak memiliki fungsi ...
Ini adalah sedikit variasi pada kasus uji utama tantangan interpretasi MRM pertama saya :
Masukan dalam register
n
dank
; output dalam registerr
; diasumsikan bahwar=i=t=0
pada entri. Dua instruksi penghentian pertama adalah kasus kesalahan.sumber
k=1
begitur=0
. Hmm, saya harus memikirkan yang ini lagi ...i
hanya menghitung dari2
hinggan
sementarar
adalah register yang mengakumulasikan hasilnya.Python, 36
Saya juga menggunakan rumus dari wikipedia:
Contoh:
sumber
Mathematica,
3836 byteRumus Wikipedia yang sama:
sumber
If[#<2,1,Mod[#0[#-1,#2]+#2,#,1]]&
C, 40 karakter
Ini hanya rumus yang diberikan oleh artikel wikipedia di atas:
Untuk variasi, inilah implementasi yang benar-benar menjalankan simulasi (99 karakter):
sumber
j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
.dc, 27 byte
Menggunakan pengulangan dari artikel Wikipedia. Penjelasan:
sumber
J, 45 karakter
Menjalankan simulasi.
Atau, gunakan rumus (31 karakter):
Saya berharap Howard tidak keberatan bahwa saya telah menyesuaikan format input sedikit agar sesuai dengan kata kerja diad di J.
Pemakaian:
sumber
GolfScript,
3224 bytePenggunaan: Mengharapkan dua parameter n dan k berada di tumpukan dan meninggalkan nilai output.
(terima kasih kepada Peter Taylor untuk menyarankan pendekatan berulang dan banyak tips lainnya)
Pendekatan lama (rekursif) dari 32 karakter:
Ini GolfScript pertama saya, jadi tolong beri tahu saya kritik Anda.
sumber
1-
memiliki opcode khusus(
. Demikian1+
juga)
. Anda tidak harus menggunakan karakter alfabet untuk penyimpanan, jadi Anda bisa menggunakan mis.^
Alih-alihJ
dan tidak perlu spasi setelahnya. Anda memiliki jauh lebih banyak$
daripada biasanya dalam program golf yang bagus: pertimbangkan apakah Anda dapat menguranginya menggunakan beberapa kombinasi\@.
.$
referensi.g
dari artikel Wikipedia, dan gunakan,
dan/
.{,{\2$+\)%}*)\;}:f;
Pastikan Anda mengerti mengapa ini bekerja;)k
di dalam loop dan kemudian 2 lagi untuk membuangnya di akhir, kita bisa menariknya ke dalam menggunakan+
untuk turun ke 17 karakter:{{@+\)%}+\,*)}:f;
Saya ragu itu bisa ditingkatkan.R, 48
Menjalankan Versi dengan contoh: http://ideone.com/i7wae
sumber
Groovy, 36 byte
sumber
Haskell, 68
Apakah simulasi yang sebenarnya. Demonstrasi:
sumber
Scala, 53 byte
sumber
C, 88 karakter
Apakah simulasi, tidak menghitung rumus.
Jauh lebih lama dari rumus, tetapi lebih pendek dari simulasi C lainnya.
Catatan:
1. Mengalokasikan memori dan tidak pernah melepaskan.
2. Alokasikan
n*8
bukannyan*4
, karena saya gunakanp[n]
. Bisa mengalokasikan(n+1)*4
, tetapi lebih banyak karakter.sumber
C ++, 166 byte
Golf:
Tidak Terkumpul:
sumber
J
fungsi tersebut, dengan menggunakan operator ternary.intn
dalam versi golf Anda tidak akan dikompilasi#include <list>
J, 8 byte
sumber
Ruby, 39 byte
Menjalankan versi dengan kasus uji: http://ideone.com/pXOUc
sumber
Q, 34 byte
Pemakaian:
sumber
Ruby, 34 byte
sumber
Haskell, 29
Menggunakan rumus dari wikipedia.
sumber
JavaScript (ECMAScript 5), 48 byte
Menggunakan ECMAScript 5 karena itu adalah versi terbaru dari JavaScript pada saat pertanyaan ini diajukan.
Versi ES6 (non-bersaing), 33 byte
Penjelasan
Tidak banyak bicara di sini. Saya hanya mengimplementasikan fungsi yang diberikan artikel Wikipedia kepada saya.
sumber
05AB1E , 11 byte
Cobalah online!
sumber
8 , 82 byte
Kode
SED (Stack Effect Diagram) adalah:
n k -- m
Penggunaan dan penjelasan
Algoritma menggunakan array bilangan bulat seperti ini: jika nilai orang adalah 5 maka array akan menjadi [1,2,3,4,5]
sumber
J , 24 byte
Cobalah online!
Pendekatan berulang berdasarkan solusi pemrograman dinamis.
Penjelasan
sumber
J , 19 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Dart , 33 byte
Cobalah online!
sumber
Japt , 15 byte
Cobalah online!
Satu byte bisa disimpan dengan pengindeksan 0 k , tetapi sebenarnya bukan indeks, jadi saya memutuskan untuk tidak melakukannya.
Penjelasan:
sumber
Japt
-h
, 10 byteCobalah
sumber
Powershell, 56 byte
Penting! Script menyebut dirinya secara rekursif. Jadi simpan skrip sebagai
f.ps1
file di direktori saat ini. Anda juga dapat memanggil variabel blok skrip alih-alih file skrip (lihat skrip pengujian di bawah). Panggilan itu memiliki panjang yang sama.Skrip uji:
Keluaran:
sumber