Посмотрите, сколько слов имеют одинаковые буквы

У меня 2 строки:

answer="spaghetti" guess="spgheti" 

Я хотел бы знать, есть ли способ подсчитать количество писем в $ answer, которые совпадают с $ guess, в этом случае я должен получить номер 7. Некоторые примечания заключаются в том, что $ answer и $ guess изменится. '

Из-за обвинения в том, что я разместил дубликат, предлагается предлагать длину слова; Я прошу, сколько букв в 2 строках одинаково. Например, «Stackoverflow» и «stkflw». хотел бы что-то подсчитать, сколько букв в «stkflw» равно буквам в «Stackoverflow». Мне нужно, чтобы он подсчитал все буквы в одном слове, например, «Тест» должен возвращать 4, потому что он имеет 4 буквы (ответ имеет тот, который возвращает 3 с тестом, который нежелателен)

Если это можно сделать в bash, это было бы здорово! 🙂

 answer=spaghetti guess=aeghipstt # find the individual letters in the answer # use an associative array to manage duplicates declare -A letters=() for ((i=0; i < ${#answer}; i++)); do letters[${answer:i:1}]=1 done # remove duplicate letters in the guess. # could use the above technique, but here's another one guess_uniq=$( sed 's/./&\n/g' <<< "$guess" | sort -u | tr -d '\n' ) # loop over the unique letters of the guess, # and count how many letters are in the answer matches=0 for ((i=0; i < ${#guess_uniq}; i++)); do [[ ${letters[${guess_uniq:i:1}]} = "1" ]] && (( matches++ )) done if (( matches == ${#guess_uniq} )); then echo "Correct"; fi 

В Perl оператор транслитерации tr// (который очень похож на утилиту tr shell) возвращает количество символов, транслитерированных.

 $ perl -e 'print("spgheti" =~ tr/spaghetti/spaghetti/, "\n")' 7 

Т.е. «семь символов в spgheti встречаются в spaghetti ».

 $ perl -e 'print("spaghetti" =~ tr/spgheti/spgheti/, "\n")' 8 

Т.е. «восемь символов в spaghetti встречаются в spgheti » (так как t происходит дважды в spaghetti , это считается дважды).

Помещение вокруг него:

 while read word1 word2; do perl -e 'printf("%s / %s: %d\n", $ARGV[0], $ARGV[1], eval "$ARGV[0] =~ tr/$ARGV[1]/$ARGV[1]/")' "$word1" "$word2" done <<LIST_END stkflw Stackoverflow fete feet good goodness par rap LIST_END 

Вызов Perl eval() необходим для возможности вставить $ARGV[1] в список поиска и замены tr// .

Вывод:

 stkflw / Stackoverflow: 5 fete / feet: 4 good / goodness: 4 par / rap: 3 

Или, чтение из файла с двумя словами в каждой строке:

 while read word1 word2; do # as before done <wordpairs 

Вот как это сделать в bash.

 # ---------------------------------------------------------------------------- # INPUT: # $1 answer (contains the "source" string) # $2 guess (contains individual characters to be counted from $answer) # # OUTPUT: # prints to standard output a count of the characters from 'guess' which # appear in 'answer' # ---------------------------------------------------------------------------- answer=$1 guess=$2 count=0 # for each character in $guess, observe whether its elimination from # $answer causes the resultant string to be different; if so, it exists, # therefore increment a counter # iterate over the characters of $guess for (( i=0; i < ${#guess}; i=i+1 )); do current_char=${guess:$i:1} # attempt to extract current character answer_after_extract=${answer//$current_char} # has $answer changed? if [[ $answer_after_extract != $answer ]]; then count=$(( count + 1 )) fi answer=$answer_after_extract done echo $count 

ВЫХОД ОБРАЗЦА

 $ ./answer spaghetti spgheti 7 $ ./answer abcdefghijklmnopqrstuvwxyz aeiou 5 $ ./answer abcdefghijklmnopqrstuvwxyz xyzzy 3