펄 341 322 318 바이트
sub f{@g=map{$_<10?"0$_":$_}0..$#_;$"=',';@l=grep{"@g"eq join$",sort/../g}glob"{@g}"x(@i=@_);map{@c=/../g;$s=0;$v=1;for$k(1..$#c){$s+=$D=d($k-1,$k);$_!=$k&&$_!=$k-1&&$D==d($_,$k)+d($_,$k-1)and$v=0 for 0..$#c}$m=$s if$m<$s&&$v}@l;$m}sub d{@a=@{$i[$c[$_[0]]]};@b=@{$i[$c[$_[1]]]};sqrt(($a[0]-$b[0])**2+($a[1]-$b[1])**2)}
이 코드는 최대 100 점을 지원합니다. 가능한 모든 점 순열을 생성하므로 100 점은 최소 3.7 × 10 134 yottabytes의 메모리를 필요로합니다 (12 점은 1.8Gb를 사용함).
댓글 :
sub f {
@g = map { $_<10 ? "0$_" : $_ } 0..$#_; # generate fixed-width path indices
$" = ','; # set $LIST_SEPARATOR to comma for glob
@l = grep { # only iterate paths with unique points
"@g" eq join $", sort /../g # compare sorted indices with unique indices
} glob "{@g}" x (@i=@_); # produce all permutations of path indices
# and save @_ in @i for sub d
map {
@c = /../g; # unpack the path indices
$s=0; # total path length
$v=1; # validity flag
for $k (1..$#c) { # iterate path
$s += # sum path length
$D = d( $k-1, $k ); # line distance
$_!=$k && $_!=$k-1 # except for the current line,
&& $D == d( $_, $k ) # if the point is on the line,
+ d( $_, $k-1 )
and $v = 0 # then reset it's validity
for 0 .. $#c # iterate path again to check all points
}
$m=$s if $m<$s && $v # update maximum path length
} @l;
$m # return the max
}
sub d {
@a = @{ $i[$c[$_[0]]] }; # resolve the index $_[0] to the first coord
@b = @{ $i[$c[$_[1]]] }; # idem for $_[1]
sqrt( ($a[0] - $b[0])**2
+ ($a[1] - $b[1])**2 )
}
테스트 사례 :
print f( [0,1], [0,0], [1,0] ), $/; $m=0; # reset max for next call
print f( [0,0], [0,1], [1,0], [1,1] ), $/; $m=0;
print f( [0,0], [0,1], [0,2] ), $/; $m=0;
print f( [0,0], [0,1], [0,2],
[1,0], [1,1], [1,2]),$/; $m=0;
- 322 바이트 : 재설정하지 않고 19를 저장
$"
하고 일부 인라인
- 318 바이트 : 최대 nr 좌표를 100으로 줄이면 4가 절약됩니다.