Ada pertanyaan di situs ini yang mirip dengan pertanyaan ini, tetapi saya telah menambahkan twist.
Anda memiliki tiga input, jumlah orang dalam lingkaran n , orang ke- k yang dihitung pada setiap langkah, dan orang ke- q yang bertahan. Orang-orang di lingkaran diberi nomor 1 hingga n .
Sebagai contoh, dalam lingkaran 20 orang, orang ke 20 yang bertahan adalah orang pertama yang dipindahkan, orang yang selamat ke 19 adalah orang kedua yang dipindahkan dan seterusnya. Biasanya, masalah Yosefus adalah menentukan orang terakhir yang dipindahkan, di sini disebut korban pertama .
Tuliskan program atau fungsi terpendek yang, dengan tiga input itu, mengembalikan jumlah orang ke - q untuk bertahan hidup.
Jika ada masalah dengan kejelasan, harap beri tahu saya.
Beberapa contoh:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Sunting: Asumsikan semua input valid. Itu tidak ada yang akan meminta 0 atau angka negatif dan tidak ada yang akan meminta 20 orang yang selamat dalam lingkaran 5 orang (yaitu, 1 ≤ q ≤ n)
Sunting: Saya akan menerima jawaban pada tengah malam UTC + 7 pada awal 2 Desember.
q=1
ini persis sama dengan pertanyaan Josephus yang terhubung, kan?Jawaban:
Pyth, 16 byte
Cobalah online: Demonstrasi atau Test Suite
Input berupa formulir
k<newline>n<newline>q
.Penjelasan:
sumber
Piet,
280273 kodeSunting: Saya telah menurunkan ini lagi, dan saya pikir saya bisa menurunkannya lebih jauh, tetapi itu masih akan datang. Untuk saat ini, saya senang kerjanya, dan saya punya ruang untuk menandatanganinya di sudut kiri bawah. Dua ide saya harus menyimpan lebih banyak kode adalah a) untuk mengubah instruksi akhir menjadi
pop, push 1, add, out num
(pop n, output r +1) dan b) untuk menggandakan lagi di sudut kiri bawah untuk menyimpan kode dalam manipulasi tumpukan nanti di dalam loop.Gambar di atas adalah kode saya pada 8 piksel per codel. Secara umum, ini adalah algoritma yang sama dengan jawaban Python saya, tetapi dengan input dalam urutan k , q , n . Dalam praktiknya, ada juga banyak manipulasi tumpukan. Anda dapat mencobanya di sini dengan membuka gambar di sana dan menjalankan kodenya.
Penjelasan
Ini adalah ungolfing solusi langkah demi langkah.
sumber
CJam,
222019 byteIni membaca input sebagai
q k n
. Cobalah online di juru bahasa CJam .Bagaimana itu bekerja
sumber
Golfscript,
585655353130 byteDengan asumsi ketiga input sudah ada di stack, dalam urutan n , k , q
Solusi itu mengasumsikan saya harus menyingkirkan semuanya kecuali jawaban terakhir.
Bagaimana itu bekerja
Lihat
j(n,k,q)
dalam solusi Python 3 saya untuk lebih detail.Sunting 1: Digunakan @ saran Doorknob (Menambahkan + untuk mendapatkan semua input ke dalam array)
Dahulu,
Sunting 2: Ditambahkan ~, sesuai aturan wiki, dan disingkat kodenya. Terima kasih @Dennis
Dahulu,
Sunting 3: Menerapkan algoritma yang lebih pendek.
Dahulu,
Sunting 4: Memahami bahwa saya dapat digunakan
%
sebagai peta.Dahulu,
Sunting 5: Suntingan kecil. Berubah
2$
untuk@
membuat[0..q-1]
dan3$
untuk2$
untuk mengambilk
. Menyimpan gigitanDahulu,
sumber
\;\;\;\;
dapat diganti dengan])\;
(wrap in array, right-uncons, swap, dan pop).JavaScript (ES6), 56 byte
Tidak disatukan
Pada dasarnya sebuah adaptasi JavaScript dari jawaban Python @ Sherlock9 .
Uji
sumber
Mathematica, 50 byte
Fungsi anonim. Mengambil input dalam urutan
q,n,k
.sumber
C,
8173 byteDidasarkan pada implementasi Javascript @ user81655 dari jawaban Python saya.
Edit: Dihapus i
Uji
sumber
int
sebelum nama parameter.Python 3,
726662 byteFungsi pemrograman dinamis dalam 62 byte. Diadaptasi dari algoritma di Wikipedia. Dulu ada implementasi langsung dari algoritma ini ketika q = 1 (yaitu i = 1, r = 0) pada halaman itu, tetapi saya melihat bahwa telah dihapus sekarang.
Sunting 1: Saya menghapus
i
untuk menyimpan 4 byte. Penjelasan tetap tidak berubah.Sunting 2: Kesalahan perhitungan dalam jumlah byte. Saya menggunakan
\r\n
untuk EOL dan tidak memperhatikan ketika itu menambahkan 3 byte. Saya telah menurunkan jumlah byte saya sesuai.Bagaimana ini bekerja?
Terima kasih kepada @Dennis untuk mengingatkan saya bahwa saya harus menjelaskan kode saya (jika hanya secara implisit, karena ia memasukkan satu dalam jawabannya). Jika ada sesuatu yang tidak jelas, tolong beritahu saya.
Edit:
Dahulu,
Fungsi berulang yang diadaptasi dari Matematika Beton oleh Graham, Knuth dan Patashnik. Meskipun algoritma ini lebih panjang, lebih cepat untuk n besar dan k kecil .
sumber
+
.PHP, 71 byte
Didasarkan atas jawaban @ Sherlock9. Lihat jawaban Python-nya untuk algoritme.
Atau, inilah pendekatan naif asli saya tanpa algoritma. Ini menggunakan array untuk menandai orang mana yang ditemukan.
91 byte
sumber
Haskell,
484743 byteBerdasarkan algoritma Haskell pada halaman Kode Rosetta dari fungsi Josephus dengan dua input. Saran bermain golf dipersilakan.
Sunting: Terima kasih kepada nimi untuk bantuan golf algoritma pertama melalui menyarankan versi pointfree, dan untuk bantuan golf golf algoritma kedua dengan memberi tahu saya bahwa
until
kata kunci itu ada.Versi algoritma di akhir jawaban Python saya diadaptasi dari Matematika Beton oleh Graham, Knuth dan Patashnik. Meskipun algoritma ini lebih panjang pada 62 byte, dan belum diturunkan sebanyak yang pertama, itu lebih cepat untuk besar
n
dan kecilk
.Tidak Disatukan:
Algoritma pertama
Algoritma kedua
sumber
until
untuk terjemahan (kurang lebih) langsung dari versi Python-2 algoritma:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
dan daftar yang tak terbatas dan segala macam hal. Terima kasih atas bantuan Anda!Bahasa GameMaker (GML), 88 byte
Berdasarkan jawaban @ user81655
sumber
Jelly ,
1413 byteTryItOnline!
Bagaimana?
sumber
Ruby,
5348 byteLambda
Bagaimana itu bekerja
sumber