Für dieses Golfspiel muss eine Fakultätsberechnung auf mehrere Threads oder Prozesse aufgeteilt werden.
Einige Sprachen erleichtern die Koordinierung als andere, daher ist es lang agnostisch. Ungolfed-Beispielcode wird bereitgestellt, Sie sollten jedoch Ihren eigenen Algorithmus entwickeln.
Das Ziel des Wettbewerbs ist es, herauszufinden, wer den kürzesten (in Bytes, nicht in Sekunden) mehrkernigen faktoriellen Algorithmus zur Berechnung von N finden kann! gemessen in Stimmen, wenn der Wettbewerb endet. Es sollte einen Multicore-Vorteil geben, daher wird vorausgesetzt, dass er für N ~ 10.000 funktioniert. Die Wähler sollten abstimmen, wenn der Autor keine gültige Erklärung dafür abgibt, wie er die Arbeit unter den Prozessoren / Kernen verteilt, und auf der Grundlage der Golfpräzision abstimmen.
Bitte geben Sie aus Neugierde einige Leistungszahlen an. Es kann irgendwann zu einem Kompromiss zwischen Leistung und Golf-Score kommen. Spielen Sie Golf, solange dies den Anforderungen entspricht. Ich wäre gespannt, wann dies passiert.
Sie können normal verfügbare Single-Core-Big-Integer-Bibliotheken verwenden. Zum Beispiel wird Perl normalerweise mit bigint installiert. Beachten Sie jedoch, dass das Aufrufen einer vom System bereitgestellten Fakultätsfunktion die Arbeit normalerweise nicht auf mehrere Kerne aufteilt.
Sie müssen den Eingang N von STDIN oder ARGV akzeptieren und den Wert von N! An STDOUT ausgeben. Sie können optional einen zweiten Eingabeparameter verwenden, um auch die Anzahl der Prozessoren / Kerne für das Programm anzugeben, damit es nicht das tut, was Sie unten sehen werden :-) Oder Sie entwerfen explizit für 2, 4, was auch immer verfügbar ist.
Ich werde mein eigenes Oddball-Perl-Beispiel veröffentlichen, das zuvor für Stack Overflow unter Faktorielle Algorithmen in verschiedenen Sprachen eingereicht wurde . Es ist kein Golf. Zahlreiche andere Beispiele wurden eingereicht, viele davon Golf, aber viele nicht. Verwenden Sie den Code in den Beispielen im obigen Link als Ausgangspunkt, da es sich um Lizenzen handelt, die sich an Freigaben orientieren.
Die Leistung in meinem Beispiel ist aus mehreren Gründen mangelhaft: Sie verwendet zu viele Prozesse und zu viel String / Bigint-Konvertierung. Wie gesagt, es ist ein absichtlich komisches Beispiel. Es wird 5000 berechnen! in weniger als 10 Sekunden auf einem 4-Kern-Rechner hier. Ein offensichtlicherer Zwei-Liner für die nächste Schleife kann jedoch 5000 leisten! auf einem der vier Prozessoren in 3.6s.
Du musst es definitiv besser machen:
#!/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);
}
}
Mein Interesse daran ist einfach (1) Langeweile zu lindern; und (2) etwas Neues lernen. Dies ist für mich kein Problem mit Hausaufgaben oder Nachforschungen.
Viel Glück!
