ABC-词搜索算法
此代码实现了一种算法,该算法在包含字母"a","b"和"c"的文件中按该顺序查找单词(不一定在一行中)。
导言
在这个例子中,我们考虑搜索称为ABC词的特殊词的任务。 这些是字母a,b和c以指定的顺序**出现的单词,但不一定一个接一个。 例如,这个词 "abacus" -ABC是一个单词,因为字母a,b和c的顺序正确。 还有这个词 "cab" -不是ABC词,因为顺序被打破了。
这些任务可以用于语言研究,自然语言处理任务,或简单地用于有趣的字母表和单词分析练习。
该算法的本质是检查每个单词中是否存在字母'a','b'和'c',以及它们在单词中的位置是否以非递减顺序排列。
主要部分
功能 isabcword 它用于确定一个单词是否是ABC单词。
输入:word w,第二个参数 _ 被忽略
function isabcword(w, _)
    # Создаем список позиций букв 'a', 'b', 'c' в слове, если они есть
    # Если буква не найдена, findfirst вернет nothing
    positions = [findfirst(c -> c == ch, w) for ch in "abc"]
    # Проверяем, все ли из трех букв найдены (никто не равен nothing)
    # И проверяем, что позиции этих букв расположены в порядке возрастания
    return all(!isnothing, positions) && issorted(positions) ? w : ""
end
功能说明 isabcword
想象一下这个词 "abacus". 字母在这些位置:
- a-第一个(位置1)
- b-第二(位置2)
- c-第三(位置3)
名单 [1, 2, 3] 满足条件 issorted,因为数字是上升的。
但如果有一个词 "cabbage":
- a第三个位置,
- b4日,
- c1日,
那么名单将是 [1, 3, 4],但位置没有排序(1<3<4是正确的)。 字母的顺序正确是很重要的.
该函数返回单词本身(如果是ABC单词)或空字符串(如果不是)。
使用函数
功能 foreachword 打开文件并将传递的函数应用于每个单词。
她看起来像 map 或 foreach,但适应与单词列表的文件工作。
function foreachword(filename, func)
    open(filename) do file
        for line in eachline(file)
            word = strip(line)  # убираем пробелы
            result = func(word, nothing)
            if !isempty(result)
                println(result)
            end
        end
    end
end
调用我们的函数为文件"unixdict。txt"
foreachword("unixdict.txt", isabcword)
会印什么字? 只有那些 isabcword 返回一个非空字符串,即与我们对ABC单词的定义匹配的字符串。
结论
我们已经考虑了Julia语言中一个简单但有用的程序的例子,它解决了搜索ABC单词的问题。 该算法使用处理字符串和集合的基本功能(findfirst, all, issorted),并允许您根据特定条件有效地过滤单词。
这个例子演示了Julia在不涉及复杂库的情况下解决文本数据处理任务的灵活性和表现力。 它也可以成为更复杂的语言实验的方便起点。
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/ABC_words )