-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaddresses.pl
More file actions
100 lines (100 loc) · 2.09 KB
/
addresses.pl
File metadata and controls
100 lines (100 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#! /usr/bin/perl
# Matthew Digman
use strict;
my %people_cost;
my %place_people;
my %people_place;
my %place_sizes;
for(<STDIN>){
my ($name, $cost, @places) = split ' ', $_;
$cost=~s/\$//;
$people_cost{$name}=$cost;
for(@places){
push @{$place_people{$_}}, $name;
${$people_place{$name}}{$_} = 1;
$place_sizes{$_}++;
}
}
my @people = keys %people_cost;
my %parents;
my @places;
for(@people){
my @places =keys %{$people_place{$_}};
@places = sort {$place_sizes{$a}<=>$place_sizes{$b}} @places;
while(@places){
my $place = shift @places;
if(! defined $places[0]){
next;
}elsif(defined $parents{$place}){
next if($parents{$place} eq $places[0]);
print "ambiguous hierarchy\n";
exit;
}elsif($place_sizes{$place} == $place_sizes{$places[0]}){
print "ambiguous hierarchy\n";
exit;
}else{
$parents{$place}=$places[0];
}
}
}
my %children;
for(keys %place_sizes){
next if(! exists $parents{$_});
push @{$children{$parents{$_}}}, $_;
}
for(sort {$a cmp $b} keys %place_sizes){
if(! exists $parents{$_}){
&printtree($_, 0);
}
}
sub printtree{
my $me = $_[0];
my $spaces = $_[1];
my $prev_ave = $_[2];
my @children;
if(! exists $children{$me}){
@children = ();
}else{
@children = @{$children{$me}};
}
my @people = @{$place_people{$me}};
my @here_exc;
my $tot_cost = 0;
OUTER:for(@people){
my $person = $_;
$tot_cost+= $people_cost{$person};
for(@children){
next OUTER if(${$people_place{$person}}{$_});
}
push @here_exc, $person;
}
# print "$_ : NONE : @here_exc\n" if(! exists $children{$_});
my $ave = $tot_cost/($#people+1);
my $dev = "";
if(defined $prev_ave){
if($prev_ave == $ave){
$dev = " (average)";
}else{
$dev = sprintf "%.02f",($ave-$prev_ave);
$dev = &form_num($dev);
$dev = " ($dev)";
}
}
my $brick = " "x($spaces*2);
printf "$brick".$me." \$%.02f$dev\n", $ave;
for(sort{$a cmp $b} @here_exc){
printf "$brick - $_ \$$people_cost{$_}\n";
}
for(sort{$a cmp $b} @children){
printtree($_,$spaces+1, $ave);
}
}
sub form_num{
my $num = $_[0];
if($num=~/\-/){
$num=~s/\-/\-\$/;
}else{
$num = "+\$$num";
}
$num;
}