Guru saya sangat tidak senang dengan Pekerjaan Rumah Mars saya . Saya mengikuti semua aturan, tetapi dia mengatakan bahwa apa yang saya hasilkan adalah omong kosong ... ketika dia pertama kali melihatnya, dia sangat curiga. "Semua bahasa harus mengikuti hukum Zipf, blah blah blah" ... Aku bahkan tidak tahu apa itu hukum Zipf!
Ternyata hukum Zipf menyatakan bahwa jika Anda memplot logaritma frekuensi setiap kata pada sumbu y, dan logaritma "tempat" setiap kata pada sumbu x (paling umum = 1, kedua paling umum = 2, commmon paling ketiga = 3, dan seterusnya), maka plot akan menunjukkan garis dengan kemiringan sekitar -1, memberi atau mengambil sekitar 10%.
Misalnya, inilah plot untuk Moby Dick:
Sumbu x adalah kata ke- n yang paling umum, sumbu-y adalah jumlah kemunculan kata ke- n yang paling umum. Kemiringan garis adalah sekitar -1,07.
Sekarang kita sedang meliput Venesia. Untungnya, orang-orang Venesia menggunakan alfabet latin. Aturannya adalah sebagai berikut:
- Setiap kata harus mengandung setidaknya satu vokal (a, e, i, o, u)
- Dalam setiap kata bisa ada hingga tiga vokal berturut-turut, tetapi tidak lebih dari dua konsonan berturut-turut (konsonan adalah huruf apa pun yang bukan vokal).
- Tidak ada kata yang lebih panjang dari 15 huruf
- Opsional: kelompokkan kata ke dalam kalimat yang panjangnya 3-30 kata, dibatasi oleh titik
Karena guru itu merasa saya selingkuh dengan pekerjaan rumah saya di Mars, saya ditugaskan menulis esai setidaknya 30.000 kata (dalam bahasa Venesia). Dia akan memeriksa pekerjaan saya menggunakan hukum Zipf, jadi ketika sebuah garis dipasang (seperti dijelaskan di atas) kemiringan harus paling banyak -0,9 tetapi tidak kurang dari -1.1, dan dia ingin kosakata minimal 200 kata. Kata yang sama tidak boleh diulang lebih dari 5 kali berturut-turut.
Ini adalah CodeGolf, jadi kode terpendek dalam byte menang. Silakan tempelkan output ke Pastebin atau alat lain tempat saya dapat mengunduhnya sebagai file teks.
Jawaban:
Mathematica, 102 byte
Fungsi yang tidak disebutkan namanya tidak menerima input dan mengembalikan string yang terdiri dari 40.320 kata Venus tiga huruf dengan spasi tambahan.
Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]
menghasilkan 216 kata tiga huruf yang mungkin hanya menggunakan huruf "vaeiou", masing-masing dengan ruang trailingnya sendiri. Yang pertama dari kata-kata ini, "vvv", bukan bahasa Venus yang valid, tetapiRest
dibuang begitu saja.Maka
RandomChoice[1/Range@215->...,8!]
menghasilkan 8! = 40.320 pilihan acak dari daftar 215 kata yang dihasilkan, dengan bobot frekuensi ditentukan oleh kebalikan dari 215 bilangan bulat pertama (1/Range@215
). Akhirnya,<>""...
menyatukan string dalam daftar yang dihasilkan.Outputnya jauh dari deterministik; satu run menghasilkan esai Venus ini .
Mathematica, 129 byte
Yang ini deterministik. Himpunan dasar dari 215 kata adalah sama, tetapi sekarang setiap kata diulangi beberapa kali dengan tepat (kata #j diulang kira-kira 7! / J kali) untuk memaksa hukum zipf berlaku. Kemudian kata-kata itu disisipkan secara sama untuk menghindari pengulangan. (Bayangkan setiap kata diletakkan di atas penggaris, dengan semua salinan dari kata itu ditempatkan dengan jarak yang sama; ketika semua kata dibaca berurutan, tidak ada kata tertentu yang akan berulang banyak, mungkin tidak sama sekali.) Hasilnya adalah 30,117 kata. Esai Venus .
sumber
vva
muncul enam kali berturut-turut. Saya pikir mungkin ada masalah yang lebih besar ... seharusnya tidak menantang jawaban bekerja setiap saat? (Dan jika tidak, bagaimana Anda menarik garis tentang seberapa besar kemungkinan mereka akan bekerja?)05AB1E ,
343332 byteCobalah online!
Saya pikir ini masih cukup golf! Misalnya konstanta numerik dan
vNy<FD}
mungkin golf.Contoh keluaran
Bagaimana cara kerjanya?
Ini menghasilkan semua kombinasi kata yang mengikuti aturan "vowel + vowel + konsonan", yang menghasilkan 525 kata unik yang valid (lebih dari 200). Ini kemudian mengaitkan dengan masing-masing dari mereka frekuensi yang memenuhi hukum di
f(x) = 4725/x
manax
adalah peringkat kata saat ini, mulai dari 1 dan berakhir pada 525. Kemudian frekuensinya dinormalisasi dan dikalikan sehingga setidaknya ada 30000 kata. Kode ini selalu menghasilkan 32074 kata untuk membuat konstanta yang terlibat golf (lihat penjelasan kode). Jadi setiap kata diulangi berapa kali sesuai dengan frekuensi kata yang sama. Akhirnya kata-kata itu dikocok. Namun itu tidak menjamin bahwa sebuah kata tidak pernah diulang lima kali berturut-turut. Oleh karena itu program menghasilkan lebih dari 200 kata unik yang diperlukan untuk mengurangi kemungkinan kata diulang lima kali berturut-turut. Harap perhatikan bahwa kode ini selalu menghasilkan urutan kata yang sama. Satu-satunya hal yang berbeda antara dua putaran adalah hasil dari operasi pengocokan.Bagaimana cara mengevaluasi frekuensi?
Saya membuat kode Python3 sederhana yang mengambil teks dalam file bernama "output" (dari sudut pandang algoritma, itu masuk akal!) Dan output ke "stats.csv".
Yang selalu menghasilkan distribusi berikut untuk kode saya:
Jadi kemiringannya adalah -1.0138. Nilai ini sekarang kurang mendekati -1 daripada kemiringan kode sebelumnya, tetapi masih memenuhi kendala kemiringan.
sumber
Bash / Core Utils,
122110 byteBelum dibuka:
The
for w
Loop menghasilkan 243 kata-kata yang berbeda.let ++x;
kenaikan awalnya tidak diset x (per aturan ekspresi aritmatika selama eksekusi pertama,x
diperlakukan sebagai 0 dan dengan demikian kenaikannya menetapkan ke 1). Baris selanjutnya dengan demikian menghasilkan kata-kata berikutnya pada frekuensi 5575 / x untuk memperkirakan frekuensi zipf.Langkah selanjutnya adalah mengubah urutan ini agar sesuai dengan persyaratan pengulangan; meskipun
--random-source
merupakan nama bendera yang sangat besar, menggunakannya dengan shuf mengalahkan hitungan char dari tangan menggulung pemilih mul-mod.yes ae
sebenarnya adalah perangkat "acak" terpendek yang saya patuhi.Ini menghasilkan esai 33729 kata ini [pastebin] .
Bash / Core Utils,
9684 byte (tidak bersaing)Untuk pendekatan non-deterministik, cukup potong bendera shuf:
Analisis
Kemiringan zipf disetel agar lurus. Menggunakan Excel untuk plot pada skala logaritmik:
Guru harus memperhatikan kemiringan zipf = -1,000764.
sumber