/* Microsoft SQL Server 2005 */ /* By the way, it is just VHVyaW5nIG1hY2hpbmU= :-) */ /* by David Srbecky */ WITH SubQuery(t, s, a, b) AS ( SELECT 0, 's', CAST ('<' AS VARCHAR(8000)), CAST ('110110' AS VARCHAR(8000)) UNION ALL SELECT t + 1, newS, CASE mv WHEN 'l' THEN SubString(curr.a, 1, Len(curr.a) - 1) WHEN 's' THEN SubString(curr.a, 1, Len(curr.a) - 1) + newZ WHEN 'r' THEN SubString(curr.a, 1, Len(curr.a) - 1) + newZ + Left(b + '_', 1) ELSE '?' END, CASE mv WHEN 'l' THEN newZ + b WHEN 's' THEN b WHEN 'r' THEN SubString(b, 2, ((Len(b)-1)+Abs(Len(b)-1))/2) ELSE '?' END FROM SubQuery AS curr, ( SELECT 's', '<', '1', '<', 'r' UNION ALL SELECT '1', '1', '1', '1', 'r' UNION ALL /* find 0 */ SELECT '1', '_', 'a', '0', 's' UNION ALL SELECT '1', '0', '2', '0', 's' UNION ALL SELECT '2', '0', '2', '0', 'r' UNION ALL /* find 1; left */ SELECT '2', '_', 'a', '_', 's' UNION ALL SELECT '2', '1', '3', '1', 'l' UNION ALL SELECT '3', '0', '4', '1', 's' UNION ALL /* 0 -> 1 */ SELECT '4', '1', '4', '1', 'r' UNION ALL /* find 0 or _; left */ SELECT '4', '_', '5', '_', 'l' UNION ALL SELECT '4', '0', '5', '0', 'l' UNION ALL SELECT '5', '1', '6', '0', 's' UNION ALL /* 1 -> 0 */ SELECT '6', '1', '6', '1', 'l' UNION ALL /* rewind */ SELECT '6', '0', '6', '0', 'l' UNION ALL SELECT '6', '<', 's', '<', 's' /* restart */ ) AS prog(currS, currZ, newS, newZ, mv) WHERE curr.s = currS AND Right(curr.a, 1) = currZ ) SELECT CharIndex('0', a + b) - 2 FROM SubQuery WHERE s = 'a' OPTION (MAXRECURSION 0); /* SELECT t, s, a + '.' + b FROM SubQuery OPTION (MAXRECURSION 0); */