Anagrams: Difference between revisions
Content added Content deleted
No edit summary |
(Vedit macro language added) |
||
Line 319: | Line 319: | ||
["angel", "angle", "galen", "glean", "lange"] |
["angel", "angle", "galen", "glean", "lange"] |
||
["caret", "carte", "cater", "crate", "trace"] |
["caret", "carte", "cater", "crate", "trace"] |
||
=={{header|Vedit macro language}}== |
|||
This implementation first sorts characters of each word using Insertion sort in subroutine SORT_LETTERS.<br> |
|||
Then the word list is sorted using built-in Sort function.<br> |
|||
Finally, groups of words are analyzed and largest groups are recorded. |
|||
The word list is expected to be in the same directory as the script. |
|||
<lang vedit> |
|||
File_Open("|(PATH_ONLY)\unixdict.txt") |
|||
Repeat(ALL) { |
|||
Reg_Copy_Block(10, CP, EOL_Pos) // original word |
|||
Call("SORT_LETTERS") // sort letters of the word |
|||
EOL |
|||
IC(' ') Reg_Ins(10) // add the original word at eol |
|||
Line(1, ERRBREAK) |
|||
} |
|||
Sort(0, File_Size) // sort list according to anagrams |
|||
BOF |
|||
Search("|F") Search(' ') // first word in the list |
|||
Reg_Copy_Block(10, BOL_Pos, CP+1) // reg 10 = sorted anagram word |
|||
Reg_Copy_Block(11, CP, EOL_Pos) // reg 11 = list of words in current group |
|||
Reg_Empty(12) // reg 12 = list of words in largest groups |
|||
Reg_Set(13, " |
|||
") |
|||
#1 = 1 // words in this group |
|||
#2 = 2 // words in largest group found |
|||
Repeat(ALL) { |
|||
Line(1, ERRBREAK) |
|||
if (Match(@10, ADVANCE) == 0) { // same group as previous word? |
|||
Reg_Copy_Block(11, CP-1, EOL_Pos, APPEND) // add word to this group |
|||
#1++ |
|||
} else { // different anagram group |
|||
Search(" ", ERRBREAK) |
|||
if (#1 == #2) { // same size as the largest? |
|||
Reg_Set(12, @13, APPEND) // append newline |
|||
Reg_Set(12, @11, APPEND) // append word list |
|||
} |
|||
if (#1 > #2) { // new larger size of group |
|||
Reg_Set(12, @11) // replace word list |
|||
#2 = #1 |
|||
} |
|||
Reg_Copy_Block(10, BOL_Pos, CP+1) |
|||
Reg_Copy_Block(11, CP, EOL_Pos) // first word of new group |
|||
#1 = 1 |
|||
} |
|||
} |
|||
Buf_Quit(OK) // close word list file |
|||
Buf_Switch(Buf_Free) // output results in a new edit buffer |
|||
Reg_Ins(12) // display all groups of longest anagram words |
|||
Return |
|||
//////////////////////////////////////////////////////////////////// |
|||
// |
|||
// Sort characters in current line using Insertion sort |
|||
// |
|||
:SORT_LETTERS: |
|||
GP(EOL_pos) #9 = Cur_Col-1 |
|||
for (#1 = 2; #1 <= #9; #1++) { |
|||
Goto_Col(#1) #8 = Cur_Char |
|||
#2 = #1 |
|||
while (#2 > 1) { |
|||
#7 = Cur_Char(-1) |
|||
if (#7 <= #8) { break } |
|||
Ins_Char(#7, OVERWRITE) |
|||
#2-- |
|||
Goto_Col(#2) |
|||
} |
|||
Ins_Char(#8, OVERWRITE) |
|||
} |
|||
return |
|||
</lang> |
|||
Output: |
|||
abel able bale bela elba |
|||
caret carte cater crate trace |
|||
angel angle galen glean lange |
|||
alger glare lager large regal |
|||
elan lane lean lena neal |
|||
evil levi live veil vile |