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. 如果找到了,那么我想打印“我找到了链接 x y”;
  3. 如果“链接”存在,那么我想计算他们共享多少个“邻居”,这里的 eighbours 是指他们在第二列中有多少个共同元素并打印“我找到了 z 个三角形”。

文件已排序。

在这种情况下,程序将开始在文件中创建第一个“对”1 2,但相反,它将在第 4 行 (2 1) 找到它。然后查看 3(第二行和 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 和 8 与 col 2?

     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 回答