Tr: 17 13 znaków
(Lub 14 10, jeśli policzysz tylko argumenty ...)
tr -s ta-s -1
Przykładowy przebieg:
bash-4.3$ tr -s ta-s -1 <<< heads
1
bash-4.3$ tr -s ta-s -1 <<< tails
-1
Krótkie wyjaśnienie:
tr oznacza transliterację, co oznacza, że zastępuje każdy znak danych wejściowych znalezionych w pierwszym argumencie znakiem w tej samej pozycji w drugim argumencie:
tr ta -1 <<< tails # replaces t ⇢ -, a → 1
⇒ -1ils
Jeśli pierwszy argument jest dłuższy, znaki bez dopasowania pozycyjnego w drugim argumencie są zastępowane ostatnim znakiem drugiego argumentu:
tr tals -1 <<< tails # replaces t ⇢ -, a → 1, l → 1, s → 1
⇒ -1i11
Gdy używana jest opcja -s( --squeeze-repeats), kolejne znaki, które zostałyby zastąpione tym samym znakiem, są zastępowane jednocześnie:
tr -s tals -1 <<< tails # replaces t ⇢ -, a → 1, l+s → 1
⇒ -1i1
Jeśli więc wymienimy wszystkie znaki w „ogonach”, otrzymamy to, czego potrzebujemy:
tr -s tails -1 <<< tails # replaces t ⇢ -, a+i+l+s → 1
⇒ -1
To samo dotyczy „głów”, ale musimy zachować „t” z przodu, aby zużyć minus (znaki posortowane alfabetycznie pod kątem przerażenia):
tr -s taedhs -1 <<< heads # replaces h+e+a+d+s → 1
⇒ 1
Scalenie wszystkich unikalnych znaków „ogonów” i „głów” w jednym pierwszym argumencie, trzymając „t” przed sobą, prowadzi do ostatecznego rozwiązania:
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
Aby uniknąć wyliczania postaci, w odstępie od - do formatu może być stosowany zamiast.