Help with 4 dimensional implementation

D

Deepu

Hi All,

I have a file which has transitions like:

SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD
and so on

I am trying to count number of times the transitions occurs (for
example):

SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SF -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SD -> SE -> SA -> SB = 1
SE -> SA -> SB -> SC = 1
SB -> SC -> SD -> and so on

Can somebody please provide me with some ideas.

Thanks
Deep
 
J

John W. Krahn

Deepu said:
I have a file which has transitions like:

SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD
and so on

I am trying to count number of times the transitions occurs (for
example):

SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SF -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SD -> SE -> SA -> SB = 1
SE -> SA -> SB -> SC = 1
SB -> SC -> SD -> and so on

Can somebody please provide me with some ideas.

$ echo "SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD" | perl -lne'
push @x, $_;
@x == 4 && ++$x{ join $;, @x } && shift @x
}{
print join( " -> ", split $; ), " = $x{ $_ }" for sort keys %x
'
SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SA -> SB = 1
SD -> SE -> SF -> SC = 1
SE -> SA -> SB -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1




John
 
D

David Squire

Deepu said:
Hi All,

I have a file which has transitions like:

I guess we are supposed to read your mind to understand what
"transitions" are...
SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD
and so on

I am trying to count number of times the transitions occurs (for
example):

SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SF -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SD -> SE -> SA -> SB = 1
SE -> SA -> SB -> SC = 1
SB -> SC -> SD -> and so on

Can somebody please provide me with some ideas.

Something like this? (Obviously could be improved by refactoring)

----

#!/usr/bin/perl

use strict;
use warnings;

my $Length = 4;
my @Seen;
# Note, assumes that we have at least $Length entries in DATA
for (my $i = 0; $i < $Length; $i++) {
my $Line = <DATA>;
chomp $Line;
push @Seen, $Line;
}

my %Transitions;
my $Key = join ' -> ', @Seen;
$Transitions{$Key}++;
while (my $Line = <DATA>) {
chomp $Line;
shift @Seen;
push @Seen, $Line;
my $Key = join ' -> ', @Seen;
$Transitions{$Key}++;
}

foreach my $Key (sort keys %Transitions) {
print "$Key = $Transitions{$Key}\n";
}


__DATA__
SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD

----

Output:

SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SA -> SB = 1
SD -> SE -> SF -> SC = 1
SE -> SA -> SB -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1
 
D

David Squire

David said:
foreach my $Key (sort keys %Transitions) {

perhaps you might prefer

foreach my $Key (sort {$Transitions{$b} <=> $Transitions{$a}} keys
%Transitions) {


DS
 
J

John W. Krahn

John said:
$ echo "SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD" | perl -lne'
push @x, $_;
@x == 4 && ++$x{ join $;, @x } && shift @x
}{
print join( " -> ", split $; ), " = $x{ $_ }" for sort keys %x
'
SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SA -> SB = 1
SD -> SE -> SF -> SC = 1
SE -> SA -> SB -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1

perl -lne'
push( @x, $_ ) && @x == 4 && ++$x{ join " -> ", @x } && shift @x
}{
print "$_ = $x{ $_ }" for sort keys %x
'


John
 
X

Xicheng Jia

Deepu said:
Hi All,

I have a file which has transitions like:

SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD
and so on

I am trying to count number of times the transitions occurs (for
example):

SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SF -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SD -> SE -> SA -> SB = 1
SE -> SA -> SB -> SC = 1
SB -> SC -> SD -> and so on

Can somebody please provide me with some ideas.

perl -ln00e '
s/\n/ -> /g;
$seen{ "$1$2" }++ while /(\w+)(?=((?: -> \w+){3}))/g;
}{
print "$_ = $seen{$_}" for sort keys %seen;
' file.txt

Xicheng
 
J

John W. Krahn

Xicheng said:
perl -ln00e '
s/\n/ -> /g;
$seen{ "$1$2" }++ while /(\w+)(?=((?: -> \w+){3}))/g;
}{
print "$_ = $seen{$_}" for sort keys %seen;
' file.txt

perl -ln0777e'
$seen{ "$1 -> $2 -> $3 -> $4" }++
while /(\S+)(?=\s+(\S+)\s+(\S+)\s+(\S+))/g;
print "$_ = $seen{$_}" for sort keys %seen
'


John
 
D

DJ Stunks

John said:
$ echo "SA
SB
SC
SD
SE
SF
SC
SD
SE
SA
SB
SC
SD" | perl -lne'
push @x, $_;
@x == 4 && ++$x{ join $;, @x } && shift @x
}{
print join( " -> ", split $; ), " = $x{ $_ }" for sort keys %x
'
SA -> SB -> SC -> SD = 2
SB -> SC -> SD -> SE = 1
SC -> SD -> SE -> SA = 1
SC -> SD -> SE -> SF = 1
SD -> SE -> SA -> SB = 1
SD -> SE -> SF -> SC = 1
SE -> SA -> SB -> SC = 1
SE -> SF -> SC -> SD = 1
SF -> SC -> SD -> SE = 1

are there any docs other than perlvar on $;? it wasn't that
informative...

-jp
 
D

Dr.Ruud

Xicheng Jia schreef:
perl -ln00e '
s/\n/ -> /g;
$seen{ "$1$2" }++ while /(\w+)(?=((?: -> \w+){3}))/g;
}{
print "$_ = $seen{$_}" for sort keys %seen;
' file.txt

Variant:

perl -ln0e'
s/\n/ -> /g;
$seen{$1.$2}++ while /(\w+)(?=((?:\W+\w+){3}))/g;
print "$_ = $seen{$_}" for sort keys %seen
'
 
D

Dr.Ruud

John W. Krahn schreef:
perl -ln0777e'
$seen{ "$1 -> $2 -> $3 -> $4" }++
while /(\S+)(?=\s+(\S+)\s+(\S+)\s+(\S+))/g;
print "$_ = $seen{$_}" for sort keys %seen
'

Variant:

perl -ln0777e'
$;=" -> ";
$seen{$1,$2,$3,$4}++
while /(\S+)(?=\s+(\S+)\s+(\S+)\s+(\S+))/g;
print "$_ = $seen{$_}" for sort keys %seen
'
 
B

Brian Greenfield

are there any docs other than perlvar on $;? it wasn't that
informative...

I couldn't remember what $; did so I looked it up too, but I thought
it was quite clear:

The subscript separator for multidimensional array emulation. If
you refer to a hash element as

$foo{$a,$b,$c}

it really means

$foo{join($;, $a, $b, $c)}

[...]

Default is "\034", the same as SUBSEP in awk

So, the following all do the same (as long as the value in $; hasn't
been changed)

$hash{'A','B'} = "foo";
$hash{"A$;B"} = "foo";
$hash{"A\034B"} = "foo";

They each create a key in %hash of "A\034B";

Is that any clearer?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top