Это обратная сторона Давайте сделаем некоторые "deciph4r4ng"
В этой задаче ваша задача - зашифровать строку. К счастью, алгоритм довольно прост: при чтении слева направо каждый типичный символ записи (диапазон ASCII 32-126) должен быть заменен числом N (0-9), чтобы указать, что оно совпадает с символом N + 1. позиции перед ним. Исключение составляют случаи, когда символ не появляется в предыдущих 10 позициях в исходной строке. В этом случае вы должны просто напечатать символ снова. По сути, вы должны иметь возможность отменить операцию от первоначального вызова.
пример
Входная строка "Programming"
будет закодирована следующим образом:
Следовательно, ожидаемый результат равен "Prog2am0in6"
.
Разъяснения и правила
- Входная строка будет содержать только символы ASCII в диапазоне от 32 до 126. Вы можете предположить, что он никогда не будет пустым.
- Оригинальная строка гарантированно не содержит никаких цифр.
- После того, как символ был закодирован, на него может в свою очередь ссылаться следующая цифра. Например,
"alpaca"
должно быть закодировано как"alp2c1"
. - Ссылки никогда не будут обтекать строку: на них могут ссылаться только предыдущие символы.
- Вы можете написать либо полную программу, либо функцию, которая либо печатает, либо выводит результат.
- Это код гольф, поэтому выигрывает самый короткий ответ в байтах.
- Стандартные лазейки запрещены.
Контрольные примеры
Input : abcd
Output: abcd
Input : aaaa
Output: a000
Input : banana
Output: ban111
Input : Hello World!
Output: Hel0o W2r5d!
Input : this is a test
Output: this 222a19e52
Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u
Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf
Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Ответы:
05AB1E ,
20 1918 байт-2 Спасибо Эмигне
Попробуйте онлайн!
источник
)¹vDyåiDykëy}?y¸ìT£
работает также.õIvDyåiDykëy}?yìT£
за 18 :)Сетчатка ,
2423 байтаПопробуйте онлайн!
Довольно простая замена регулярных выражений. Мы подбираем каждый символ и пытаемся найти его копию за 0-9 символов до него. Если мы его найдем, мы заменим символ на количество символов, которое нам нужно было сопоставить, чтобы получить копию.
Результаты не совсем соответствуют тестовым примерам, поскольку в этом случае используется наименьшая возможная цифра, а не наименьшая.
источник
JavaScript (ES6),
745754 байтаСохранено 3 байта благодаря продуктам ETH с бриллиантом
p=/./g
вместоp={}
(вдохновленный Нилом)Контрольные примеры
Показать фрагмент кода
источник
s
вместоp
?find
версию, используяlastIndexOf
, что немного удивительно, учитывая, что длина его 11 букв ....)s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)
чтобы сэкономить 3 байта.Haskell ,
7266 байтСпасибо Лайкони за игру в гольф 6 байтов!
Попробуйте онлайн!
Функция
%
сохраняет частично обработанную строку в обратном порядке во втором аргументе, поэтому она может искать в первых 10 элементах этой строки совпадения исследуемого символа. Представление состоит из безымянной функции,(%"")
которая вызывает предыдущую функцию с пустой строкой в качестве второго аргумента.источник
f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])
сохраняет два байта.f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]
экономит еще больше.reverse
сохраняет еще один байт: попробуйте онлайн!Python 2 , 64 байта
Попробуйте онлайн!
источник
~10
нельзя просто использовать-11
?Perl 5 , 36 байт
35 байт кода +
-p
флаг.Попробуйте онлайн!
Некоторые объяснения:
Цель состоит в том, чтобы заменить нецифровый символ (
\D
но он соответствует обратной ссылке\1
в моем регулярном выражении), которому предшествует менее 10 символов (.{0,9}
) и тот же символ ((\D)
...\1
) длиной.{0,9}
группы (length$2
). Иredo
пока персонажи заменяются.источник
.*
не требуется, любой действительный символ в диапазоне до замены цифры в порядке.Python 2,
8984 байтаПопробуйте онлайн!
Перебирает всю строку в обратном порядке и создает новую строку с вставленными правильными числами.
источник
Japt , 18 байт
Попробуйте онлайн!
объяснение
источник
JavaScript,
10080 байтПопробуйте онлайн!
источник
05AB1E , 20 байтов
Попробуйте онлайн!
объяснение
источник
Python 3,
125118 байтПопробуйте онлайн!
источник
C (tcc) , 113 байтов
Поскольку функция создает копию входной строки, максимальный размер ввода составляет 98 символов (более чем достаточно, чтобы поместиться в самый длинный тестовый ввод). Конечно, это можно изменить на любое другое значение.
Попробуйте онлайн!
редактировать
-15 байт. Спасибо Йохан дю Туа .
источник
i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Java 7,
102101 байтПопробуйте онлайн!
-1 байт благодаря Кевину Круйссену . Мне всегда нравится предлог, чтобы использовать оператор go-to.
источник
--c>=0
? Вы можете заменить его,c-->0
чтобы сохранить байт.MATL,
3130 байтПопробуйте это в MATL Online!
объяснение
источник
this is a test
даетthis 222a1te52
вместоthis 222a19e52
. Второйt
не конвертируется в9
.PHP, 104 байта
прямое решение
Обратные решения
Онлайн версии
PHP, 111 байт
PHP, 112 байт
Онлайн версия
источник
REXX,
124125 байтисточник
s<9
вместоs<10
илиs<=9
. Вводthis is a test
даетthis 222a1te52
вместоthis 222a19e52
. Второйt
не конвертируется в9
. Попробуйте онлайнC (gcc) ,
117103 байтаПопробуйте онлайн!
103 байта без string.h импорта, работает с предупреждением. Если это противоречит правилам, я вытащу это
Симпатичный код:
Редактирование:
источник
(i=strlen(s);s[--i];)
вместо(i=strlen(s)-1;s[i];i--)