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";
+  }
+}
+