Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict; # my を強制する
- use warnings; # より多く警告を出す
- use feature 'say'; # say (改行付き print) を使用する
- use Math::Trig;
- sub theta { # サブルーチン theta
- my ($x1, $y1, $x2, $y2) = @_; # 引数を分割代入する
- return '' if abs($y1 - $y2) > 10; # 条件が満たされたら、空文字を返す
- # すべての引数に、deg2rad を適用する
- ($x1, $y1, $x2, $y2) = map { deg2rad $_ } ($x1, $y1, $x2, $y2);
- my $theta = rad2deg(
- acos(1 - (1 / 2) *
- (
- (cos($y1) * sin($x1) - cos($y2) * sin($x2)) ** 2 +
- (cos($y1) * cos($x1) - cos($y2) * cos($x2)) ** 2 +
- (sin($y1) - sin($y2)) ** 2
- )
- )
- );
- return $theta; # 通常値の return
- }
- my $data = []; # @d = (); $data = \$d; の略。2値データを蓄積する
- my $result = []; # 5値データを蓄積する
- while (<>) { # デフォルトのインプットソースから読み込み、行を $_ に代入
- chomp; # chomp $_; の略。改行を削除する
- my @d = split; # split $_; の略。空白類で分割し配列を返す
- push @$data, \@d; # @$ は配列のデリファレンス。$data に、ローカル配列を蓄積
- }
- my $size = scalar @$data; # スカラ参照で、配列のサイズを取得
- for (my $i = 0; $i < $size; $i++) { # 2重の for で、すべての組み合わせを
- for (my $j = $i + 1; $j < $size; $j++) { # 作成する
- # $data はリファレンスなので、-> で値を参照できる
- my $r = [$data->[$i][0], $data->[$i][1], $data->[$j][0], $data->[$j][1]];
- my $theta = theta @$r; # sub theta で計算
- next if $theta eq ''; # 返り値が空文字なら、次の繰り返しへ
- push @$r, $theta; # 4値に、値を push
- push @$result, $r; # その5値を result に蓄積
- }
- }
- @$result = sort { $a->[4] <=> $b->[4] } @$result; # 配列の配列を5番の値でソート
- foreach my $r (@$result) { # 配列の配列から、1つずつ配列を取り出す
- say join "\t", @$r; # tab もじで 結合した結果を印字
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement