C=Struct.new(:x,:y){def-(o)=C[x-o.x,y-o.y];def d(o)=Math.hypot(x-o.x,y-o.y);def _(o)=x*o.y-y*o.x}
def i?(a,b,c,d)=((b-a)._(c-a)*(b-a)._(d-a)<0)&&((d-c)._(a-c)*(d-c)._(b-c)<0)
m=ARGV.delete('-a')?:a:(ARGV.delete('-p')?:p: :f)
exit if ARGV.delete('-h')||ARGV.empty?
P=ARGV.map{C[*_1.split(',').map(&:to_f)]};N=P.size;exit if N<2
E=P.zip(P.rotate)
exit if E.map.with_index.to_a.combination(2).any?{|(a,i),(b,j)|(i-j).abs>1&&i-j!=N-1&&i?(a[0],a[1],b[0],b[1])}
A=E.sum{_1.x*_2.y-_2.x*_1.y}.abs/2;D=E.map{_1.d(_2)};T=D.sum/(N==2?2:1);F="%.2f"
puts case m
when :a;exit if N<3;F%A
when :p;F%T
when :f;N==2 ?"1→2: #{F%T} m" :D.map.with_index{"#{_2+1}→#{(_2+1)%N+1}: #{F%_1} m"}+["total: #{F%T} m","area: #{F%A} m²"]
end
# usage
code 0,0 10,0 10,10 0,10
code -a 0,0 10,0 10,10 0,10
code -p 0,0 10,0 10,10 0,10
code 991.97,666.91 990.42,707.42
code -p 991.97,666.91 990.42,707.42
code 0,0 10,0 5,10 10,10 0,5
code -a 0,0 10,0
echo "$(code -p 0,0 10,0 10,10 0,10) + $(code -p 0,0 10,0) " | bc