이 골프는 여러 스레드 또는 프로세스로 팩토리얼 계산을 분할해야합니다.
일부 언어는이를 다른 언어보다 쉽게 조정할 수 있으므로 언어에 구애받지 않습니다. Ungolfed 예제 코드가 제공되지만 자체 알고리즘을 개발해야합니다.
콘테스트의 목표는 누가 N을 계산하기 위해 가장 짧은 (초가 아닌 바이트 단위) 멀티 코어 팩토리얼 알고리즘을 만들 수 있는지 확인하는 것입니다! 컨테스트가 종료 될 때 투표로 측정됩니다. 멀티 코어 이점이 있어야하므로 N ~ 10,000에서 작동해야합니다. 저자가 작업을 프로세서 / 코어에 분산시키는 방법에 대한 유효한 설명을 제공하지 못하고 골프 간결성을 기반으로 투표하는 경우 유권자는 투표를해야합니다.
호기심을 위해 몇 가지 성능 수치를 게시하십시오. 어떤 시점에서는 성능 대 골프 점수 트레이드 오프가있을 수 있습니다. 골프가 요구 사항을 충족하는 한 골프와 함께하십시오. 언제 이런 일이 발생했는지 궁금합니다.
일반적으로 사용 가능한 단일 코어 큰 정수 라이브러리를 사용할 수 있습니다. 예를 들어, perl은 일반적으로 bigint와 함께 설치됩니다. 그러나 단순히 시스템에서 제공하는 계승 함수를 호출한다고해서 작업이 여러 코어로 분할되지는 않습니다.
STDIN 또는 ARGV에서 입력 N을 승인하고 N! 값을 STDOUT에 출력해야합니다. 선택적으로 두 번째 입력 매개 변수를 사용하여 프로그램에 프로세서 / 코어 수를 제공하여 아래에 표시되는 작업을 수행하지 않도록 할 수 있습니다.
이전 에 다른 언어의 요인 알고리즘 아래 에서 스택 오버플로에 제출 된 내 홀수 펄 예제를 게시 할 것 입니다. 골프가 아닙니다. 많은 다른 예들이 제출되었는데, 그 중 많은 것은 골프이지만 많은 것은 아닙니다. 공유와 유사한 라이센스로 인해 위 링크의 모든 예제 코드를 출발점으로 자유롭게 사용하십시오.
내 예제의 성능은 여러 가지 이유로 인해 부족합니다. 너무 많은 프로세스, 너무 많은 문자열 / 큰 변환을 사용합니다. 내가 말했듯이 그것은 의도적으로 이상한 예입니다. 5000을 계산합니다! 여기서 4 초 머신에서 10 초 안에 그러나보다 확실한 두 개의 라이너 for / next 루프는 5000을 수행 할 수 있습니다! 3.6 년대에 4 개의 프로세서 중 하나에서
이보다 확실히 더 잘해야합니다.
#!/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) 새로운 것을 배우는 것. 이것은 나에게 숙제 나 연구 문제가 아니다.
행운을 빕니다!
