Тр: 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
Те ж саме для "head", але wee потрібно тримати "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
Щоб уникнути перерахування символів, натомість можна використовувати інтервал у форматі від - до .