A Little Compression Between the Knots
Nobody wants a tatting pattern that says “double stitch, double stitch, double stitch, double stitch” every time four stitches are needed. Your hands have enough to manage: forming the two halves, transferring the knot, keeping the core thread free to slide. The instructions should get out of the way.
That makes shuttle tatting a lovely introduction to run-length encoding: replace consecutive identical symbols with a symbol and a count. It was a familiar compression technique in the 1980s world of bitmap graphics, where long stretches of one colour could become pleasantly small records.
For our tiny pattern vocabulary, D means one completed double stitch and P means an instruction to make a picot. These are symbols on paper, not a simulation of thread movement. Start with DDDDPDDDDPDDDD, and Clojure gives us:
(require '[clojure.string :as str])
(let [pattern "DDDDPDDDDPDDDD"
runs (partition-by identity pattern)
encoded (map (fn [run]
(str (first run) (count run))) runs)]
(println (str/join " " encoded)))
The result is D4 P1 D4 P1 D4: four double stitches, a picot, four more, another picot, and four to finish this fragment. Clojure groups adjacent equal symbols; each group becomes one counted instruction.
Ada walks the same thread with two indices. One marks the beginning of a run; the other advances until the symbol changes or the string ends. Save this as main.adb:
with Ada.Text_IO; with Ada.Integer_Text_IO;
procedure Main is
S : constant String := "DDDDPDDDDPDDDD";
I : Positive := S'First;
J : Natural;
begin
while I <= S'Last loop
J := I;
while J <= S'Last and then S(J) = S(I) loop J := J + 1; end loop;
Ada.Text_IO.Put(S(I));
Ada.Integer_Text_IO.Put(J - I, Width => 0);
Ada.Text_IO.Put(" "); I := J;
end loop;
Ada.Text_IO.New_Line;
end Main;
Ada’s and then matters: it checks the boundary before reading the next character. Both versions scan the input in linear time.
There is a catch tucked between the knots. DPDP becomes D1 P1 D1 P1, which takes more space. Repetition earns the saving; alternation spends it. And neither representation records picot size or thread tension. Compression preserves the symbols we supplied, while good tatting still asks the hands to supply the judgement.