Golf ini membutuhkan perhitungan faktorial untuk dibagi di antara beberapa utas atau proses.
Beberapa bahasa membuat ini lebih mudah untuk dikoordinasikan daripada yang lain, jadi itu adalah bahasa agnostik. Kode contoh tidak disediakan disediakan, tetapi Anda harus mengembangkan algoritma Anda sendiri.
Tujuan dari kontes ini adalah untuk melihat siapa yang dapat menghasilkan algoritma faktorial multicore terpendek (dalam byte, bukan detik) untuk menghitung N! yang diukur dengan suara ketika kontes ditutup. Seharusnya ada keuntungan multicore, jadi kami akan mengharuskan itu harus bekerja untuk N ~ 10.000. Pemilih harus memilih jika penulis gagal memberikan penjelasan yang valid tentang bagaimana ia menyebar pekerjaan di antara prosesor / core dan memilih berdasarkan pada keringkasan golf.
Untuk rasa ingin tahu, silakan kirim beberapa angka kinerja. Mungkin ada tradeoff kinerja vs golf di beberapa titik, pergi dengan golf selama memenuhi persyaratan. Saya ingin tahu ketika ini terjadi.
Anda dapat menggunakan perpustakaan integer tunggal inti tunggal yang tersedia secara normal. Misalnya, perl biasanya dipasang dengan bigint. Namun, perhatikan bahwa hanya memanggil sistem yang disediakan fungsi faktorial biasanya tidak akan membagi pekerjaan menjadi beberapa core.
Anda harus menerima dari STDIN atau ARGV input N dan output untuk STDOUT nilai N !. Anda secara opsional dapat menggunakan parameter input ke-2 untuk juga menyediakan jumlah prosesor / inti untuk program sehingga tidak melakukan apa yang akan Anda lihat di bawah :-) Atau Anda dapat mendesain secara eksplisit untuk 2, 4, apa pun yang Anda miliki.
Saya akan memposting contoh perl aneh saya sendiri di bawah ini, yang sebelumnya dikirimkan pada Stack Overflow di bawah Algoritma Faktorial dalam Berbagai Bahasa . Ini bukan golf. Banyak contoh lain diajukan, banyak dari mereka golf tetapi banyak yang tidak. Karena perizinan yang serupa, jangan ragu untuk menggunakan kode dalam contoh apa pun di tautan di atas sebagai titik awal.
Kinerja dalam contoh saya kurang bagus karena sejumlah alasan: ia menggunakan terlalu banyak proses, terlalu banyak konversi string / bigint. Seperti yang saya katakan itu adalah contoh yang sengaja aneh. Ini akan menghitung 5.000! di bawah 10 detik pada mesin 4 inti di sini. Namun, dua liner yang lebih jelas untuk / loop berikutnya dapat melakukan 5000! pada salah satu dari empat prosesor dalam 3.6s.
Anda pasti harus melakukan yang lebih baik dari ini:
#!/usr/bin/perl -w
use strict;
use bigint;
die "usage: f.perl N (outputs N!)" unless ($ARGV[0] > 1);
print STDOUT &main::rangeProduct(1,$ARGV[0])."\n";
sub main::rangeProduct {
my($l, $h) = @_;
return $l if ($l==$h);
return $l*$h if ($l==($h-1));
# arghhh - multiplying more than 2 numbers at a time is too much work
# find the midpoint and split the work up :-)
my $m = int(($h+$l)/2);
my $pid = open(my $KID, "-|");
if ($pid){ # parent
my $X = &main::rangeProduct($l,$m);
my $Y = <$KID>;
chomp($Y);
close($KID);
die "kid failed" unless defined $Y;
return $X*$Y;
} else {
# kid
print STDOUT &main::rangeProduct($m+1,$h)."\n";
exit(0);
}
}
Ketertarikan saya pada ini hanyalah (1) mengurangi kebosanan; dan (2) mempelajari sesuatu yang baru. Ini bukan masalah pekerjaan rumah atau penelitian bagi saya.
Semoga berhasil!
