I used to use LaTeX a lot, but I'm a recent lout convert. Lout is a lot higher-level than LaTeX - think Ruby vs C - and a lot more pleasant to use. It also takes significantly less time to learn than LaTeX does, so it's worth trying out even if you end up disliking it.
The FA missed the point rather badly, IMO - what makes Java 'uncool' is its lack of support for abstraction. When a programmer finds himself doing the same thing again and again, his first thought is "can I abstract this pattern?". In Java, the answer is all too frequently "no", and the programmer is forced to type in several lines of code to express one conceptual construct.
Sun's big mistake was in not separating the ideas of Java and the JVM more cleanly when marketing it - there are some very cool, hacker-friendly JVM languages (most notably Scala), all of which share Java's virtue of "compile once, run anywhere", but which have got practically no mindshare.
Re:UNIX program? Easy!
on
Word Up
·
· Score: 2, Informative
There's a very clever method of optimising the repeated valid placement calculations, due to Jacobson and Appel, where each square is tagged with the set of valid crossing letters that can be played on it. For example, if your board looked like:
1.2.3 A.N.D L.O.O E.W.E
where 1 2 and 3 were empty squares, 1 would be tagged with {bdeghkmprstvwy}, 2 with {aeks} and 3 with {}, so that a word played horizontally would be constrained to have only those letters in the tagged squares. (SOWPODS lexicon)
Combined with this is a refinement of the DAWG called a DAGGAD - in the author's words:
A practical variation is the DAWG for the language L = {REV(x)*y | xy is a word and x is not empty}, where * is just a delimiter. Each word in the lexicon can be generated starting from each letter in that word by placing tiles leftward upon the board starting at an anchor square while traversing the corresponding arcs in the structure until encountering the *, and then placing tiles rightward from square to the right of the anchor square while still traversing corresponding arcs until acceptance. Being the reverse of the directed acyclic graph for prefixes followed by the directed acyclic graph for suffixes, I called it a GADDAG.
So for example, the word SPACE would be stored as SPACE, PACE*S, ACE*PS, CE*APS and E*CAPS, so that you could search the tree starting from the A, play C in the next square, E next, then jump back to the A, move back a square and play P, then back another square and play S. After the trie compaction, a DAGGAD takes up ~3-5 times the space of the corresponding DAWG, and roughly doubles the search speed.
I used to use LaTeX a lot, but I'm a recent lout convert. Lout is a lot higher-level than LaTeX - think Ruby vs C - and a lot more pleasant to use. It also takes significantly less time to learn than LaTeX does, so it's worth trying out even if you end up disliking it.
That'd be Erlang.
The FA missed the point rather badly, IMO - what makes Java 'uncool' is its lack of support for abstraction. When a programmer finds himself doing the same thing again and again, his first thought is "can I abstract this pattern?". In Java, the answer is all too frequently "no", and the programmer is forced to type in several lines of code to express one conceptual construct.
Sun's big mistake was in not separating the ideas of Java and the JVM more cleanly when marketing it - there are some very cool, hacker-friendly JVM languages (most notably Scala), all of which share Java's virtue of "compile once, run anywhere", but which have got practically no mindshare.
There's a very clever method of optimising the repeated valid placement calculations, due to Jacobson and Appel, where each square is tagged with the set of valid crossing letters that can be played on it. For example, if your board looked like:
1.2.3
A.N.D
L.O.O
E.W.E
where 1 2 and 3 were empty squares, 1 would be tagged with {bdeghkmprstvwy}, 2 with {aeks} and 3 with {}, so that a word played horizontally would be constrained to have only those letters in the tagged squares. (SOWPODS lexicon)
Combined with this is a refinement of the DAWG called a DAGGAD - in the author's words:
A practical variation is the DAWG for the language L = {REV(x)*y | xy is a word and x is not empty}, where * is just a delimiter. Each word in the lexicon can be generated starting from each letter in that word by placing tiles leftward
upon the board starting at an anchor square while traversing the corresponding arcs in the structure until encountering the *, and then placing tiles rightward from square to the right of the anchor square while still traversing corresponding arcs until acceptance. Being the reverse of the directed acyclic graph for prefixes followed by the directed acyclic graph for suffixes, I called it a GADDAG.
So for example, the word SPACE would be stored as SPACE, PACE*S, ACE*PS, CE*APS and E*CAPS, so that you could search the tree starting from the A, play C in the next square, E next, then jump back to the A, move back a square and play P, then back another square and play S. After the trie compaction, a DAGGAD takes up ~3-5 times the space of the corresponding DAWG, and roughly doubles the search speed.
Check out Graham Toal's wordgame programming page for lots more on scrabble algorithms.
Netcraft comfirms - the BSOD is dying!!!