Тр: 17 13 символов
(Или 14 10 если считать только аргументы ...)
tr -s ta-s -1
Образец прогона:
bash-4.3$ tr -s ta-s -1 <<< heads
1
bash-4.3$ tr -s ta-s -1 <<< tails
-1
Краткое объяснение:
tr
расшифровывается как транслитерация, то есть заменяет каждый символ ввода, найденного в первом аргументе, символом в той же позиции, что и во втором аргументе:
tr ta -1 <<< tails # replaces t ⇢ -, a → 1
⇒ -1ils
Если первый аргумент длиннее, символы без позиционного соответствия во втором аргументе заменяются последним символом второго аргумента:
tr tals -1 <<< tails # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11
Когда используется опция -s
( --squeeze-repeats
), последовательные символы, которые будут заменены одним и тем же символом, заменяются сразу:
tr -s tals -1 <<< tails # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1
Поэтому, если мы перечислим все символы в «хвостах», мы получим то, что нам нужно:
tr -s tails -1 <<< tails # replaces t ⇢ -, a+i+l+s → 1
⇒ -1
То же самое для «голов», но нам нужно держать «t» впереди, чтобы использовать минус (символы отсортированы в алфавитном порядке для удобства):
tr -s taedhs -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
Объединение всех уникальных символов «хвостов» и «голов» в один первый аргумент, сохранение «t» впереди приводит к окончательному решению:
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
Чтобы избежать перечисления символов, вместо этого можно использовать интервал от - до формата.