Tentang Seri
Pertama, Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang seri sama sekali. Namun, ada papan peringkat di semua tantangan. Anda dapat menemukan papan peringkat bersama dengan beberapa informasi lebih lanjut tentang seri di posting pertama .
Meskipun saya memiliki banyak ide untuk seri ini, tantangan di masa depan belum ditetapkan. Jika Anda memiliki saran, beri tahu saya di pos kotak pasir yang relevan .
Lubang 4: Paradox Bertrand
The Bertrand Paradoks merupakan masalah yang menarik, yang menunjukkan metode bagaimana yang berbeda untuk memilih akord acak dalam lingkaran dapat menghasilkan distribusi yang berbeda dari akord, titik-titik tengah mereka dan panjang mereka.
Dalam tantangan ini, Anda diharapkan membuat akor acak dari lingkaran unit, menggunakan metode "benar", yaitu yang menghasilkan distribusi akor yang tidak berubah pada penskalaan dan terjemahan. Dalam artikel Wikipedia yang ditautkan, "Metode 2" adalah metode semacam itu.
Berikut aturan yang tepat:
- Anda harus mengambil satu bilangan bulat positif
N
yang menentukan berapa banyak akor yang harus dikembalikan. Outputnya harus berupa daftarN
akor, masing-masing ditentukan sebagai dua titik pada lingkaran satuan, yang diberikan oleh sudut kutubnya dalam radian. - Kode Anda harus dapat mengembalikan setidaknya 20 nilai yang berbeda untuk masing-masing dari dua sudut . Jika RNG Anda yang tersedia memiliki rentang yang lebih kecil, Anda harus terlebih dahulu membangun RNG dengan rentang yang cukup besar di atas built-in satu atau Anda harus menerapkan RNG Anda sendiri yang sesuai . Halaman ini mungkin bermanfaat untuk itu.
- Distribusi akord harus dapat dibedakan dari yang dihasilkan oleh "Metode 2" dalam artikel Wikipedia yang ditautkan. Jika Anda menerapkan algoritma yang berbeda untuk memilih akor, harap sertakan bukti kebenaran. Algoritma apa pun yang Anda pilih untuk diterapkan, secara teoretis harus dapat menghasilkan akor yang valid dalam lingkaran unit (kecuali batasan PRNG yang mendasari atau tipe data presisi terbatas).
- Implementasi Anda harus menggunakan dan mengembalikan angka floating-point (lebar minimal 32 bit) atau angka fixed-point (setidaknya lebar 24 bit) dan semua operasi aritmatika harus akurat dalam paling banyak 16 ulp .
Anda dapat menulis program atau fungsi lengkap dan mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan menghasilkan output melalui STDOUT (atau alternatif terdekat), mengembalikan nilai fungsi atau parameter fungsi (keluar).
Keluaran mungkin dalam format daftar atau string yang mudah, selama nomor individual jelas dapat dibedakan dan jumlah totalnya selalu genap.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang. Dan tentu saja, pengiriman terpendek per pengguna juga akan masuk ke papan peringkat keseluruhan seri.
Visualisasi
Anda dapat menggunakan potongan berikut untuk membuat garis yang dihasilkan dan memeriksa distribusinya. Cukup rekatkan daftar pasang sudut ke area teks. Cuplikan harus dapat menangani hampir semua format daftar, asalkan angkanya adalah angka desimal sederhana (tidak ada notasi ilmiah). Saya sarankan Anda menggunakan setidaknya 1000 baris untuk mendapatkan ide distribusi yang bagus. Saya juga memberikan beberapa contoh data untuk berbagai metode yang disajikan dalam artikel di bawah ini.
Contoh data yang dihasilkan dengan metode 1.
Contoh data yang dihasilkan dengan metode 2.
Contoh data yang dihasilkan dengan metode 3.
Papan peringkat
Pos pertama dari seri ini menghasilkan papan peringkat.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)
Pyth,
252322 bytePort jawaban C ++ 11 rcrmn. Ini adalah penggunaan pertama saya di Pyth, dan saya punya banyak kesenangan!
Versi 23 byte:
Potong satu byte dengan mengubah program untuk menggunakan lipatan + jumlah dan mengatur J ke tupel, menghapus K.
Asli:
Potong 2 byte berkat @orlp.
Penjelasan:
sumber
*2_
sama dengany_
. VariabelZ
awalnya 0, sehingga Anda dapat menghapus spasi.tO0 4
dengan menulis.tOZ4
.,+JK-JK
y
dan lupa tentangZ
. Tetap; Terima kasih!Julia, 48 byte
Ini menggunakan algoritma metode 2, seperti sebagian besar jawaban sejauh ini. Ini menciptakan fungsi lambda yang mengambil input integer dan mengembalikan array nx 2. Untuk menyebutnya, berikan nama, mis
f=n->...
.Penjelasan + tidak dikumpulkan:
Saya sangat suka bagaimana visualisasi terlihat, jadi saya akan memasukkan satu. Ini hasil dari
f(1000)
.sumber
Pyth, 22 byte
Port jawaban C ++.
Saya punya solusi 23 byte lainnya(Sekarang 22!), Tapi itu hampir merupakan salinan jawaban pyth @ kirbyfan64sos dengan optimisasi, jadi saya harus berpikir sedikit di luar kotak dan secara kreatif (ab) menggunakan operator flip.Perhatikan bahwa ini tidak berfungsi sekarang karena bug di operator lipat setelah pengenalan
reduce2
. Saya mengajukan permintaan tarik.Untuk refence ini adalah solusi saya yang lain yang bekerja dengan cara yang sama:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
sumber
IDL, 65 byte
Jelas ini adalah algoritma yang sama dengan @rcrmn, meskipun saya mendapatkannya sendiri sebelum membaca jawaban mereka.
Fungsi acak IDL menggunakan Mersenne Twister, yang memiliki periode 2 19937 -1.
EDIT: Saya menjalankan 1000 akor melalui visualizer di atas, berikut adalah screenshot dari hasilnya:
sumber
C ++ 11, 214 byte
Jadi ini adalah implementasi langsung dari algoritma yang tepat dari halaman wikipedia. Masalah utama di sini dalam bermain golf adalah nama yang sangat panjang yang dimiliki kelas generator acak. Tapi, berbeda dengan rand bagus, setidaknya seragam dengan benar.
Penjelasan:
sumber
M_PI_2
terlihat mencurigakan. Saya pikir itu harus 1 sebagai gantinya.APL, 46 byte
Program APL pertama saya! Tentunya ini bisa sangat ditingkatkan (karena pemahaman saya tentang APL secara keseluruhan masih kurang), jadi setiap saran akan sangat fantastis. Ini menciptakan fungsi
f
yang mengambil integer sebagai input, menghitung pasangan titik akor menggunakan metode 2, dan mencetak setiap pasangan yang dipisahkan oleh baris baru.Anda dapat mencobanya secara online !
Penjelasan:
Catatan: Solusi 19-byte saya sebelumnya tidak valid karena kembali (x, y) daripada (x + y, xy). Kesedihan berlimpah.
sumber
Java, 114 byte
Implementasi dasar di java. Gunakan sebagai ekspresi lambda.
Contoh penggunaan
sumber
Math
suatu tempat? Atau sesuatu? (Saya bukan programmer Java)Math
ditampilkan. Apa yang dikatakan oleh meta tentang menggunakan kode untuk menghasilkan kode lain untuk menyelesaikan masalah?Ruby, 72 byte
Golf pertamaku di sini! Saya menggunakan kode yang sama dengan semua orang, saya harap tidak apa-apa
sumber
Jawa, 115
123Ini pada dasarnya sama dengan kebanyakan orang lain, tetapi saya membutuhkan skor Java untuk lubang ini, jadi begini:
1000 chord sampel dapat ditemukan di pastebin , berikut adalah lima pertama dari satu kali run:
sumber
CJam,
2422 byteMirip dengan algoritma lain, ini adalah versi dalam CJam.
Input 1000 menghasilkan distribusi seperti:
Bagaimana itu bekerja
Algoritma itu sederhana
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Pembaruan : 2 byte disimpan berkat Martin!
Coba di sini
sumber
Python 3,
144117 byte(terima kasih kepada Blckknght untuk
lambda
penunjuknya)Menggunakan metode yang sama dengan yang lain:
Dari dokumentasi Python:
Keluaran
Dan seterusnya.
Visualisasi
sumber
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
sumber
R,
60565349 byteTambahan 4 byte berkat @JayCe dan mengubahnya menjadi fungsi.
Menggunakan rumus dasar yang sama dengan yang lain. R menggunakan metode Mersenne-Twister secara default, tetapi yang lain dapat diatur. Mengeluarkan daftar yang dipisahkan ruang.
Cobalah online!
sumber
SmileBASIC, 62 byte
sumber