Mercurial > hg > batmud > misc
changeset 15:79c79d865218 misc
Add a simple Perl-script for parsing alloy combinations from logfiles.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 16 Apr 2009 12:40:12 +0000 |
parents | d594c243f14a |
children | 3c0717d36741 |
files | parsealloys.pl |
diffstat | 1 files changed, 77 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parsealloys.pl Thu Apr 16 12:40:12 2009 +0000 @@ -0,0 +1,77 @@ +#!/usr/bin/perl -w +# Superklunssi by Ggr +use strict; + +#You mix obsidian and crystal and create a quantity of glass +#You mix nullium and illumium and create a quantity of dukonium +#You mix nullium and illumium and create a quantity of dukonium + +my ($opt_php); + +if ($#ARGV >= 0) { + if ($ARGV[0] eq "-php") { $opt_php = 1; } +} + + +## Parse data from input, ignoring fumbled alloys +my %data = (); +my $fumble = 0; +while (<STDIN>) { + chomp; + if (/^You mix ([a-z ]+?) and ([a-z ]+?) and create a quantity of (.+)$/) { + my $min1 = $1; my $min2 = $2; my $res = $3; + if (!$fumble) { + push(@{$data{$1}{$2}}, $3); + } else { + print STDERR "Ignoring fumbled combo $1 + $2 = $3\n"; + } + $fumble = 0; + } elsif (/^(You slip up and fumble your attempt.)/) { + $fumble = 1; + } +} + + +## Re-format the data into single "ordered" hash, using as +## close to alphabetical order as possible. +my %final = (); +foreach my $min1 (keys %data) { + foreach my $min2 (keys %{$data{$min1}}) { + if (!defined($final{$min1}{$min2}) && !defined($final{$min2}{$min1})) { + # Get both (a, b) and (b, a) combinations results into same array + my @tmp = (); + if (defined($data{$min1}{$min2})) { + push(@tmp, @{$data{$min1}{$min2}}); + } + if (defined($data{$min2}{$min1})) { + push(@tmp, @{$data{$min2}{$min1}}); + } + + # Determine if there are multiple results and which is the most likely. + # Some alloy combinations are inherently "unstable". + my %seen = (); + foreach my $mat (@tmp) { $seen{$mat}++; } + if ($min1 lt $min2) { + $final{$min1}{$min2} = \%seen; + } else { + $final{$min2}{$min1} = \%seen; + } + } + } +} + + +## Output the results +print +"| Mineral1 | Mineral 2 | Result(s)\n". +"+-----------------+-----------------+--------------------------------\n"; +foreach my $min1 (sort { $a cmp $b } keys %final) { + foreach my $min2 (sort { $a cmp $b } keys %{$final{$min1}}) { + printf "| %-15s | %-15s | ", $min1, $min2; + foreach my $res (sort { $_{$a} <=> $_{$b} } keys %{$final{$min1}{$min2}}) { + print "$res($final{$min1}{$min2}{$res}) "; + } + print "\n"; + } +} +