Veja quantas palavras possuem as mesmas letras

1

Eu tenho 2 strings:

answer="spaghetti"
guess="spgheti"

Eu gostaria de saber se havia alguma maneira de contar a quantidade de letras em $ answer que são as mesmas que $ guess, neste caso eu deveria ter o número 7. Algumas notas são $ answer e $ guess vão mudar. '

Por causa da acusação de que eu postei uma duplicata, o sugerido é pedir a extensão da palavra; Eu estou perguntando quantas letras em 2 strings são iguais. Por exemplo, "Stackoverflow" e "stkflw". Gostaria de algo para contar quantas letras em "stkflw" são iguais às letras em "Stackoverflow". Preciso que conte todas as letras de uma palavra, para um exemplo, "Teste" deve retornar 4 porque tem 4 letras (uma resposta tem uma que retorna 3 com teste que não é desejável)

Se isso pudesse ser feito no bash, seria ótimo! :)

    
por Lee Ikard 04.03.2017 / 04:38

3 respostas

1
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
    
por 04.03.2017 / 15:12
2

Em Perl, o operador de transliteração tr// (que funciona basicamente como o utilitário tr shell) retornará o número de caracteres que foram transliterados.

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

Ou seja. "sete caracteres em spgheti são encontrados em spaghetti ".

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

Ou seja. "oito caracteres em spaghetti são encontrados em spgheti " (como t ocorre duas vezes em spaghetti , é contado duas vezes).

Colocando um loop em torno dele:

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

A% Perl eval() exige que você insira $ARGV[1] na lista de pesquisa e substituição de tr// .

Saída:

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

Ou lendo um arquivo com duas palavras em cada linha:

while read word1 word2; do
  # as before
done <wordpairs
    
por 04.03.2017 / 09:41
2

Veja como fazer isso no 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

SAÍDA DE AMOSTRA

$ ./answer spaghetti spgheti
7

$ ./answer abcdefghijklmnopqrstuvwxyz aeiou
5

$ ./answer abcdefghijklmnopqrstuvwxyz xyzzy
3
    
por 04.03.2017 / 12:21