<?xml version="1.0" encoding="windows-1252"?>
<node id="86106" title="Re: Golf challange: match U.S. State names" created="2001-06-06 02:57:07" updated="2005-07-21 01:27:14">
<type id="11">
note</type>
<author id="9073">
merlyn</author>
<data>
<field name="doctext">
118 chars:
&lt;code&gt;
sub state {
1&amp;index" AKALCAARAZCOCTDCDEFLGAHIIAIDILINKSKTKYLAMAMDMEMIMNNCMOMSMTOHNDNENHNJNMPANVNYOKORRISCSDTNTXUTVAVTWAWIWVWY",pop
}
&lt;/code&gt;
And it's 117 chars if you replace pop with $_, as the original rules ask.
&lt;p&gt;
The character string was constructed to ensure that a valid state would
never match a non-valid boundary.  It was easier than I thought:
&lt;code&gt;
#!/usr/bin/perl
use strict;
$|++;

my @states = qw(
AK AL AR AZ CA CO CT DC DE FL GA HI IA ID IL IN KS
KT KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM
NV NY OH OK OR PA RI SC SD TN TX UT VA VT WA WI WV
WY
);

my %states = map { $_ =&gt; 1 } @states;

try("", \@states);

sub try {
  print "try: $_[0] @{$_[1]}\n";
  my $prefix = shift;
  my @later = @{+shift};
  unless (@later) {
    print "WINNER: $prefix\n";
    exit;
  }
  for my $i (0..$#later) {
    my $prefix2 = "$prefix$later[$i]";
    if (length $prefix2 &lt; 3 or not $states{substr($prefix2, -3, 2)}) {
      ## worth recursing
      try($prefix2, [@later[0..$i-1, $i+1..$#later]]);
    }
  }
}
&lt;/code&gt;

&lt;p&gt;-- &lt;a href="http://www.stonehenge.com/merlyn/"&gt;Randal L. Schwartz, Perl hacker&lt;/a&gt;&lt;/p&gt;</field>
<field name="root_node">
86047</field>
<field name="parent_node">
86047</field>
</data>
</node>
