Tr: 17 13 caracteres
(O 14 10 si solo cuenta los argumentos ...)
tr -s ta-s -1
Ejecución de muestra:
bash-4.3$ tr -s ta-s -1 <<< heads
1
bash-4.3$ tr -s ta-s -1 <<< tails
-1
Breve explicacion:
tr
significa transliterar, es decir, reemplaza cada carácter de la entrada que se encuentra en el primer argumento con un carácter en la misma posición en el segundo argumento:
tr ta -1 <<< tails # replaces t ⇢ -, a → 1
⇒ -1ils
Si el primer argumento es más largo, los caracteres sin coincidencia posicional en el segundo argumento se reemplazan con el último carácter del segundo argumento:
tr tals -1 <<< tails # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11
Cuando se usa la opción -s
( --squeeze-repeats
), los caracteres sucesivos que se reemplazarían con el mismo carácter se reemplazan a la vez:
tr -s tals -1 <<< tails # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1
Entonces, si enumeramos todos los caracteres en “colas”, obtenemos lo que necesitamos:
tr -s tails -1 <<< tails # replaces t ⇢ -, a+i+l+s → 1
⇒ -1
Lo mismo para "cabezas", pero es necesario mantener la "t" al frente para consumir el signo menos (caracteres ordenados alfabéticamente por escalofriante)
tr -s taedhs -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
Fusionar todos los caracteres únicos de "colas" y "cabezas" en un solo primer argumento, manteniendo "t" al frente conduce a la solución 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 los caracteres, se puede utilizar un intervalo en formato desde - hasta .