このゴルフでは、要因計算を複数のスレッドまたはプロセスに分割する必要があります。
一部の言語はこれを他の言語よりも調整しやすいため、言語に依存しません。非ゴルフのサンプルコードが提供されていますが、独自のアルゴリズムを開発する必要があります。
コンテストの目標は、Nを計算するための最短(秒単位ではなく、バイト単位)のマルチコア要因アルゴリズムを誰が思い付くかを確認することです。コンテスト終了時の投票数で測定されます。マルチコアの利点があるはずなので、N〜10,000で機能する必要があります。著者がプロセッサ/コア間で作業を分散する方法の有効な説明を提供できなかった場合、投票者は投票し、ゴルフの簡潔さに基づいて投票する必要があります。
好奇心のために、いくつかのパフォーマンスの数値を投稿してください。ある時点でパフォーマンスとゴルフスコアのトレードオフが存在する場合がありますが、要件を満たしている限り、ゴルフを使用します。これがいつ起こるのか知りたいです。
通常利用可能なシングルコアのビッグ整数ライブラリを使用できます。たとえば、perlは通常bigintと共にインストールされます。ただし、階乗関数が提供するシステムを呼び出すだけでは、通常、複数のコアに作業が分割されないことに注意してください。
入力NをSTDINまたはARGVから受け入れ、N!の値をSTDOUTに出力する必要があります。オプションで2番目の入力パラメーターを使用して、プログラムにプロセッサー/コアの数を提供することもできます。これにより、以下に示す内容が実行されなくなります。
以下に、異なる言語の要因アルゴリズムのスタックオーバーフローで以前に提出した、独自の奇数ボールperlの例を投稿します。ゴルフではありません。多数の他の例が提出されました。それらの多くはゴルフですが、多くはそうではありません。シェアライクライセンスのため、上記のリンクの例にあるコードを出発点として自由に使用してください。
私の例のパフォーマンスは、いくつかの理由で不十分です:あまりにも多くのプロセス、過度の文字列/ bigint変換を使用します。私が言ったように、それは意図的に奇妙な例です。5000を計算します!ここでは4コアマシンで10秒未満で。ただし、より明確な2ライナーfor / nextループは5000を実行できます!3.6秒の4つのプロセッサの1つ。
あなたは間違いなくこれよりもうまくやらなければなりません:
#!/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);
}
}
これに対する私の関心は、単に(1)退屈を緩和することです。(2)新しいことを学ぶ。これは私にとって宿題や研究の問題ではありません。
幸運を!
