Caracteres restantes depois de comparar duas strings

3

Atualmente estou escrevendo um jogo no bash que irá comparar a entrada do usuário contra a entrada do computador.

Eu quero encontrar os personagens restantes depois de uma comparação entre duas strings. Abaixo está o que tenho em mente:

user_word='hello' 

computer_word='bxolq' 

compare  ${user_word} ${computer_word} 

compare function: (finds "l" to be equal in the two strings)

calculate leftover word for user (= "heo") 

calculate leftover word for computer (= "bxoq")

Agora, o computador ganha porque "bxoq" length é 4 e o usuário leftover "heo" é 3.

Eu tentei diff para resolver o problema, mas a saída de

diff <(echo ${user_word} | sed 's:\(.\):\n:g' | sort) <(echo ${computer_word} | sed 's:\(.\):\n:g' | sort)

me confunde.

Então, minha pergunta é: como posso realizar a comparação que sobrou?

    
por kzpm 31.12.2016 / 14:54

1 resposta

0

Supondo que você queira eliminar todos os caracteres que são os mesmos nas duas strings, você pode fazer isso em duas chamadas para sed :

#!/bin/sh

player1_word='hello'
player2_word='bxolq'

player1_short=$( printf '%s\n' "$player1_word" | sed "s/[$player2_word]//g" )
player2_short=$( printf '%s\n' "$player2_word" | sed "s/[$player1_word]//g" )

if   [ "${#player1_short}" -gt "${#player2_short}" ]; then
    printf 'Player1 wins with "%s" ("%s") over "%s" ("%s")\n' \
        "$player1_word" "$player1_short" \
        "$player2_word" "$player2_short"
elif [ "${#player2_short}" -gt "${#player1_short}" ]; then
    printf 'Player2 wins with "%s" ("%s") over "%s" ("%s")\n' \
        "$player2_word" "$player2_short" \
        "$player1_word" "$player1_short"
else
    printf 'It is a draw between "%s" ("%s") and "%s" ("%s")\n' \
        "$player1_word" "$player1_short" \
        "$player2_word" "$player2_short"
fi

A principal parte operacional deste script é

player1_short=$( printf '%s\n' "$player1_word" | sed "s/[$player2_word]//g" )
player2_short=$( printf '%s\n' "$player2_word" | sed "s/[$player1_word]//g" )

que define as duas variáveis _short com o valor de cada variável _word com as letras da outra variável _word removida. Isso é feito usando uma das palavras em uma expressão entre colchetes ( [...] ) e fazendo uma substituição global sobre a outra palavra que remove cada caractere que corresponda a qualquer caractere na expressão [...] .

Teste:

$ sh ./script.sh
Player2 wins with "bxolq" ("bxq") over "hello" ("he")
    
por 04.09.2018 / 14:04