chiark / gitweb /
more stuff found lying about
[wordchain] / chain.rs
index a75b2a6c8fff84320c5fcd286c5a234e24b2b7ae..7d934870adcbdc3ef979932e8ab941400eebf989 100644 (file)
--- a/chain.rs
+++ b/chain.rs
@@ -72,7 +72,7 @@ fn main() -> io::Result<()> {
     }
   }
 
-  let mut max = 0;
+  let mut max = 0; let mut winners = Vec::with_capacity(8);
   for node in map.values() {
     //stdout.write_all(b";; ponder `")?;
     //stdout.write_all(node.word)?;
@@ -80,32 +80,44 @@ fn main() -> io::Result<()> {
     let mut node: &Node = node;
     let mut parent;
     let n = node.word.len();
-    if n <= 1 { parent = None; }
-    else { parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n); }
+    if n <= 1 { continue; }
+    parent = map.get(&node.word[0 .. n - 1]).map(|n| &**n);
+    if let None = parent { continue; }
     node.up.set(parent);
     let mut nlen = node.len.get();
-    while let Some(parent_node) = parent {
-      let plen = parent_node.len.get(); nlen += 1;
-      if plen > nlen
-        { break; }
-      else if plen == nlen {
-        node.right.set(parent_node.down.get());
-        parent_node.down.set(Some(node));
-        break;
-      } else {
-        parent_node.down.set(Some(node));
-        node.right.set(None);
-        parent_node.len.set(nlen);
-        node = parent_node; parent = node.up.get();
+    loop {
+      match parent {
+        None => {
+          if nlen >= max {
+            if nlen > max {
+              max = nlen;
+              winners.clear();
+            }
+            winners.push(node);
+          }
+          break;
+        }
+        Some(parent_node) => {
+          let plen = parent_node.len.get(); nlen += 1;
+          if plen > nlen
+            { break; }
+          else if plen == nlen {
+            node.right.set(parent_node.down.get());
+            parent_node.down.set(Some(node));
+            break;
+          } else {
+            parent_node.down.set(Some(node));
+            node.right.set(None);
+            parent_node.len.set(nlen);
+            node = parent_node; parent = node.up.get();
+          }
+        }
       }
     }
-    if nlen > max { max = nlen; }
   }
 
-  for node in map.values() {
-    if node.len.get() == max
-      { print_chain(node, &mut stdout)?; stdout.write(b"\n")?; }
-  }
+  for node in winners
+    { print_chain(node, &mut stdout)?; stdout.write(b"\n")?; }
 
   Ok(())
 }