2013-03-06 4 views
1

Le programme que j'aimerai écrire a le même but que le File row confrontation. Cette fois le fichier que j'ai est mis d'une manière différente:Trouver les éléments communs dans un fichier

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

Je veux trouver:

  1. lorsque le premier élément d'une ligne apparaît dans la deuxième position des autres lignes et si la le premier élément des rangées suivantes apparaît à côté de la rangée prise à l'examen;
  2. s'il a trouvé alors je veux imprimer "J'ai trouvé le lien x y";
  3. Si le "lien" existe, alors je veux compter combien de "voisins" ils partagent, où par dixièmes j'entends le nombre d'éléments dans la deuxième colonne qu'ils ont en commun et j'imprime "J'ai trouvé z triangles".

Le fichier est trié.

Dans ce cas le programme commencera à fonder le premier "couple" 1 2 dans le fichier mais inversé et il le trouvera à la 4ème rangée (2 1). Alors il regarde si le 3 (deuxième rangée et voisin de 1) est aussi présent dans 2 (et c'est le cas parce qu'il existe 2 3) et ainsi de suite. À la fin il trouvera que le "il y a le lien 1 2" et il "a trouvé 2 triangles" (1 - 2 - 3 et 1 - 2 - 4). Je pense que la réponse ne devrait pas être si différente de la réponse dans le lien supérieur, mais je ne sais pas comment organiser les fichiers à partir d'un fichier fait comme ça.

+0

Pouvez-vous s'il vous plaît poster le code que vous avez créé jusqu'à présent? Même s'il est similaire à votre question précédente, veuillez poster le code approprié ici. –

+0

Je ne sais pas comment remplir le tableau à partir des données contenues dans le fichier; pour les algorithmes, j'utiliserai la même forme que la réponse [http://stackoverflow.com/questions/15203765/file-row-confrontation/15205173#15205173]. –

+1

Veuillez réécrire la question de manière plus complète. Publiez aussi votre code ici et connectez-nous à votre code sur www.tryperl.com afin que nous puissions voir le code en cours d'exécution. Vous obtiendrez de bien meilleures réponses si vous faites cela. Merci – average

Répondre

0

La première partie du problème consiste à trouver uniquement l'index des paires appariées inversées? En lisant ce problème hier, j'ai eu l'impression que grep pouvait être utile;

#!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 

sortie est

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

d'ici que vous voulez alors trouver pour dire 7 [0] 7 [1] (3 1) avec le voisin rangée 6 et 8 avec col 2?

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

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

Ce qui n'est pas le cas si aucun triangle.

Questions connexes