В этом задании ваша задача - расшифровать строку. К счастью, алгоритм довольно прост: при чтении слева направо каждая встречающаяся цифра N (от 0 до 9) должна быть заменена символом, который находится на N + 1 позиции перед ним.
пример
Входная строка "Prog2am0in6"
будет декодирована следующим образом:
Следовательно, ожидаемый результат равен "Programming"
.
Разъяснения и правила
- Входная строка будет содержать только символы ASCII в диапазоне от 32 до 126. Вы можете предположить, что он никогда не будет пустым.
- Оригинальная расшифрованная строка гарантированно не содержит никаких цифр.
- После того, как символ был декодирован, на него, в свою очередь, может ссылаться следующая цифра. Например,
"alp2c1"
должен быть расшифрован как"alpaca"
. - Ссылки никогда не будут обтекать строку: на них могут ссылаться только предыдущие символы.
- Вы можете написать либо полную программу, либо функцию, которая либо печатает, либо выводит результат.
- Это код гольф, поэтому выигрывает самый короткий ответ в байтах.
- Стандартные лазейки запрещены.
Контрольные примеры
Input : abcd
Output: abcd
Input : a000
Output: aaaa
Input : ban111
Output: banana
Input : Hel0o W2r5d!
Output: Hello World!
Input : this 222a19e52
Output: this is a test
Input : golfin5 3s24o0d4f3r3y3u
Output: golfing is good for you
Input : Prog2am0in6 Puz0les7&1Cod74G4lf
Output: Programming Puzzles & Code Golf
Input : Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Output: Replicants are like any other machine. They're either a benefit or a hazard.
1bbab
ли действительный вход (с ожидаемым результатомabbab
)? Другими словами, могут ли ссылки обернуться вокруг строки?1bbab
не действует. Я добавил разъяснение по этому поводу.Ответы:
Желе ,
97 байтПопробуйте онлайн!
Как это устроено
источник
Java 7,
8180 байтПопробуйте онлайн!
Сохранено 1 байт благодаря Андерсу Торнбладу . Первый символ не может быть цифрой, поэтому его не нужно проверять, что означает, что мы можем предварительно добавить его перед проверкой нашего условия завершения.
источник
for(int i=0;++i<a.length;){
вместо этого, сохраняя один символ.Haskell, 55 байтов
Пример использования:
reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"
->"Programming Puzzles & Code Golf"
. Попробуйте онлайн!Сократите строку до обратной ее копии с номерами, замененными соответствующими символами. «обратный», потому что таким образом у нас есть легкий доступ к строке до сих пор при индексации чисел. Переверни это снова.
источник
C, 46 байтов
Попробуйте онлайн!
C
524948 байтовСпасибо @ l4m2 за сохранение байта!
Редактирует входную строку напрямую.
Попробуйте онлайн!
Альтернативная 50-байтовая версия:
Рекурсивная версия, 48 байт:
источник
05AB1E , 11 байт
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6),
5953 байтаСохранено 7 байт благодаря функции fəˈnɛtɪk.
источник
o-m-1
можно заменить наo+~m
.f=
часть, поэтому это 54 байта, а не 52.Сетчатка , 37 байт
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Замените каждую цифру d на d
«
s, а затем одну»
. Нам нужно, чтобы последний a) был в состоянии распознать позиции, где d = 0 и b) в качестве разделителя между соседними цифрами.Повторно (
+
) сопоставьте регулярное выражение в первой строке справа налево (r
), а затем замените самый левый метод match (1
) заменой во второй строке.Само регулярное выражение соответствует одной из наших теперь унарных цифр и подсчитывает количество
«
s в группе 2. Затем средство просмотра сравнивает d символов с,(?<-2>.)*
прежде чем захватить ссылочный символ в группе 1. Строка«
s и»
затем заменяется захваченным символом. ,источник
MATL ,
21191716 байтПопробуйте это в MATL Online!
объяснение
источник
$y
в новой версии!U
работало только для цифр. К сожалению,'e'U
даетexp(1)
иначе, я мог бы избавиться от4Y2
вещейJavaScript (ES6), 51 байт
a
используется для хранения замененных цифр для работы с цифрами, относящимися к другим цифрам.источник
Perl 5 , 34 байта
33 байта кода +
-p
флаг.Попробуйте онлайн!
s/\d/.../e
замените первую цифру...
оцененным как код Perl. (с...
будучиsubstr$_,-$&-1+pos,1
в этом случае.substr$_,-$&-1+pos,1
Возвращает подстроку$_
длины1
в индексе-$&-1+pos
, где$&
это число как раз соответствует, иpos
является показателем начала матча. Нам просто нужно ,redo
если заменить был успешным для того , чтобы заменить каждую цифру. (и результат неявно печатается благодаря-p
флажку).Старый подход, 47 байтов:
44 байта кода +
-F
флаг.Попробуйте онлайн!
На самом деле довольно прямо.
-F
Флаг разбивает входные данные каждого символа на@F
.map{...}@F
перебирает@F
(т. е. каждый символ ввода). Если символ если цифра (/\d/
), то мы заменим его на символ в индексе$i-$_-1
. Это$i
текущая индексная переменная (которую мы поддерживаем, увеличивая каждый видимый символ).источник
JavaScript ES6,
6159 байтСпасибо @Luke за 8 байтов
Попробуйте онлайн!
источник
x.split``
также может быть[...x]
,[0-9]
может быть\d
, вместе экономить 6Bx=>[...x].map((p,i,a)=>+p+1?a[i-1-p]:p).join``
для 46 байтовx=>[...x].map((p,i,a)=>a[i]=1+p>9?a[i-1-p]:p).join``
05AB1E ,
2717 байтПопробуйте онлайн!
источник
CJam, 13 байтов
Демо онлайн.
Это решение использует встроенный в CJam оператор «копирование n-го элемента в стеке»
$
для реализации декодирования. Он начинается с чтения входных данных (с помощьюq
), а затем циклически перебирает символы из входной строки и сбрасывает их в стек (с помощью{}/
). Тем не менее, внутри тела цикла он также дублирует каждый символ после того, как он был помещен в стек (с_
), и проверяет, является ли это цифрой, просматривая свою позицию#
в строке"0123456789"
, удобно обозначаемой какA,s
.Результатом этого поиска является либо числовое значение цифры, либо, если символ не является цифрой, -1. Затем
)
оператор увеличивает это значение на единицу и$
заменяет его текущим символом во многих позициях под вершиной стека. Наконец,\;
просто удаляет копию текущего входного символа, который мы сделали_
из стека, так как он больше не нужен.источник
Befunge-98 ,
4543 байтаПопробуйте онлайн!
Идея:
Я не смог получить эту версию короче, но эта составляет 44 байта:
Думаю, что я поделюсь этим из-за аккуратного трюка с
s
- но хранение счетчика в стеке приведет к улучшению этого 1 символаисточник
Python 2 , 59 байт
Попробуйте онлайн!
источник
Python 2,
7571 байтПопробуйте онлайн!
Редактировать: Исправлено для значений ASCII между 32-47 ; Исправлено для двойного декодирования (например, от "alp2c1" до "альпака")
источник
'Prog2am0in6 Puz0les7&1Cod74G4lf'
вашей программы печатаетProgramming Puzzles &7Code1Golf
! Я пытался с обеими ссылками TIO поделился!PHP 7,1
6759 байтПринимает участие от STDIN; запустить как трубу с
-nR
или попробуйте онлайн ._&$c=$s[$i++]
цикл через строку (_&$c
приведет к чему-то, что не является"0"
; поэтому единственный символ, который может разорвать цикл, это пустая строка = конец ввода)$c^"0"
переключать биты 5 и 6 в коде ascii<"\n"
проверить, если результат <chr (10)Спасибо @Christoph за сохранение 12%
источник
$s=$argn
...?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Vim макро / нажатия клавиш, 49 байтов
^M
представляет возвращаемый символ (0x0A, 1 байт).объяснение
источник
APL (Dyalog Classic) ,
2523 байта-2 байта благодаря @FrownyFrog
Попробуйте онлайн!
использования
⎕io←1
(
⍵
ниже обозначено промежуточное значение в оценке)⎕d
это строка'0123456789'
⎕d⍳⍵
находит (в данном случае на основе 1) индексы⍵
символов в⎕d
; для нецифрового индекса - 1111|⍵
по модулю - 11 становятся 0≢⍵
длина⍵
⍳≢⍵
это1 2 ...
до≢⍵
так,
(⍳≢⍵)-11|⎕d⍳⍵
дает нам вектор i индексов, куда мы должны смотреть, чтобы получить результирующие символы; однако некоторые из этих индексов могут перенаправлять на другие (меньшие) индексы. Чтобы вычислить транзитивное замыкание (т.е. эффективные индексы), мы индексируем вектор в себя (⊂⌷⊢
поезд, эквивалентный(⊂i)⌷i
илиi[i]
) и повторяем это до тех пор, пока он не стабилизируется (⍣≡
известный как оператор с фиксированной точкой ).наконец мы индексируем в исходную строку:
(...)⊃¨⊂
источник
Python 2 ,
8380 байтПопробуйте онлайн!
источник
Japt , 24 байта
Попробуйте онлайн!
Объяснение:
источник
Рубин,
5646 байтПопробуйте онлайн!
источник
Python 2 , 58 байт
По сути, это порт моего ответа Jelly, а также проверка цифр из ответа Python @ xnor.
Попробуйте онлайн!
источник
Röda , 51 байт
Попробуйте онлайн!
источник
JavaScript ES6, 54 байта
источник
f=
.> <> (Рыба), 108 байт (= сетка 9 x 12)
Попробуйте здесь, чтобы увидеть, как рыба плавает вокруг.
источник
8086 машинный код, 35 байт
источник
ОК, 39 байт
Попробуйте онлайн!
источник
Japt v2.0a0, 16 байт
Попробуй
объяснение
источник
J , 20 байт
Попробуйте онлайн
Благодарю ngn за вдохновение.
22 байта
Это порт ответа желе.
В обоих решениях версия, используемая TIO, интерпретирует единичное
.
число как число 0, поэтому последний тест не пройден. Старые версии (≤7), кажется, работают правильно.Попробуйте онлайн!
источник