Anda harus menulis sebuah program, mengimplementasikan suatu fungsi digitsum(int i)
. Program harus memodifikasi kode sendiri (untuk bahasa, di mana ini tidak mungkin dengan refleksi , harap kreatif) untuk mendapatkan sendiri untuk menyelesaikan tujuan.
Anda mulai dengan
function digitsum(int i){
return i;
}
dan mengimplementasikan algoritma evolusioner yang akan memodifikasi fungsi di atas sampai mengembalikan digit yang valid pada panggilan fungsi.
Karena ini adalah kontes popularitas, Anda memiliki banyak tangan gratis, harap kreatif!
Pedoman:
- Mulai dengan fungsi yang ditentukan (diterjemahkan ke bahasa Anda tentu saja).
- Cetak setidaknya fungsi yang paling sesuai dari setiap generasi.
- Cetak solusi kerja Anda yang teruji 0 <i <10000.
- Jadilah kreatif!
Tidak:
- Petunjuk program Anda untuk solusinya, silakan gunakan seluruh pilihan bahasa Anda!
- Lempar kesalahan ke konsol.
- Gunakan input eksternal apa pun. Anda dapat menulis dan menyimpan ke file yang dibuat oleh program Anda. Tidak ada internet.
Solusi yang valid dengan kemenangan terbanyak!
popularity-contest
reggaemuffin
sumber
sumber
no libraries
diizinkan berarti tidak ada libc?no libraries
karena akan menjadi imo yang rumit, sehingga pemilih dapat memutuskan apakah ada banyak perpustakaan yang digunakan!Jawaban:
C #
Hampir seluruhnya solusi perakitan acak dan mentah. Sejauh C # dan hampir semua platform lain berjalan, ini serendah mungkin. Untungnya, C # memungkinkan Anda untuk mendefinisikan metode selama runtime di IL (IL adalah bahasa perantara, kode byte .NET, mirip dengan assembly). Satu-satunya batasan kode ini adalah saya memilih beberapa opcode (dari ratusan) dengan distribusi sewenang-wenang yang akan diperlukan untuk solusi sempurna. Jika kami mengizinkan semua opcode, kemungkinan program kerja tidak ada, jadi ini perlu (seperti yang dapat Anda bayangkan, ada banyak cara instruksi perakitan acak dapat macet, tetapi untungnya, mereka tidak menjatuhkan seluruh program dalam .NET). Selain rentang opcodes yang mungkin, opcode IL mengiris dan dicing sepenuhnya acak tanpa jenis petunjuk apa pun.
Maaf saya tidak mendapatkan hasil sejauh ini karena bahkan dengan pengujian untuk 1..99 (bukan 1..9999) cukup lambat dan saya terlalu lelah. Akan kembali lagi besok.
EDIT: Saya menyelesaikan program dan banyak tweak. Sekarang, jika Anda menekan CTRL-C, itu akan menyelesaikan proses sekarang dan menghasilkan hasilnya dalam file. Saat ini, satu-satunya solusi yang layak yang dihasilkannya adalah program yang selalu menghasilkan angka konstan. Saya mulai berpikir bahwa peluang program kerja yang lebih maju secara astronomis kecil. Pokoknya saya akan tetap berjalan selama beberapa waktu.
EDIT: Saya terus mengutak-atik algoritme, ini mainan yang sempurna untuk geek seperti saya. Saya pernah melihat program yang dihasilkan yang benar-benar melakukan beberapa matematika acak dan tidak selalu mengembalikan angka konstan. Akan luar biasa untuk menjalankannya di beberapa juta CPU sekaligus :). Akan terus menjalankannya.
EDIT: Inilah hasil dari beberapa matematika yang benar-benar acak. Melompat sekitar dan tetap di 17 untuk sisa indeks. Ini tidak akan menjadi sadar dalam waktu dekat.
EDIT: Semakin rumit. Tentu saja, seperti yang Anda harapkan, itu tidak seperti algoritma digitsum yang tepat, tetapi berusaha keras. Lihat, program perakitan yang dihasilkan komputer!
sumber
C #
Ini mungkin tidak sepenuhnya sesuai dengan apa yang Anda bayangkan, tetapi ini adalah yang terbaik yang bisa saya lakukan sekarang. (Setidaknya dengan C # dan CodeDom).
Jadi cara kerjanya:
((i & v1) >> v2)
. Istilah-istilah ini akan menjadi gen yang akan dimutasi melalui proses.Kode:
Diuji pada OSX dengan kompiler Mono C # versi 3.2.6.0.
Pada setiap iterasi mencetak nilai kebugaran dari perhitungan saat ini. Pada akhirnya akan mencetak solusi terbaik bersama dengan kebugarannya. Loop akan berjalan hingga salah satu hasil memiliki nilai kebugaran 0.
Beginilah awalnya:
Dan setelah beberapa saat (memakan waktu sekitar 30 menit), ini adalah bagaimana itu berakhir (menunjukkan iterasi terakhir dan hampir terakhir):
Catatan:
a >> b
saya menggunakana / 2^b
return i;
seperti yang dipersyaratkan oleh masalah.i & a >> a
bukani & a >> b
, karena dalam kasus terakhir evolusi terlalu lambat untuk praktis.return (i&a>>b)+(i&c>>d)+...
, karena jenis lain (seperti mencoba untuk menghasilkan kode "tepat", dengan loop, tugas, pemeriksaan kondisi, dll.) Akan menyatu terlalu lambat. Juga dengan cara ini sangat mudah untuk mendefinisikan gen (masing-masing istilah), dan sangat mudah untuk bermutasi.0..10000
(jika Anda memeriksa solusi yang ditemukan Anda dapat melihat bahwa itu tidak akan bekerja untuk angka yang lebih besar dari 16384)sumber
Javascript
Yah, saya punya beberapa masalah presisi floating point dengan jawaban saya - yang mungkin dapat dipecahkan menggunakan perpustakaan BigDecimal - ketika angka input lebih besar dari
55
.Ya, itu jauh dari
10000
jadi saya tidak berharap untuk menang tetapi masih merupakan metode yang menarik berdasarkan topik ini .Itu menghitung [interpolasi polinomial] ( http://en.wikipedia.org/wiki/Polynomial_interpolation ) berdasarkan satu set poin, sehingga hanya menggunakan perkalian, pembagian dan penambahan, tidak ada operator modulo atau bitwise.
Fungsi output:
Fungsi polinomial ini (disederhanakan ke tingkat 25 dan tanpa pembulatan) diplot, lihat nilai untuk bilangan bulat (dapat dibaca untuk [6; 19]):
Tes:
sumber