Tr: 17 13 caracteres
(Ou 14 10 se você contar apenas os argumentos…)
tr -s ta-s -1
Exemplo de execução:
bash-4.3$ tr -s ta-s -1 <<< heads
1
bash-4.3$ tr -s ta-s -1 <<< tails
-1
Breve explicação:
tr
significa transliterado, ou seja, substitui cada caractere da entrada encontrada no primeiro argumento por caractere na mesma posição no segundo argumento:
tr ta -1 <<< tails # replaces t ⇢ -, a → 1
⇒ -1ils
Se o primeiro argumento for mais longo, os caracteres sem correspondência posicional no segundo argumento serão substituídos pelo último caractere do segundo argumento:
tr tals -1 <<< tails # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11
Quando a opção -s
( --squeeze-repeats
) é usada, caracteres sucessivos que seriam substituídos pelo mesmo caractere são substituídos de uma só vez:
tr -s tals -1 <<< tails # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1
Portanto, se enumerarmos todos os caracteres em "caudas", obtemos o que precisamos:
tr -s tails -1 <<< tails # replaces t ⇢ -, a+i+l+s → 1
⇒ -1
O mesmo para “cabeças”, mas precisamos manter o “t” na frente para consumir o sinal de menos (caracteres classificados em ordem alfabética por fluidez):
tr -s taedhs -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
Mesclar todos os caracteres únicos de "caudas" e "cabeças" em um único primeiro argumento, mantendo "t" na frente leva à solução final:
tr -s tadehils -1 <<< tails # replaces t → -, a+i+l+s → 1
⇒ -1
tr -s tadehils -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
Para evitar enumerar os caracteres, um intervalo de - para o formato pode ser usado.