Tugas Anda di sini adalah untuk mengimplementasikan fungsi 1 yang membentuk permutasi pada bilangan bulat positif (A pemilihan dari bilangan bulat positif ke diri mereka sendiri). Ini berarti bahwa setiap bilangan bulat positif akan muncul tepat sekali dalam permutasi. Tangkapannya adalah fungsi Anda harus memiliki probabilitas lebih besar untuk menghasilkan angka ganjil daripada angka genap.
Sekarang ini mungkin tampak aneh atau tidak mungkin. Tentunya ada angka ganjil sebanyak angka genap? Dan sementara intuisi ini benar untuk set yang terbatas itu sebenarnya tidak berlaku untuk set yang tak terbatas. Sebagai contoh, ambil permutasi berikut:
1 3 2 5 7 4 9 11 6 13 15 8 17 19 10 21 23 12 25 27 14 29 31 16 33 35 18 37 39 20 41 43 22 45 47 24 49 51 26 53 55 ...
Jika Anda mengambil subbagian dari urutan dengan ukuran lebih besar dari Anda akan memiliki setidaknya angka ganjil sebagai angka genap, dengan demikian tampaknya probabilitas dari setiap istilah acak ganjil lebih besar daripada kemungkinan genap. Anda juga akan mencatat setiap nomor ganjil atau genap akhirnya akan muncul dalam urutan dan hanya dapat muncul sekali. Dengan demikian urutannya adalah permutasi sejati.
Definisi Peluang
Untuk menghindari kebingungan atau ambiguitas, saya akan menjabarkan dengan jelas apa yang dimaksud dengan probabilitas dalam pertanyaan ini.
Katakanlah kita memiliki fungsi . Probabilitas bilangan ganjil akan didefinisikan sebagai batas rasio anggota ganjil dari himpunan ke ukuran himpunan karena cenderung menuju infinity.
Misalnya fungsi yang disebutkan di atas akan memiliki kemungkinan ganjil .
Ini adalah kode-golf sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte lebih baik.
Tantangan Ekstra
Berikut adalah beberapa ide yang menyenangkan untuk diajak bermain dan mungkin mencoba untuk diterapkan. Ini hanya untuk bersenang-senang dan tidak mempengaruhi penilaian dengan cara apa pun. Beberapa di antaranya bahkan bukan solusi yang valid untuk tantangan ini, dan jawaban yang hanya mencakup solusi untuk tantangan 2 atau 3 bukanlah jawaban yang valid, dan dapat dihapus .
Tulis permutasi dengan probabilitas ganjil . (ini mungkin)
Tulis permutasi yang memiliki angka ganjil lebih banyak daripada angka genap dalam untuk apa pun tetapi memiliki probabilitas ganjil .
Tulis permutasi yang tidak memiliki probabilitas yang ditentukan (yaitu tidak ada batasan).
1: Di sini fungsi berarti program atau fungsi. Itu hanya sepotong kode yang mengambil input dan menghasilkan output.
Sekam ,
1110 byte-1 byte terima kasih kepada Leo, dan fungsinya yang sedikit berbeda
Ini memiliki probabilitas aneh
1
Cobalah online!
Itu mengindeks urutan:
Penjelasan
sumber
Haskell,
353432 byteMenerapkan urutan contoh
[1,3,2,5,7,4,9,11,6,13,15,8,17,19,10,21,...]
.Cobalah online!
Untuk referensi: versi lama, 34 byte (-1 byte terima kasih kepada @xnor):
Cobalah online!
sumber
(!!)$do ...
Sekam , 8 byte
Cobalah online!
Ini mengimplementasikan contoh urutan (
1,3,2,5,7,4...
).Penjelasan
sumber
Semua orang melakukan Tantangan 1, jadi mari kita lakukan dua lainnya.
Perl 6 , 26 byte - Tantangan 2
Cobalah online!
Hanya saja
1 3 2 5 4 7 6...
Dalam jumlah genap, selalu ada 2 angka ganjil daripada genap. Dalam jumlah ganjil, 1 lagi. Namun ini jelas memiliki batas(n+2)/(2n+2) -> ½
.Perl 6 , 70 byte - Tantangan 3
Cobalah online!
Harus diakui, ini adalah golf yang mengerikan. Itu indeks urutan yang berisi 2⁰ angka ganjil, lalu 2¹ genap, kemudian 2² ganjil, lalu 2³ genap, dan sebagainya.
Probabilitas setelah n "blok" demikian, jika n ganjil, adalah (2⁰ + 2² + 2⁴ + ... + 2ⁿ⁻¹) / (2ⁿ-1). Jumlah dalam pembilang sama dengan ⅓ (4 ½ (n + 1) - 1) = ⅓ (2 n + 1 - 1). Jadi probabilitas setelah jumlah ganjil blok adalah ⅔ (dalam batas).
Jika kita menambahkan satu blok lagi (dan menghitungnya genap n + 1), bagaimanapun, kami tidak menambahkan angka ganjil (pembilang tetap sama) tetapi sekarang ada (2 n + 1 - 1) angka dalam total . Tanda kurung dibatalkan dan kami mendapatkan probabilitas ⅓ (dalam batas).
Ini tampaknya seharusnya memiliki 2 titik kluster yang berbeda, ⅓ dan ⅔, untuk memastikan bahwa batasnya tidak ada, tetapi ini tidak benar-benar membuktikannya. Upaya saya untuk melakukan bukti yang kuat dan kuat dapat ditemukan dalam jawaban Math.SE ini: https://math.stackexchange.com/a/2416990/174637 . Kesalahan memukul disambut.
Perl 6 , 39 byte - Tantangan inti.
Cobalah online!
Meskipun saya memposting jawaban ini karena tantangan 2 dan 3 yang menawarkan teka-teki matematika kecil yang menyenangkan, ada persyaratan ketat untuk semua jawaban berisi solusi untuk tantangan inti. Ini dia.
Ini adalah contoh urutannya.
sumber
Brain-Flak , 120 byte
Cobalah online!
Lakukan fungsi berikut:
Fungsi ini menghasilkan urutan
Fungsi ini memiliki probabilitas ganjil
1
sumber
R, 82 byte (Tantangan ekstra 1)
Cobalah secara Online!
Jika input adalah kuadrat sempurna, berikan angka genap. Kalau tidak, berikan nomor ganjil. Kotak yang sempurna memiliki kepadatan alami 0, yang berarti bahwa urutan ini memberikan angka ganjil dengan probabilitas 1.
sumber
C (gcc) , 29 byte
Cobalah online!
Setiap angka keempat genap:
Tantangan ekstra 1, 52 byte
Cobalah online!
Mengembalikan 2 * (x + 1) jika n sama dengan 2 x dan angka ganjil berturut-turut sebaliknya:
sumber
Brain-Flak ,
140138136 byteCobalah online!
Penjelasan
Ini melakukan fungsi yang mirip dengan yang disarankan dalam pertanyaan.
Sebagian besar kerjanya berdasarkan potongan yang saya buat untuk menggulung tumpukan untuk tumpukan ukuran 3.
Kami menyiapkan dua tumpukan satu dengan nilai akumulator (dua bahkan ganjil genap) dan satu dengan angka
4 4 2
. Setiap iterasi kami menggulung kedua tumpukan dan menambahkan bagian atas tumpukan kiri ke atas tumpukan kanan.Ini akan menambah setiap angka ganjil dengan 4 dan angka genap oleh 2. Saat kita mengulanginya, kita mendapatkan pola 2 ganjil 1, dengan setiap bilangan bulat positif dipukul. Jadi kita hanya mengulang
n
kali dengann
menjadi input. Ini memiliki probabilitas asimtotik 2/3 .sumber
Jelly , 10 byte
Probabilitas odds adalah 2/3 .
Cobalah online!
Bagaimana itu bekerja
sumber
C, 80 byte
Implementasi contoh permutasi dari pertanyaan.
Cobalah online!
sumber
Batch, 36 byte
Menerapkan urutan yang diberikan dalam pertanyaan.
sumber
JavaScript, 23 byte
Output: 1, 3, 5, 2, 7, 9, 11, 4, 13, 15, 17, 6, 19, 21, 23, 8 ...
Tantangan 2:
Output: 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14
sumber
n=>n%4?1.5*n|1:n/2
lebih pendek 5 byte.CJam (21 byte)
Demo online menunjukkan 32 output pertama. Ini adalah blok anonim (fungsi).
Ini juga merupakan solusi untuk menantang 1: angka-angka yang dipetakan ke angka genap adalah kekuatan 2, sehingga kepadatan angka genap dalam output n pertama adalah lg (n) / n yang cenderung nol.
Pembedahan
sumber
Perl 40 byte
sumber
Brain-Flueue , 88 byte
Cobalah online!
Penjelasan
Ini mengimplementasikan fungsi yang sama dengan jawaban terakhir saya tetapi menggunakan model FIFO Brain-Flueue untuk memotong beberapa sudut. Berikut adalah istilah pasangan pertama yang dihasilkannya.
Bagian pertama dari kode ini hanya sedikit pengaturan, kita meletakkan
0,-1,-3
tumpukan pertama dan2,4,4
tumpukan kedua. Itu2,4,4
akan digunakan untuk menggilir angka genap dan ganjil seperti yang saya lakukan dalam jawaban Brain-Flak saya.Kami kemudian mengulangi n kali, setiap kali menambahkan bagian atas tumpukan kiri ke tumpukan kanan. Karena Brain-Flueue menggunakan antrian sebagai lawan tumpukan, nilai-nilai secara alami bergulir ketika kita menyentuh mereka mencegah perlunya kode tambahan.
sumber
-lflueue
Argumen.Python 2 ,
4610455 byteCobalah online!
Salah membaca pertanyaan, sekarang menerapkan fungsi yang dapat digunakan untuk membuat urutan, bukan yang menghasilkan urutan. Juga dikecualikan
0
dari himpunan kemungkinan keluaran.Kemungkinan menemukan bilangan bulat positif ganjil sekarang menyatu
1
.sumber
0
.Jelly , 9 byte
Cobalah online!
Implements
1, 3, 2, 5, 7, 4, 9, 11, 6, ...
(probabilitas 2/3).sumber
05AB1E , 11 byte
Cobalah online!
sumber
Pyth , 9 byte
Coba di sini! atau Tes lebih banyak dalam sekali jalan!
Anda dapat menggunakan kode ini untuk memverifikasi rasio angka ganjil hingga titik tertentu. Ganti
10000
dengan batas yang Anda inginkan (jangan atur jauh lebih tinggi, karena kesalahan memori).Coba di sini .
Di atas memberikan sekitar 0,667 . Peluang sebenarnya dari kejadian aneh adalah 2/3 . Pendekatan ini merupakan implementasi setara dari jawaban Dennis .
Penjelasan
sumber
Java 8, 20 byte
Pelabuhan @nwellnhof 's C jawabannya .
Beberapa hal yang saya coba sendiri ternyata beberapa byte lebih lama atau sedikit salah.
Implements:
1,3,5,2,7,9,11,4,13,15,17,6,19,21,23,8,25,27,29,10,31,33,35,12,37,...
dengan probabilitas
3/4
.Coba di sini.
sumber
Lua,
6753 bytePenjelasan datang ketika saya selesai bermain golf ini :)Program ini mengambil integer melalui argumen baris perintah sebagai input dan mencetak elemen ke-n dari urutan contoh ke STDOUT
Penjelasan
Angka genap dari urutan ini adalah
n
angka genap dann
kelipatan 3, oleh karena itu rumusnyan%3*2
cukup untuk menghasilkannya.Untuk angka ganjil, ini sedikit lebih sulit. Berdasarkan fakta bahwa kami dapat menemukannya tergantung pada arus
n
, kami memiliki tabel berikut:Mari kita sebut nilainya
target-n
i
, kita dapat melihat bahwa setiap kalin%3==2
,i
bertambah. Inilah formula kami:Angka ganjil didasarkan
n
pada yang kami tambahkani
.Nilai
i
kenaikan pada tingkat yang sama dengan divisi euclidian sebesar 3, dengan offset.math.floor(n/3)
memberi kita tingkat kenaikan dann%3-1
memberi kita offset, menjadikannya terjadin%3==2
alih-alihn%3==0
.sumber
...and (n/...
).and n/3*2or
karya yang sama baiknya