chiark / gitweb /
more stuff found lying about
[wordchain] / chain.go
index 8f1b450889d13d4c744558b8df806632a3c3e2f3..2d6d2c2f74f4eea7a2c76626017c4b7d6ea43730 100644 (file)
--- a/chain.go
+++ b/chain.go
@@ -43,29 +43,44 @@ func main() {
        }
 
        max := 0
+       var winners *wordnode = nil; winners_tail := &winners
        for word, node := range words {
                wlen := len(word)
                if wlen <= 1 { continue }
                parent := words[word[:wlen - 1]]
+               if parent == nil { continue }
                node.up = parent
-               for parent != nil {
-                       nlen := node.len + 1
-                       plen := parent.len
-                       if nlen < plen {
+               nlen := node.len
+               for {
+                       if parent == nil {
+                               if nlen >= max {
+                                       if nlen > max {
+                                               max = nlen
+                                               *winners_tail = nil
+                                               winners_tail = &winners
+                                       }
+                                       *winners_tail = node
+                                       winners_tail = &node.right
+                               }
                                break
-                       } else if nlen > plen {
-                               parent.down = nil
-                               parent.len = nlen
-                               if nlen > max { max = nlen }
                        }
-                       if parent.down != node {
+                       nlen += 1; plen := parent.len
+                       if plen > nlen {
+                               break
+                       } else if plen == nlen {
                                node.right = parent.down; parent.down = node
+                               break
                        }
+                       parent.down = node; node.right = nil
+                       parent.len = nlen
                        node = parent; parent = node.up
                }
        }
 
-       for _, node := range words {
-               if node.len == max { print_chain(node); fmt.Printf("\n") }
+       *winners_tail = nil
+       var next *wordnode
+       for node := winners; node != nil; node = next {
+               next = node.right; node.right = nil
+               print_chain(node); fmt.Printf("\n")
        }
 }