같은 글자가 포함된 단어가 몇 개인지 확인하세요.

같은 글자가 포함된 단어가 몇 개인지 확인하세요.

2개의 문자열이 있습니다.

answer="spaghetti"
guess="spgheti"

$guess와 동일한 $answer의 문자 수를 세는 방법이 있는지 궁금합니다. 이 경우 숫자 7을 얻어야 합니다. 일부 참고 사항은 $answer 및 $guess가 변경된다는 것입니다.

누군가 중복된 콘텐츠를 게시했다고 비난했기 때문에 나는 두 문자열의 문자 수에 대해 물어볼 것을 제안했습니다. 예를 들어 "Stackoverflow" 및 "stkflw"입니다. "stkflw"의 문자가 "Stackoverflow"의 문자와 동일한 수를 계산하고 싶습니다. 단어의 모든 글자를 세는 데 필요합니다. 예를 들어 "Test"는 글자가 4개이므로 4를 반환해야 합니다(답변 중 하나는 테스트에서 3을 반환하므로 권장되지 않습니다).

bash에서 이 작업을 수행할 수 있다면 좋을 것입니다! :)

답변1

Perl에서 음역 연산자 tr//(셸 유틸리티와 매우 유사하게 작동 tr)는 음역된 문자 수를 반환합니다.

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

spgheti즉, "in"에는 7개의 문자가 발견되었습니다 spaghetti.

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

spaghetti즉, "8개의 문자가 발견되었습니다 spgheti"( t에서는 2번 나타나므로 spaghetti2번으로 계산됩니다).

주위에 루프를 넣으십시오.

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

답변2

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

답변3

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

관련 정보