T-SQL, 216 байт
За последние пару ночей я потратил довольно много времени на тщательное создание математической функции последовательности, которая бы правильно округлялась, чтобы генерировать правильные коды ASCII для чисел из алфавитных кодов ASCII. У него было смешное количество десятичных разрядов в коэффициентах, но это работало.
Тем не менее, рациональный подход mattnewport работает и в SQL, при гораздо меньших затратах в байтах, поэтому я бесстыдно отказываюсь от собственной математики в пользу его. Пойди проголосуй за него, это элегантное решение!
Вот мой:
DECLARE @p VARCHAR(MAX)='';WITH t AS(SELECT ASCII(LEFT(@s,1))c,2 i UNION ALL SELECT ASCII(SUBSTRING(@s,i,1)),i+1FROM t WHERE i<=LEN(@s))SELECT @p=@p+CHAR(CASE WHEN c>96THEN 20-c/122+5*c/16 ELSE c END)FROM t;SELECT @p
При этом используется рекурсивный CTE для создания импровизированной стопки символов в телефонном номере и преобразования букв на лету, а затем немного хитрости SQL (SELECT @ p = @ p + columnValue) для перекомпоновки строки из CTE без необходимости другая рекурсивная конструкция.
Выход:
DECLARE @s VARCHAR(MAX)='1-800-abcdefghijklmnopqrstuvwxyz'
--above code runs here
1-800-22233344455566677778889999