Ada N pintu dan K monyet. Awalnya, semua pintu ditutup.
Babak 1: Monyet pertama mengunjungi setiap pintu dan menghidupkannya (jika pintu itu tertutup, ia akan membukanya; jika terbuka, ia akan ditutup).
Babak 2 : Monyet pertama mengunjungi setiap pintu dan menghidupkannya. Kemudian Monyet ke-2 mengunjungi setiap pintu ke-2 dan mematikannya.
. . .
. . .
Babak k: Monyet pertama mengunjungi setiap pintu dan mematikan pintu. . . . . . . . . . Monyet k mengunjungi setiap pintu k dan beralih ke pintu.
Input: NK (dipisahkan oleh satu spasi)
Keluaran: Nomor pintu yang terbuka, masing-masing dipisahkan oleh satu ruang.
Contoh :
Input: 3 3
Output: 1 2
Kendala :
0 <N <101
0 <= K <= N
Catatan :
Asumsikan N pintu diberi nomor dari 1 hingga N dan K monyet diberi nomor dari 1 hingga K
Yang dengan kode terpendek menang. Juga, tampilkan output untuk N = 23, K = 21
sumber
n=k=3
akan output1 2
jadi ur salah ... dan 5 output1 2 4
ada pola tetapi banyak yang kurang jelas dari itu.Jawaban:
APL,
322826Penjelasan
{+/0=⍺|⍨⍳⍵}
adalah fungsi yang mengembalikan berapa kali pintu⍺
(argumen kiri) beralih di putaran⍵
(argumen kanan), yang sama dengan jumlah faktor⍺
yang ≤⍵
:⍳⍵
Hasilkan array numerik dari 1 hingga⍵
⍺|⍨
Hitung⍺
modulus setiap item dari array itu0=
Ubah ke 1 di mana ada 0, dan 0 untuk setiap hal lainnya+/
Jumlah array yang dihasilkanFungsi luar:
(⍳⍺)
,⍳⍵
Buat array dari 1 ke N dan 1 ke K∘.{...}
Untuk setiap pasangan elemen dari dua array, terapkan fungsi. Ini memberikan matriks berapa kali beralih, setiap baris mewakili pintu dan setiap kolom mewakili putaran.+/
Jumlah kolom. Ini memberikan array tentang berapa kali setiap pintu diputar di semua putaran.2|
Modulus 2, jadi jika pintu terbuka, itu adalah 1; jika ditutup, itu adalah 0.(...)/⍳⍺
Terakhir, hasilkan array dari 1 hingga N dan pilih hanya yang memiliki 1 di array pada langkah sebelumnya./⎕
Terakhir, masukkan fungsi antar angka dari input.EDIT
,↑⍳¨⍳⍵
Hasilkan semua "monyet" (Jika K = 4, maka ini1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4
)⍳⍵
Array dari 1 ke⍵
(K)⍳¨
Untuk masing-masing dari itu, menghasilkan array dari 1 ke nomor itu,↑
Ubah array bersarang menjadi sebuah matriks (↑
) dan kemudian pisahkan ke array sederhana (,
)(,↑⍳¨⍳⍵)∘.|⍳⍺
Untuk setiap angka dari 1 hingga⍺
(N), mod dengan masing-masing monyet.0=
Ubah ke 1 di mana ada 0, dan 0 untuk setiap hal lainnya. Ini memberikan matriks toggle: Baris adalah masing-masing monyet di setiap putaran, kolom adalah pintu; 1 berarti toggle, 0 berarti no toggle.+⌿
Jumlahkan baris untuk mendapatkan array berapa kali setiap pintu di-toggleBagian lain tidak berubah
EDIT
Gunakan XOR kurangi (
≠⌿
) alih-alih jumlah dan mod 2 (2|+⌿
)sumber
{}/
alih-alih hanya mengambil N dan K sebagai argumen ke dfn?i←⍳⍺
GolfScript, 33 karakter
Jika pintu diberi nomor mulai dari nol akan menghemat 3 karakter.
Contoh ( online ):
sumber
Mathematica, 104 karakter
Contoh:
sumber
{n,k}=%~Read~{Number,Number}
.Ruby, 88
Berdasarkan jawaban @ manatwork.
Global yang cerdik itu selalu mematahkan sorotan sintaksis!
sumber
count
sedikit yang dapat ditingkatkan lebih lanjut, saya berharap ruby memiliki#sum
metode bawaan untuk hal-hal seperti itu:>Python 3,
9784Jika monyet muncul dalam jumlah putaran genap, itu sama sekali tidak berubah. Jika seekor monyet muncul dalam jumlah genap, itu sama dengan persis satu putaran.
Dengan demikian beberapa monyet dapat ditinggalkan, dan yang lainnya hanya perlu berganti pintu sekali.
Output untuk
23 21
:sumber
range(2-K%2,K+1,2)
untukrange(K,0,-2)
.for
loop denganwhile
loop:while K>0:r^=set(range(K,N+1,K));K-=2
R - 74
Simulasi:
sumber
javascript
148127di sini adalah versi yang dapat dibaca (sedikit):
Biola DEMO
saya harus mencatat bahwa itu mulai menghitung dari 0 (secara teknis kesalahan satu-per-satu)
sumber
b=Array(n);
Ini menginisialisasi array Anda sebagai n panjangnya diisi dengan yang tidak ditentukan. ! Tidak terdefinisi benar, jadi monyet pertama akan mengubah semuanya menjadi trues.+1
JavaScript, 153
Output untuk N = 23, K = 21:
Diuji di Chrome, tetapi tidak menggunakan fitur-fitur ECMAScript baru yang mewah, jadi harus berfungsi di browser apa pun!
Saya tahu saya tidak akan pernah menang melawan entri lain dan bahwa @tryingToGetProgrammingStrainght sudah mengirimkan entri dalam JavaScript, tapi saya tidak mendapatkan hasil yang sama untuk N = 23, K = 21 karena semua orang mendapatkan itu, jadi saya pikir saya akan mencoba versi saya sendiri.
Sunting : sumber beranotasi (dalam melihat ini lagi, saya melihat tempat untuk menyimpan 3 karakter lainnya, jadi mungkin masih dapat ditingkatkan ...)
sumber
+1
Ruby - 65 karakter
Ini perhitungannya, dalam pseudo-code:
Jika Anda tidak yakin bahwa ungkapan untuk s (d) benar, lihat seperti ini:
sumber
n
dank
dari mana? Dan hasilnya tampaknya dipisahkan oleh baris baru daripada spasi.PowerShell: 132
Kode Golf:
Tidak Golf, Kode Komentar:
sumber
Powershell, 66 byte
Skrip uji:
Keluaran:
sumber