fork download
  1. #!/usr/bin/perl
  2. use feature 'say';
  3. sub f {
  4. my $v = shift;
  5. if (@_) {
  6. my $c = shift;
  7. my ($mxi, $mxd);
  8. for (0..$#$v-1) {
  9. ($a, $b) = @$v[$_, $_+1];
  10. $d = ($a + $b) * $c - $a * $b;
  11. ($mxi, $mxd) = ($_, $d) if !defined $mxd or $d >= $mxd;
  12. }
  13. splice(@$v, 1+$mxi, 0, $c);
  14. f($v, @_)
  15. }
  16. $v
  17. }
  18. use Math::Trig 'pi';
  19. use List::Util 'sum';
  20. while (<DATA>) {
  21. next if /^#/;
  22. @s = sort{$a<=>$b} split',';
  23. @t = @{f([@s[0,1,0]], @s[2..$#s])};
  24. $N = @s;
  25. $th = 2 * pi / $N;
  26. @a = map{$t[$_] * $t[$_+1]} 0..$#t-1;
  27. $a = 0.5 * sin($th) * sum @a;
  28. say "{$_}\n=> $a // {@t[0..$#t-1]}";
  29. }
  30. __DATA__
  31. 4,3,2,1,0
  32. 10,0,0,10,10,0,10,10
  33. 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
Success #stdin #stdout 0.03s 7304KB
stdin
Standard input is empty
stdout
{4,3,2,1,0}
=> 10.9371499373943 // {0 1 3 4 2}
{10,0,0,10,10,0,10,10}
=> 141.421356237309 // {0 0 0 10 10 10 10 10}
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
=> 280.698297639793 // {1 2 4 6 8 10 12 14 16 15 13 11 9 7 5 3}