#!/usr/bin/perl use CGI; require "/gh/src/ghlib.pl"; $movie_rx = "Top/Arts/Movies/Titles/./.+"; $celeb_rx = "Top/Arts/Celebrities/./.+"; $opt = shift; if ( $opt eq "-compile" ) { compile(); } else { $query = new CGI; find_index( $opt or $query->param( "who" ) ); } sub compile { my $hash = load_from_rdf(); compute_distances( $hash, "Bacon,_Kevin" ); write_hash( $hash ); } sub find_index { my ( $who ) = @_; my $hash = load_hash(); page_head( "kbacon" ); print "
\n";

  if ( $who eq "" ) {
    srand( time() ^ ($$ + ($$ << 15)));
    $who = (keys %{$hash->{celebs}})[rand(scalar( keys %{$hash->{celebs}}))];
  }

  if ( $hash->{celebs}->{$who} eq "" ) {
    print "I don't know $who!\n";
    page_tail();
    return;
  }
  if ( $hash->{dist}->{$who} eq "" ) {
    print "Not connected!\n";
    page_tail();
    return;
  }

  $showwho = $who;
  $showwho =~ s/^(.*),_(.*)$/\2 \1/;
  $showwho =~ s/_/ /g;
  print "$showwho was in ";
  while( $who ) {
    ( $who, $mov ) = split /:/, $hash->{back}->{$who};
    $showwho = $who;
    $showwho =~ s/^(.*),_(.*)$/\2 \1/;
    $showwho =~ s/_/ /g;
    $mov =~ s,^.*/(?=[^/]+$),,;
    $mov =~ s/_/ /g;		   
    last if ( $who eq "Bacon,_Kevin" );
    print "\"$mov\"\n  with $showwho who was in "
  }
  print "\"$mov\"\n  with Kevin Bacon\n";

  print "

\n"; page_tail(); } sub load_hash { my $ret; open TXT, "kbacon.db"; while( ) { chomp; my ( $k, $d, $b ) = split /\|/; $ret->{celebs}->{$k} = 1; $ret->{dist}->{$k} = $d; $ret->{back}->{$k} = $b; } close TXT; return $ret; } sub write_hash { my ($hash) = @_; open TXT, ">kbacon.db"; foreach (keys %{$hash->{celebs}}) { print TXT join( "|", $_, $hash->{dist}->{$_}, $hash->{back}->{$_} ), "\n"; } close TXT; } sub load_from_rdf { my $ret; my ( $cat, $movie, $celeb, $name ) = ( "", 0, 0, "" ); open TXT, "structure.rdf.u8"; while( ) { if ( // ) { $cat = $1; $celeb = ($cat =~ m,^$celeb_rx,); if ( $celeb ) { ($name = $cat) =~ s,.*?/([^/]+)(/Movies)?$,\1,; } last if ( $cat =~ /^Business/ ); } if ( $celeb ) { if ( // ) { push @{ $ret->{celebs}->{ $name } }, $1; push @{ $ret->{movies}->{ $1 } }, $name; } } } close( TXT ); return $ret; } sub compute_distances { my ( $data, $who, $dist, $back ) = @_; my ( $mov, $celeb ); if ( ! $data->{celebs}->{$who} ) { # print "No such celeb - $who!\n"; return; } $data->{dist}->{$who} = $dist; $data->{back}->{$who} = $back; foreach $mov ( @{$data->{celebs}->{$who}} ) { print "No such movie - $mov!\n" unless $data->{movies}->{$mov}; next unless $data->{movies}->{$mov}; foreach $celeb ( @{$data->{movies}->{$mov}} ) { print "No such celeb2 - $celeb!\n" unless $data->{celebs}->{$celeb}; next unless $data->{celebs}->{$celeb}; if ( ! defined $data->{dist}->{$celeb} or $data->{dist}->{$celeb} > $dist + 1 ) { compute_distances( $data, $celeb, $dist + 1, "$who:$mov" ); } } } }