1

私が書きたいプログラムは、ファイル列の対立と同じ目的を持っています。今回は、私が持っているファイルを別の方法で配置します。

1 2
1 3
1 4
2 1
2 3
2 4
2 5
3 1
...
8 6
8 7
8 9
9 8

私が見つけたい:

  1. 行の最初の要素が他の行の 2 番目の位置に表示された場合、および後続の行の最初の要素が試験で取得した行の横に表示された場合。
  2. 見つかった場合は、「リンク x y を見つけました」と出力します。
  3. 「リンク」が存在する場合、それらが共有する「隣人」の数を数えたいと思います。ここで、「隣人」とは、2 列目に共通の要素がいくつあるかを意味し、「z 三角形が見つかりました」と出力します。

ファイルがソートされます。

この場合、プログラムはファイル内の最初の「対」 1 2 の作成を開始しますが、逆になり、4 行目 (2 1) で検出されます。次に、3 (2 行目で 1 の隣) も 2 に存在するかどうかを調べます (そして、2 3 が存在するためです) など。最後に、「リンク 1 2 があります」と「2 つの三角形が見つかりました」(1 - 2 - 3 および 1 - 2 - 4) が見つかります。上のリンクの回答とさほど変わらないと思いますが、このように作ったファイルからファイルを整理する方法がわかりません。

4

1 に答える 1

0

問題の最初の部分は、反転した一致するペアのインデックスのみを見つけることですか? 昨日この問題を読んでいて、grep が役に立つかもしれないと感じました。

#!usr/bin/perl

use warnings;
use strict;

my @parry;

while (<DATA>){
push @parry, [split(' ',$_)];
}

#@remind is reverse matched indices;

my @remind = grep {
my $ind = $_;
   grep {  #reverse @{$parry[$_]} == @{parry[$ind]} did not appear to work.

      @{$parry[$_]}[0] == @{$parry[$ind]}[1] && 
      @{$parry[$_]}[1] == @{$parry[$ind]}[0];

   } 0..$#parry 

} 0..$#parry;

grep { print $_,': ',@{$parry[$_]},$/ } @remind;

__END__
1 2
1 3
1 4
2 1
2 3
2 4
2 5
3 1
8 6
8 7
8 9
9 8

出力は

0: 12
1: 13
3: 21
7: 31
10: 89
11: 98

ここから、7[0] 7[1] (3 1) の隣の行 6 と列 2 の 8 を見つけたいですか?

     6[1]
     7[1] (1 5) and/or

     7[1] (1 6) exist in the original set (in @parry)?
     8[1] 

彼らはそれほど三角形ではありません。

于 2013-03-06T22:44:17.353 に答える