如何判断任何长度的两个字符串是否是使用bash,awk或任何使用命令或脚本的字谜?

时间:2017-07-18 10:28:40

标签: bash awk sed

字符串或单词可以是任意长度。

例如“William Shakespeare”=“我是一个弱势的拼写者”两者都是字谜

E.g。 “居里夫人”=“镭来了”

3 个答案:

答案 0 :(得分:3)

这可能对您有用:

# function to cleanup a given argument by doing this:
# 1. Remove all alphanumerics
# 2. Convert to all lowercasing all characters 
# 3. Sorting all characters
# 4. Stripping all newlines 
prep() {
   fold -w1 <<< "${1//[^[:alnum:]]/}" | tr '[:upper:]' '[:lower:]' | sort | tr -d '\n'
}

# function to check if given 2 arguments are anagrams
isAnagram() {
   a=$(prep "$1")
   b=$(prep "$2")
   [[ $a = $b ]] && echo "yes" || echo "no";
}

要打电话给他们使用:

isAnagram "William Shakespeare" "I am a weakish speller"
yes

isAnagram "Madam Curie" "Radium came"
yes

isAnagram "cat" "act"
yes

isAnagram "cat" "cot"
no

答案 1 :(得分:1)

使用 Python轻松

anagram.py 脚本:

import sys

s1 = sys.argv[1]
s2 = sys.argv[2]
fmt = '"{:s}" and "{:s}" are{:s} anargams'

if sorted(s1.lower().translate(None,' \n\r\t')) == sorted(s2.lower().translate(None,' \n\r\t')):
    print(fmt.format(s1, s2, ''))
else:
    print(fmt.format(s1, s2, ' NOT'))

用法:

python anagrams.py "William Shakespeare" "I am a weakish speller"

输出:

"William Shakespeare" and "I am a weakish speller" are anargams
python anagrams.py "William Shakespeare" "William Hopkins"

输出:

"William Shakespeare" and "William Hopkins" are NOT anargams

答案 2 :(得分:0)

一个awk解决方案看起来不像其他解决方案那么紧凑,但略有不同:

awk -v s1="William Shakespeare" -v s2="I am a weakish speller" '    
function chkTxt(s) {
    split(tolower(s), arr, //)
    asort(arr)
    result=""
    for(i=1;i<=length(arr);i++)
        result = result""arr[i]
    return result
}

BEGIN{
    x=gsub(/[[:blank:]]/,"",s1)
    y=gsub(/[[:blank:]]/,"",s2)

    if (x+y==0 || (x&&y)) {
        print chkTxt(s1)==chkTxt(s2)? "True":"False"
        exit
    }
    print "False"
}'

这里将两个字符串变量传递给s1s2

注意对于空格/空白检查,我注意到你的例子并没有限制空格的数量,但是,似乎如果有空格,两个字符串必须至少有一个空格。像foo barf o o ba r一样是字谜。但foobarbarf o o不是。

以上代码进行检查。